读取UDP套接字:记录或流

时间:2011-12-15 19:51:11

标签: sockets stream udp datagram

假设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 个答案:

答案 0 :(得分:2)

从UDP套接字中读取一个一个数据报,无论队列中有多少(异常是新的Linux特定recvmmsg(2) API),即假设数据包没有重新排序和缓冲区你给内核足够大,你将在三次读取中得到100,200和300字节。

UDP应用程序通常是面向记录的。