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

UDP发送时如何将含空值的char[]转换为const char*且不截断

解决UDP sendto发送含空值char数组的问题

嘿,我懂你碰到的这个坑——一开始以为把char[]转成const char*会被空值截断,其实完全是误会!核心点在于:sendto根本不是按字符串规则来处理数据的,它只认你指定的字节长度,不管数据里有没有'\0'。

直接给你说解决方案,超简单:

  • 你的char[]数组名本身就是指向首元素的指针,完全可以直接传给sendto的第二个参数(它的实际类型是const void*,天然兼容const char*)
  • 关键是第三个参数size_t len,你直接传数组的大小(比如1206)就行,sendto会严格按照这个长度发送所有字节,包括中间的空值,不会提前截断

给你举个实际代码例子:

// 假设你已经初始化好了UDP套接字sock_fd,以及目标地址dest_addr
char my_data[1206];
// 这里填充my_data,包括各种空值和二进制数据

// 直接调用sendto,不用做任何多余的转换
ssize_t bytes_sent = sendto(sock_fd, 
                            my_data,       // 数组名直接当指针用,自动转const char*
                            sizeof(my_data),// 指定要发送的总字节数(1206)
                            0, 
                            (struct sockaddr*)&dest_addr, 
                            sizeof(dest_addr));

// 记得检查返回值,确认发送成功
if (bytes_sent == -1) {
    perror("sendto failed");
}

为什么你会担心截断?大概率是平时用惯了strcpy、printf这类字符串函数——它们是以'\0'作为结束标志的,但sendto是底层的字节传输函数,它不管数据内容是什么,只是把你指定的字节数从内存里读出来发出去。

最后再补个小提醒:接收端也要用recvfrom,并且指定至少1206的接收长度,这样才能完整拿到所有数据,同样别用字符串函数去解析接收到的内容,要按你自己的数据格式来处理字节流。

内容的提问来源于stack exchange,提问作者Alvin Kuruvilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:12