【发布时间】:2021-08-03 04:12:04
【问题描述】:
例如:
客户端
...
socket.connect(server_address)
data = some_message_less_than_100_bytes
socket.sendall(data)
...
服务器端
...
socket.accept()
socket.recv(1024)
...
服务器端是否保证接收到一个recv()的数据?
如果没有,使用标头指定消息长度的标准解决方案如何工作? 标头本身可能已被拆分,我们必须检查标头是否已正确接收。 还是标题是固定长度的?这样无论发送多少个数据,接收者都可以始终以相同的方式解释前几个字节?
其实我正在尝试做这样的事情
客户
while():
send()
recv()
服务器
recv()
while():
send() # Acknowledge to client
recv()
这是 ravi 在Linux socket: How to make send() wait for recv() 中建议的
但我发现了上面描述的问题。
ravi 的回答是否假设客户端和服务器都将接收对方在单个 recv() 中发送的内容?
更新
我很想发布图片,但由于声誉低,我不能发布...
以下链接是 HTTP 帧格式
https://datatracker.ietf.org/doc/html/rfc7540#section-4
它确实使用了固定长度的解决方案,因此无论标题分割多少块,它都可以以相同的方式工作。
所以我猜,某种“固定”长度是唯一的解决方案?即使标头大小本身是可变的,它也可能有一些承诺的位来指示标头的长度。我说的对吗?
【问题讨论】:
-
这一切都取决于你没有指定的套接字type。
-
哦,我是说tcp
-
@성진영 在您的更新中,HTTP/2 帧是描述可变长度有效负载的固定长度标头。您将读取 9 字节的标头,然后解释其前 3 个字节以确定有效负载的长度,然后读取指定的字节数。这只是标头+有效负载格式的一个示例。 FIXED-length headers 当然不是 TCP 的要求(即 HTTP 1.1 和更早的版本没有使用 Frames,他们使用 VARIABLE-length CRLF-delimited headers 代替)
-
感谢您的澄清。更新部分的最后一条语句呢?可变长度标头是否也使用一些固定位来指示标头的长度,就像固定标头如何帮助通知有效负载一样?
-
问题已解决。定界符可用于完全避免任何类型的固定位。所以要么是“承诺的职位”,要么是“承诺的角色”。
标签: sockets networking network-programming