客户端打印服务端传输帧遇段错误/乱码,求类型转换解决方案
客户端接收服务端帧时的段错误/乱码问题
客户端打印服务端发送的帧时,频繁出现段错误或乱码,推测根源是帧结构设计或类型转换操作不当导致。
定义的帧结构体
typedef struct{ char *information[100]; uint8_t infoSize; }resFrame; typedef struct { uint8_t option; }reqFrame;
核心问题点
客户端代码中printf("%s\n",&serverFrame.information[j]);是出错位置,尝试过多种类型转换、甚至将数据转为十六进制发送,仍存在数据丢失或乱码问题。
问题分析与解决
- 结构体设计致命缺陷:
resFrame中的char *information[100]是指针数组,网络传输结构体时,指针存储的是服务端本地内存地址,客户端收到后该地址完全无效,无法指向有效字符串数据,直接导致乱码或段错误。 - 修正结构体设计:将指针数组改为固定长度的二维字符数组,比如
char information[100][256];(256为单条数据最大长度,可按需调整),让字符串数据直接存在结构体内部,传输后客户端能直接读取有效数据。 - 修复printf调用:原代码中
&serverFrame.information[j]是取指针的地址(类型为char**),用%s打印会错误地把该地址当作字符串首地址。即使结构体修复后,正确调用应为printf("%s\n", serverFrame.information[j]);(直接使用数组元素,无需取地址)。 - 网络传输注意事项:不要直接发送整个结构体,不同平台的结构体对齐规则、字节序可能不同,建议手动序列化每个字段:服务端按顺序发送
infoSize、每条information的内容(可先传长度再传字符串),客户端按对应顺序解析并组装数据,避免内存地址、对齐等问题。
内容的提问来源于stack exchange,提问作者cesar
相关产品推荐
相关产品推荐

