这些函数在错误时返回-1,在成功时返回输入长度。在Linux上的UDP套接字中,在什么情况下它们可以返回小于长度且大于或等于0的值?
This StackOverflow question与之类似,但在非Linux RTOS的上下文中。答案断言这不可能发生,并且操作系统供应商对此表示反对。 This StackOverflow question类似,但是接受的答案仅讨论收货。 Beej's guide断言可能会发生。 libuv断言它不能。 POSIX似乎并不禁止它。
因此,我很好奇在什么情况下会导致Linux上UDP套接字的“短写”返回值? POSIX中是否有禁止使用的Internet RFC或条款?例如,如果UDP数据报被分段(在多个IP数据包中发送),会发生这种情况吗?
最佳答案
UDP是一种数据报协议(protocol),即它不是像TCP那样的字节流,但是协议(protocol)内部有明确的消息边界。这些消息语义在读取时会得到反射(reflect),即单个recv
将返回单个(完整的)消息。
使用单个send
发送单个消息(数据报),没有其他方法可以指定消息边界。但是“短发送”会引入不属于它们的消息边界,因此对于UDP应该是不可能的。