【问题标题】:Reading UDP socket: records or stream读取 UDP 套接字:记录或流
【发布时间】:2012-01-21 11:36:29
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: sockets stream udp datagram


    【解决方案1】:

    从 UDP 套接字读取一次 一个 数据报,无论队列中有多少(例外是新的 Linux 特定 recvmmsg(2) API),即假设数据包没有重新排序并且您提供的缓冲区如果内核足够大,您将在 3 次读取中分别获得 100、200 和 300 字节。

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

    【讨论】:

    • 同时假设没有丢包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2016-08-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多