send()和recv()的奇怪行为

时间:2016-09-25 13:53:17

标签: python

对不良英语抱歉

为什么我在服务器上有两个 send() -s,在客户端上有两个 recv() -s,有时是第一个{ {1}}将从服务器获取第二个recv()的内容,而不会仅获取第一个的内容,并让另一个send()采取"到期且适当的&#34 ;其他recv()的内容?

如何以其他方式完成这项工作?

2 个答案:

答案 0 :(得分:1)

这是设计的。

TCP流是一个可以在两个端点之间发送字节的通道,但传输是基于流的,而不是基于消息的。

如果你想发送消息,那么你需要对它们进行编码......例如,通过预先设置" size"字段,它将告知接收者身体需要多少字节。

如果您发送100个字节,然后发送其他100个字节,那么接收器将在两个不同的读取命令中同时看到200,甚至50 + 150。如果您想要消息边界,那么您必须自己将它们放入数据中。

有一个允许发送消息的较低层(数据报),但它们的大小有限,并且无法保证交付(即消息可能会丢失,可能会重复或两个您发送的邮件将以不同的顺序到达)。 TCP流建立在此数据报服务之上,并实现在两个端点之间可靠传输数据所需的所有逻辑。

作为替代方案,有一些库旨在提供端点之间可靠的消息传递,例如ZeroMQ

答案 1 :(得分:0)

很可能你使用SOCK_STREAM类型套接字。这是一个TCP套接字,这意味着您将数据推送到一侧,并且它以相同的顺序从另一侧获取并且没有丢失块,但是没有分隔符。因此send()只发送数据,recv()接收当前可用的所有数据。

您可以使用SOCK_DGRAM然后使用UDP。但在这种情况下,每个send()都会发送一个数据报,recv()会收到它。但是你不能保证你的数据报不会被洗牌或丢失,所以你必须自己处理这些问题。最大数据报大小也有限制。

或者你可以坚持使用TCP连接但是你必须自己发送分隔符。