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

UDP通信异常求助:recvfrom遇0x00字节停止读取

UDP客户端发送含0x00字节数据的问题修复

问题根源

你代码里的关键错误是用strlen((const char *)msg)作为sendto的长度参数。strlen是处理C字符串的函数,它会从起始地址遍历,遇到第一个0x00字节就停止计数。这就导致:

  • 如果msg首字节是0x00,strlen返回0,等于没发送任何数据
  • 就算首字节非0,只要数据中包含0x00,都会被截断,发送不完整的UDP包

接收端recvfrom读到0就停止的现象,本质是客户端没发够4字节数据,不是recvfrom本身的问题。

修复方案

直接传入固定的4字节长度,或者利用sizeof获取数组总字节数(注意:只有当msg是数组类型时sizeof才有效,若退化为指针则不行):

修复后的main函数

int main(void)
{
   BYTE msg[4] = {0x00, 0x04, 0x02, 0x03}; // 符合首字节为0x00的需求
   send_udp_packet(msg, sizeof(msg)); // 替换strlen为sizeof(msg)
  
   return 0;
}

可选优化:增加参数校验

在send_udp_packet里加入基础校验,避免无效调用:

int send_udp_packet(BYTE *msg, size_t len)
{
   if (msg == NULL || len == 0) {
       fprintf(stderr, "无效的消息或长度\n");
       return -1;
   }
   // 原有的socket创建、地址设置、发送逻辑...
}

关键说明

UDP是面向数据报的协议,sendto会严格按照你传入的len长度发送完整数据报,只要客户端发送的长度正确,接收端recvfrom就能读取到完整的4字节数据,不会因为数据中包含0x00而中断读取。

内容的提问来源于stack exchange,提问作者Деян Цонев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:36:22