【问题标题】:What are the possible return values for send, sendto and sendmsg on a UDP socket on Linux?Linux 上 UDP 套接字上的 send、sendto 和 sendmsg 的可能返回值是什么?
【发布时间】:2020-11-21 20:59:49
【问题描述】:

这些函数在错误时返回 -1,在成功时返回输入长度。在什么情况下,对于 Linux 上的 UDP 套接字,它们可能返回小于长度且大于或等于 0 的值?

This StackOverflow question 类似,但在非 Linux RTOS 的上下文中。答案断言它不可能发生,并且操作系统供应商与他们相矛盾。 This StackOverflow question 类似,但接受的答案仅讨论收据。 Beej's guide 断言它可能会发生。 libuv 断言它不能。 POSIX 似乎并没有禁止它。

因此,我很好奇在什么情况下(如果有的话)会导致 Linux 上 UDP 套接字的“短写”返回值? POSIX 中是否有禁止它的互联网 RFC 或条款?例如,如果 UDP 数据报被分段(在多个 IP 数据包中发送),这种情况会发生吗?

【问题讨论】:

    标签: linux sockets udp posix datagram


    【解决方案1】:

    UDP 是一种数据报协议,即它不像 TCP 那样是字节流,但协议内部有明确的消息边界。这些消息语义会在阅读时反映出来,即单个 recv 将返回单个(完整)消息。

    使用单个send 发送单个消息(数据报),并且没有其他方法可以指定消息边界。但是“短发送”会在它们不属于的地方引入消息边界,因此对于 UDP 是不可能的。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2012-08-02
      • 2014-07-02
      • 2013-11-10
      • 1970-01-01
      • 2018-10-31
      • 2014-01-04
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多