socket传输结构体,或者结构体转换成字符串
我用SNMP的API获取了信息,现在想用socket传输到服务器端。
但结构体好像不能直接传输,但又没办转换成字符串。
求大神指点一下,该怎么办。
下面是部分代码
//查询结果socket SNMP 字符串
char *string = NULL;
SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
printf("Variable = %s\n", string);
//发送查询结果
ret = send (sClient, (char *)&string, sizeof(string), 0);
if (string) SNMP_free(string);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
//转换成字符串
char str[255];
sprintf(str, "%s",&variableBindings.list[0].value);
//发送
ret = send (sClient, (char *)&str, sizeof(str), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
printf("\n");
[解决办法]
你需要的是序列化, 搜索 protobuf
[解决办法]
也可以自己打包解包封装
[解决办法]
强制转化为BYTE数组发送,接收方再转化为结构体
[解决办法]
这个涉及到大小端问题,发送结构体的时候,如果其中一个变量超过一个字节,要进行大小端转换
//2个字节类型的转换
#define BSWAP_16(x) \
(UINT16) ( ((((UINT16)(x)) & 0x00ff) << 8 )
[解决办法]
\
((((UINT16)(x)) & 0xff00) >> 8 ) \
)
//四个字节类型的转
#define BSWAP_32(x) \
(UINT32) ( (( ((UINT32)(x)) & 0xff000000 ) >> 24)
[解决办法]
\
(( ((UINT32)(x)) & 0x00ff0000 ) >> 8 )
[解决办法]
\
(( ((UINT32)(x)) & 0x0000ff00 ) << 8 )
[解决办法]
\
(( ((UINT32)(x)) & 0x000000ff ) << 24) \
)
[解决办法]
而且还要注意因为对齐而产生的填充bytes