如何通过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字符串,内部双引号已自动做了正确处理,你打印出的内容与常量一致也验证了这一点。
解决方法
- 统一使用
strlen()计算待发送字符串的实际长度,替换sizeof语法,避免发送多余终止符、避免长度计算错误。 - 将
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
相关产品推荐
相关产品推荐

