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,提问作者Деян Цонев
相关产品推荐
相关产品推荐

