多次发送,单次recv

时间:2014-03-09 05:33:34

标签: c unix

我对unix编程中send和recv的机制感到困惑: 如果我使用多个send来发送一些字符串到recv,然后使用recv,其中缓冲区足够大,有时候我会得到一个由send的所有字符串组成的整个字符串,但有时我只得到它们的一部分。为什么会有所不同?我该如何应对?

2 个答案:

答案 0 :(得分:2)

由于距离,时间和两者之间发生的事情。

假设您正在谈论tcp,根据不同的设置,您可能会在数据包发出之前执行5 send秒。 Tcp没有关于你的“字符串”的概念。它看到的只是一个字节流来来去去。

也许你的一半字符串到达​​一个数据包,你的recv在一次读取中获得这些字节。但是字符串的后半部分是在第二个数据包中丢失并被路由器中的某台机器重新传输或分段为2个数据包。你无从知晓。

因此,您构建应用程序以了解自己的消息边界,并相应地进行规划。仅对应用程序有意义的 消息必须由某些内容(例如换行符)分隔,或者以长度字节为前缀,指示消息中有多少字节。你需要重新获得这个字节数,并且可以使用完整的消息做一些有意义的事情。

答案 1 :(得分:0)

这完全取决于适合您的消息需要多少TCP数据包。因此,此处没有已定义的行为,您需要在代码中处理它,如本文所述:c++ posix sockets recv functionality