免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 19034 | 回复: 21
打印 上一主题 下一主题

socket怎么发送结构体? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-08 12:44 |只看该作者 |倒序浏览
5可用积分
我在写个socket发送数据包的程序,定义了一个包头和一个数据结构体!
就是不知道怎么传送这个结构体…………

论坛徽章:
0
2 [报告]
发表于 2009-10-08 17:16 |只看该作者
如果用c的话,结构体里的数据也可以理解为一个uint8_t数组,所以直接用memcpy考到包里应该就可以了。。收到以后在memcpy考到结构体里

如果是面向对象语言的话,可能有一些序列化的方法,不过这个是用来传object的,变通一下就可以传你想传的数据了

论坛徽章:
0
3 [报告]
发表于 2009-10-08 21:51 |只看该作者
好像叫结构体序列化
结构体与字符数组相互转换,例如:
typedef struct __STUDENT
{
int iAge;
int iYear;
int iMonth;
}STUDENT,*PSTUDENT;
结构体-->字符串数组 ,方法一
PSTUDENT st = NULL;
st = (PSTUDENT)new char[12];
memset(st,0,12);
st->iAge = 12;
st->iMonth = 14;
st->iYear = 100;
CHAR szBuf[13] = {0};
memcpy(szBuf,st,12);
delete st;
st = NULL;
结构体--->字符串数组 ,方法二
STUDENT st;
st.iAge = 12;
st.IMonth = 12;
st.iYear = 1990;
CHAR szBuf[13] = {0};
memcpy(szBuf,&st,12);
字符串数组--->结构体
PSTUDENT st1 = NULL;
st1 = (PSTUDENT)szBuf;
CString str;
str.Format("%d %d %d",st1->iAge,st1->iMonth,st1->iYear);
MessageBox(str);

论坛徽章:
0
4 [报告]
发表于 2009-10-09 13:51 |只看该作者
结构体当字符数组发,总觉得如果两边体系架构不一致有可能出问题呐。

论坛徽章:
0
5 [报告]
发表于 2009-10-09 13:53 |只看该作者
结构体当字符数组发,总觉得如果两边体系架构不一致有可能出问题呐。

论坛徽章:
0
6 [报告]
发表于 2009-10-09 15:25 |只看该作者

回复 #5 zyr-linux 的帖子

确实,像结构体对齐方式不同,就会出问题,要人为地控制一下了

论坛徽章:
0
7 [报告]
发表于 2009-10-09 15:41 |只看该作者
两边协议一样,打好包就行

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
8 [报告]
发表于 2009-10-09 16:11 |只看该作者
注意其中整型值的字节序处理,
通用做法都转换为网络字节序,接收端再转成本地字节序。

还有字节对齐,通常用编译指示字强制1字节对其,需要填充的地方用结构体成员显示的填充

论坛徽章:
0
9 [报告]
发表于 2009-10-09 16:13 |只看该作者
应该是有问题的~
如果在不同架构主机间传递时,由于涉及字节序问题,相同的字节流,对应相同的内存布局(memcpy可以保证),但却引出了不同的变量类型的内存解释~
这也就是为什么ntohs/ntohl/htons/htonl存在的原因~

论坛徽章:
0
10 [报告]
发表于 2009-10-09 16:14 |只看该作者
建立一个连接,然后socket往里面write就可以把,应该
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP