1

假设 UDP 发送方多次执行 sendto:

发送到(s,缓冲区,100,...);
发送到(s,缓冲区,200,...);
发送到(S,缓冲区,300,...);

接收器在数据可用时执行以下代码:

无效的 OnReceive()
{
    recvfrom(s, 缓冲区, 1000, ...);
}

现在,如果调用 recvfrom 时所有数据 (100+200+300) 都可用,是否有可能通过一次 recvfrom 调用或多个不可预测大小的 recvfrom 调用读取数据?或者它总是被发送时相同的部分接收:100、200、300?

要编写 100% 正确的接收器代码,我应该实现一种流解析逻辑,还是数据记录读取逻辑?

对于这个问题,我假设数据没有丢失并且数据包顺序没有改变,但是,在一般情况下,这对于 UDP 套接字是不正确的。

4

1 回答 1

2

无论队列中有多少数据报(新的 Linux 特定API 除外),从 UDP 套接字读取一个recvmmsg(2)数据包都会使一个数据报出队,即假设数据包没有重新排序并且您提供给内核的缓冲区足够大,您将得到 100, 3 次读取 200 和 300 字节。

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

于 2011-12-15T19:57:55.060 回答