C 套接字接收的字节数少于发送的字节数

C 套接字接收的字节数少于发送的字节数,c,sockets,recv,sendto,C,Sockets,Recv,Sendto,我有很多进程在运行,通过套接字互相发送消息。其中有两个进程,第一个进程向另一个进程发送24个字节(我确定是24个字节,因为我是从sendto()的返回值获得的),但在接收方,我只收到16个字节 nRecvbytes = recvfrom(sock, recvbuf, recvlen, 0, addr, sa_len) recvlen为24字节,但nRecvbytes为16字节。这个案例并不稳定,因为我已经运行了很多次,这种情况有时会发生,但有时不会。有人知道为什么会这样吗? 谢谢 接收的字节小

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

nRecvbytes = recvfrom(sock, recvbuf, recvlen, 0, addr, sa_len)
recvlen为24字节,但nRecvbytes为16字节。这个案例并不稳定,因为我已经运行了很多次,这种情况有时会发生,但有时不会。有人知道为什么会这样吗?
谢谢

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


您需要多次呼叫receive,直到获得所需的数据。这些数据包可以分解为多个数据包,这可能导致出现这种情况。

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

您所经历的行为与使用MSG_PEEK标志时的情况类似

MSG_PEEK, Leave received data in queue.
使用MSG_WAITALL标志,您可以将所有可用数据读取到缓冲区

MSG_WAITALL, Attempt to fill the read buffer.

您可以在

流套接字上找到更多详细信息,它们不维护消息边界。@glglgl-好的,也许您还有其他错误。首先修复您所知道的协议—按照其他人的建议,修复您的协议以适应TCP的字节流性质。TCP数据包的大小与您为任何特定send()调用提供的字节数无关。TCP层将以其认为合适的任何方式(基于当前网络条件)将字节填充到数据包中;它唯一的限制是接收字节的顺序必须与发送字节的顺序相同。