繁体   English   中英

Linux 上的 UDP 套接字上的 send、sendto 和 sendmsg 的可能返回值是多少?

[英]What are the possible return values for send, sendto and sendmsg on a UDP socket on Linux?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM