在POSIX系统上,如果sock_fd
是UDP套接字,write(sock_fd, data, size)
总是会返回size
还是-1?即,如果write()
没有失败,请求的数据始终将完整写入,这意味着,如果返回值不是-1,那么我可以总是忽略实际的返回值?
在我看来,情况确实如此,但是没有一个手册页似乎清楚地说明了这一点。
编辑:我想有两个可能的答案。要么在某个地方陈述,但我没有找到它,或者有一些模糊的角落情况允许返回值小于请求的大小。
答案 0 :(得分:2)
与TCP和其他传输不同,UDP仅对整个数据报进行操作。
insert
/ write()
/ send()
的返回值是内核接受发送的字节数。只是当通过UDP发送数据报时,一次发送整个数据报,或者根本不发送任何数据报。因此,返回值将始终是成功时数据报的整个大小,或者失败时为-1。中间没有。
与接收相同。 sendto()
/ read()
/ recv()
的返回值是读入用户缓冲区的字节数。只是当通过UDP接收数据报时,您要么一次收到一个完整的数据报(如果您的缓冲区太小,数据报将被截断),或者您根本没有收到任何数据报。因此,返回值将始终是成功时复制到缓冲区中的数据报的大小,或者在失败时为-1。中间没有(不计算没有阅读时偷看的可能性)。
答案 1 :(得分:1)
UDP RFC打开实施细节:
一个可能的UDP / IP接口将返回整个互联网 数据报包括响应接收的所有互联网标题 操作。这样的接口也允许UDP通过 完整的互联网数据报,包括要发送的IP头。
POSIX规范没有详细说明这一事实对我来说,表明UDP没有要求来使用特定的实现。
话虽如此,我不知道任何可以处理部分数据报的UDP实现。
答案 2 :(得分:0)
有一个以字节为单位的返回值。如果打算始终写入您发送的金额,则不会有以字节为单位的返回值。
因此,请将其视为可以返回任何内容,并且您不会遇到任何问题。
即使您只是在日志中报告错误或中止该程序,检查退货。