【问题标题】:not reading an entire datagram from a UDP socket不从 UDP 套接字读取整个数据报
【发布时间】:2014-05-14 12:25:01
【问题描述】:

当您尝试将recv 从套接字发送到不足以存储整个数据报的缓冲区时会发生什么?可以存储的数据报中的大部分是recv'd 吗?其余的会丢失吗?还是会在后续调用 recv 时返回?

有没有办法确保读取整个数据报而不管其大小?

【问题讨论】:

    标签: sockets networking udp


    【解决方案1】:

    通常,(在 Windows/Linux 上),数据报会被截断以适应传递的缓冲区,而剩余的数据会永久丢失。

    有没有办法确保读取整个数据报而不管 他们的大小?

    使用 64K 缓冲区。 UDP 协议确保数据报不能大于该值,因此所有成功接收的数据报都将被完全读取,无论其大小。

    【讨论】:

    • +1。事实上,除非您处理的是 IPv6,否则 65507 就足够了。
    • @EJP - 不能超过 28 个字节:)
    • 嗯,这很有趣。如果你尝试send超过64K,数据会被拆分成多个数据报,还是会导致操作失败?
    • UDP sendto(或其他)调用将失败并返回错误或异常。不会发送任何数据报。
    【解决方案2】:

    这取决于平台。遵循单一 Unix 规范的系统(例如、Linux)将截断数据报以适应并丢弃剩余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2012-06-17
      • 1970-01-01
      • 2018-12-25
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多