微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决带有 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 举报,一经查实,本站将立刻删除。