带有 MSG_PEEK 标志的 HTTP 客户端 recv() 奇怪的行为

问题描述

我正在用 python 套接字编写一个 HTTP 客户端。

首先,我尝试仅读取足够的字节来获取标头,因此我可以提取内容长度。请注意,使用了 MSG_PEEK 标志,它不会从队列 (stated on this page).

peek = client.recv(4096,socket.MSG_PEEK).decode(FORMAT)
content_length = get_content_length() # parse headers and get Content-Length
response = client.recv(content_length).decode(FORMAT)

问题是,我没有收到所有数据(在我的例子中是一个 HTML 页面)。即使将缓冲区大小设置为 100.000 等高值,也没有任何区别。

但是,下面的代码确实可以一次检索所有内容。不同的是我这里没有使用 MSG_PEEK。

response = client.recv(100000).decode(FORMAT)

同样适用于阅读 transfer-encoding: Chunked。当我使用 MSG_PEEK 时,只接收到块的一部分。

这是正常行为吗?或者我应该在循环中调用 recv() 直到读取所有内容

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)