You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:57:03