读书人

socket传输构造体或者结构体转换成字

发布时间: 2013-06-26 14:29:32 作者: rapoo

socket传输结构体,或者结构体转换成字符串
我用SNMP的API获取了信息,现在想用socket传输到服务器端。
但结构体好像不能直接传输,但又没办转换成字符串。
求大神指点一下,该怎么办。
下面是部分代码

//查询结果
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");
socket SNMP 字符串
[解决办法]
你需要的是序列化, 搜索 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) \
)



[解决办法]
引用:
这个涉及到大小端问题,发送结构体的时候,如果其中一个变量超过一个字节,要进行大小端转换

//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

读书人网 >C语言

热点推荐