对不良英语抱歉
为什么我在服务器上有两个 send()
-s,在客户端上有两个 recv()
-s,有时是第一个{ {1}}将从服务器获取第二个recv()
的内容,而不会仅获取第一个的内容,并让另一个send()
采取"到期且适当的&#34 ;其他recv()
的内容?
如何以其他方式完成这项工作?
答案 0 :(得分:1)
这是设计的。
TCP流是一个可以在两个端点之间发送字节的通道,但传输是基于流的,而不是基于消息的。
如果你想发送消息,那么你需要对它们进行编码......例如,通过预先设置" size"字段,它将告知接收者身体需要多少字节。
如果您发送100个字节,然后发送其他100个字节,那么接收器将在两个不同的读取命令中同时看到200,甚至50 + 150。如果您想要消息边界,那么您必须自己将它们放入数据中。
有一个允许发送消息的较低层(数据报),但它们的大小有限,并且无法保证交付(即消息可能会丢失,可能会重复或两个您发送的邮件将以不同的顺序到达)。 TCP流建立在此数据报服务之上,并实现在两个端点之间可靠传输数据所需的所有逻辑。
作为替代方案,有一些库旨在提供端点之间可靠的消息传递,例如ZeroMQ。
答案 1 :(得分:0)
很可能你使用SOCK_STREAM类型套接字。这是一个TCP套接字,这意味着您将数据推送到一侧,并且它以相同的顺序从另一侧获取并且没有丢失块,但是没有分隔符。因此send()
只发送数据,recv()
接收当前可用的所有数据。
您可以使用SOCK_DGRAM然后使用UDP。但在这种情况下,每个send()
都会发送一个数据报,recv()
会收到它。但是你不能保证你的数据报不会被洗牌或丢失,所以你必须自己处理这些问题。最大数据报大小也有限制。
或者你可以坚持使用TCP连接但是你必须自己发送分隔符。