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 实现可以处理部分数据报。
在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 实现可以处理部分数据报。