假设UDP发送方执行sendto几次:
sendto(s, buffer, 100, ...); sendto(s, buffer, 200, ...); sendto(s, buffer, 300, ...);
当数据可用时,Receiver会执行以下代码:
void OnReceive() { recvfrom(s, buffer, 1000, ...); }
现在,如果在调用recvfrom时所有数据(100 + 200 + 300)都可用,是否可能通过一次recvfrom调用或几次具有不可预测大小的recvfrom调用来读取它?或者它将始终被发送的相同部分接收:100,200,300?
要编写100%正确的接收器代码,我应该实现一种流解析逻辑,还是数据记录读取逻辑?
对于这个问题,我假设数据没有丢失,数据包顺序没有改变,但一般情况下,这对UDP套接字不正确。
答案 0 :(得分:2)
从UDP套接字中读取一个一个数据报,无论队列中有多少(异常是新的Linux特定recvmmsg(2)
API),即假设数据包没有重新排序和缓冲区你给内核足够大,你将在三次读取中得到100,200和300字节。
UDP应用程序通常是面向记录的。