POSIX:从UDP套接字上的write()返回值

时间:2018-05-21 20:10:43

标签: c sockets udp posix

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

在我看来,情况确实如此,但是没有一个手册页似乎清楚地说明了这一点。

编辑:我想有两个可能的答案。要么在某个地方陈述,但我没有找到它,或者有一些模糊的角落情况允许返回值小于请求的大小。

3 个答案:

答案 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)

有一个以字节为单位的返回值。如果打算始终写入您发送的金额,则不会有以字节为单位的返回值。

因此,请将其视为可以返回任何内容,并且您不会遇到任何问题。

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