C语言中recvfrom读取UDP数据包时如何判断停止时机?
recvfrom停止读取的逻辑说明
recvfrom的停止时机既不是靠查找空终止符,也不是sendto在应用层额外附加长度信息,而是由UDP协议本身的特性决定的:
- UDP是面向数据报的传输层协议,每个UDP报文的头部自带固定的长度字段,内核在接收报文的时候,已经可以通过报文头知道当前这个UDP数据报的总载荷长度,不需要依赖应用层的数据内容做判断。
- 你调用
sendto时传入的第三个参数(本次发送长度),会直接作为UDP报文载荷的长度值写入UDP报文头,和载荷一起封装成完整的UDP报文发送。 - 调用
recvfrom读取的时候,内核直接按照UDP报文头的长度信息,拷贝对应长度的内容到用户提供的缓冲区就结束读取:- 如果缓冲区
max_length大于等于报文载荷长度,就完整拷贝所有载荷,返回值等于实际报文长度 - 如果缓冲区
max_length小于报文载荷长度,就只拷贝max_length长度的内容,多余部分直接丢弃,返回值等于max_length,同时会设置MSG_TRUNC标记提示报文被截断
- 如果缓冲区
你举的例子里sendto传入的长度是2,对应的UDP报文载荷长度就是2字节,所以recvfrom拷贝完2字节就结束,和你发送的字符串有没有空终止符没有任何关系。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

