1

我有许多进程正在运行,通过套接字相互发送消息。其中,有两个进程,第一个向另一个发送 24 个字节(我确定是 24 个字节,因为我是从 sendto() 的返回值中获取的),但在接收方我只收到 16 个字节.

nRecvbytes = recvfrom(sock, recvbuf, recvlen, 0, addr, sa_len)

recvlen 是 24 字节,但 nRecvbytes 是 16 字节。而且这种情况并不稳定,因为我运行了很多次,这种情况有时会发生但有时不会。有谁知道为什么会发生这种情况?谢谢!

4

2 回答 2

3

常见的是接收到的字节小于发送函数中指定的长度或数据长度。

您需要多次调用接收,直到您获得所需的数据。数据包可以分解成多个数据包,这可能会导致这种情况。

于 2013-11-25T05:42:17.447 回答
0

请检查您用于接收功能的标志

您遇到的行为类似于使用 MSG_PEEK 标志时的情况。

MSG_PEEK, Leave received data in queue.

使用 MSG_WAITALL 标志,您可以将所有可用数据读取到缓冲区。

MSG_WAITALL, Attempt to fill the read buffer.

您可以在 http://pubs.opengroup.org/onlinepubs/009695399/functions/recv.html上找到更多详细信息

于 2017-04-04T16:38:01.567 回答