结构体指针无法赋值给unsigned char*,如何实现该操作?
问题分析与解决方案
你的核心问题是指针类型不匹配导致的赋值失败:&s_desc是SERVER_DESC*类型,而ptr_answ是unsigned char*类型,C++不允许这种隐式的跨类型指针转换,但unsigned char*完全适用于网络字节流传输场景——它是处理原始字节数据的常用类型,能正确表示单字节的网络数据单元。
直接解决赋值问题
将结构体指针显式转换为unsigned char*即可,推荐用reinterpret_cast(专门用于底层类型转换):
s_ans.ptr_answ = reinterpret_cast<unsigned char*>(&s_desc);
额外注意事项(避免后续传输/解析出错)
- 修正send函数的笔误:你代码里的
send参数写错了,应该用s_ans.ptr_answ而非s_desc.ptr_answ,因为SERVER_DESC结构体没有ptr_answ成员:i_result = send(i_socket, reinterpret_cast<char*>(s_ans.ptr_answ), s_ans.payload_len, 0); - 字节序问题:结构体中的
int类型字段(udpport、server_port)是主机字节序,网络传输要求大端字节序,不同架构的机器直接解析会出错,需要转换:
客户端解析时要转回来:s_desc.udpport = htons(5000); // 短整型转网络字节序 s_desc.server_port = htons(10005);ntohs(recv_desc.udpport)。 - 结构体对齐问题:不同编译器/编译选项的内存对齐规则不同,可能导致客户端和服务器的
sizeof(SERVER_DESC)不一致,解析时错位。可以强制1字节对齐:#pragma pack(push, 1) struct SERVER_DESC { int udpport; int server_port; char server_ipaddr[16]; char server_mac[18]; }; #pragma pack(pop) - 手动序列化(更可靠):如果要彻底避免对齐和字节序问题,建议手动将结构体的每个字段按顺序打包成字节数组,客户端再按顺序解析,比如:
// 序列化 unsigned char buffer[sizeof(SERVER_DESC)]; int offset = 0; memcpy(buffer + offset, &htons(s_desc.udpport), sizeof(int)); offset += sizeof(int); memcpy(buffer + offset, &htons(s_desc.server_port), sizeof(int)); offset += sizeof(int); memcpy(buffer + offset, s_desc.server_ipaddr, 16); offset +=16; memcpy(buffer + offset, s_desc.server_mac, 18); // 发送buffer即可
内容的提问来源于stack exchange,提问作者soumya
相关产品推荐
相关产品推荐

