POSIX:Return 来自 UDP 套接字上 write() 的值

POSIX: Return value from write() on UDP socket

在POSIX 系统上,如果sock_fd 是UDP 套接字,那么write(sock_fd, data, size) 总是return size 还是-1?也就是说,如果 write() 没有失败,请求的数据块 always 是否会完整写入,这意味着,如果 return 值不是 -1 , 那么我可以 always 忽略实际的 return 值?

在我看来应该是这样的,但是似乎没有手册页说明清楚。

编辑:我想有两个可能的答案。它要么在某处说明,但我没有找到它,要么有一些模糊的极端情况允许 return 值小于请求的大小。

有一个 return 字节值。如果它打算始终写入您发送的数量,则不会有 return 字节值。

所以把它当作它可以 return 任何东西来对待,你就不会有问题。

即使您只是在日志中报告错误或中止程序,检查 RETURN

与 TCP 和其他传输不同,UDP 仅对整个数据报进行操作。

write()/send()/sendto()的return值是内核接受发送的字节数。只是在通过 UDP 发送数据报时,一次发送整个数据报,或者根本不发送任何数据报。所以 return 值在成功时总是数据报的整个大小,在失败时为 -1。没有中间。

接收同理。 read()/recv()/recvfrom()的return值是读入用户缓冲区的字节数。只是当通过 UDP 接收数据报时,您要么一次接收到整个数据报(如果您的缓冲区太小,数据报将被截断),要么您根本接收不到任何数据。因此 return 值将始终是成功时复制到缓冲区中的数据报的大小,失败时为 -1。没有中间(当然不算不看就偷看的可能性)。

UDP RFC 保留实施细节开放:

One possible UDP/IP interface would return the whole internet datagram including all of the internet header in response to a receive operation. Such an interface would also allow the UDP to pass a full internet datagram complete with header to the IP to send.

POSIX 规范没有详细说明这一事实,对我来说,这意味着 UDP 没有要求 使用特定的实现。

话虽如此,我不知道有任何 UDP 实现可以处理部分数据报。