假设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套接字是不正确的 .
1 回答
无论队列中有多少个(UDP新特定的
recvmmsg(2)
API除外),UDP套接字中的一个读取都会使数据报出列,即假设数据包没有重新排序,并且你给内核的缓冲区足够大,你将获得100三次读取,200和300字节 .UDP应用程序通常是面向记录的 .