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

如何通过socket发送字符串?JSON来源字符串发送异常如何解决

问题原因
  • 核心错误为发送长度参数错误:你当前代码中发送常量字符串时使用sizeof(string)计算长度,该语法对字符数组生效,但如果切换为发送json_object_to_json_string返回的buf_cst时仍使用sizeof计算长度,由于buf_cst是指针类型,sizeof(buf_cst)得到的是指针本身的占用字节数(32位环境为4字节、64位环境为8字节),远小于实际JSON内容长度,导致仅发送了内容的前几个字节,服务器无法解析完整报文。
  • 额外错误:sizeof(string)会将字符数组末尾的字符串终止符\0一同发送,合法JSON报文不包含该终止符,服务器收到多余字符会判定JSON格式非法。
  • 你猜测的双引号未转义问题不存在:json_object_to_json_string返回的是标准序列化后的JSON字符串,内部双引号已自动做了正确处理,你打印出的内容与常量一致也验证了这一点。
解决方法
  1. 统一使用strlen()计算待发送字符串的实际长度,替换sizeof语法,避免发送多余终止符、避免长度计算错误。
  2. 将sendto的发送缓冲区参数替换为JSON库返回的buf_cst指针。

修改后的代码示例:

int fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
    print_time();
    perror("Socket failed\n");
    exit(EXIT_FAILURE);
}

struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(9900);
serveraddr.sin_addr.s_addr = inet_addr("192.168.1.96");

// 获取JSON序列化后的字符串
const char * buf_cst = json_object_to_json_string(hb);
// 计算实际内容长度
size_t buf_len = strlen(buf_cst);

if (sendto(fd, buf_cst, buf_len, 0 , (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
{
    perror("Error");
}

close(fd);

注意:json_object_to_json_string返回的内存由JSON库内部管理,无需手动释放,若你使用的是特殊分支版本请参考对应库的说明。

内容的提问来源于stack exchange,提问作者Report Feedback

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:57:01