c 结构体转byte_socket传输结构体,可能结构体转换成字符串

博客讲述了在C语言中如何处理结构体无法直接通过Socket传输的问题。建议使用序列化库如protobuf,或者手动打包解包结构体,并注意大小端转换和填充字节。提供了一段关于大小端转换的宏定义示例。
摘要由CSDN通过智能技术生成

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");

------解决思路----------------------

你需要的是序列化, 搜索 protobuf

------解决思路----------------------

也可以自己打包解包封装

------解决思路----------------------

强制转化为BYTE数组发送,接收方再转化为结构体

------解决思路----------------------

这个涉及到大小端问题,发送结构体的时候,如果其中一个变量超过一个字节,要进行大小端转换

//2个字节类型的转换

#define  BSWAP_16(x) \

(UINT16) ( ((((UINT16)(x)) & 0x00ff) <

------解决思路----------------------

\

((((UINT16)(x)) & 0xff00) >> 8 ) \

)

//四个字节类型的转

#define BSWAP_32(x) \

(UINT32) ( (( ((UINT32)(x)) & 0xff000000 ) >> 24)

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x00ff0000 ) >> 8 )

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x0000ff00 ) <

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x000000ff ) <

)

------解决思路----------------------

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

//2个字节类型的转换

#define  BSWAP_16(x) \

(UINT16) ( ((((UINT16)(x)) & 0x00ff) <

------解决思路----------------------

\

((((UINT16)(x)) & 0xff00) >> 8 ) \

)

//四个字节类型的转

#define BSWAP_32(x) \

(UINT32) ( (( ((UINT32)(x)) & 0xff000000 ) >> 24)

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x00ff0000 ) >> 8 )

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x0000ff00 ) <

------解决思路----------------------

\

(( ((UINT32)(x)) & 0x000000ff ) <

)

而且还要注意因为对齐而产生的填充bytes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值