博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】socket不能直接传输结构体!
阅读量:6226 次
发布时间:2019-06-21

本文共 921 字,大约阅读时间需要 3 分钟。

  1. typedef struct
  2. {
  3. char name[20];
  4. char age[10];
  5. } stu;
  6. 发送方:
  7. ..............................
  8. stu stu1;
  9. strcpy(stu1.name, "myname");
  10. strcpy(stu1.age, "30");
  11. send(sock, (char*)stu1,sizeof(stu1), 0);
  12. 接受方:
  13. ..............
  14. recv(socka, rbuf, readlen, 0); //rbuf足够大
  15. stu *stu1;
  16. stu1 = (stu*)buff;
  17. printf("myname=%s, myage=%s/n", stu1->name, stu1->age);

输出 myname, 但stu1->age为空,没有取到。

 

你能保证发送方和接收方永远都是同样的机器同样的系统吗?如果不能,就不要直接传结构

 

TCP传输是基于流的,最好按照下面方法了定义结构

struct msg_struct{
unsigned int msg_len;
/*下面是具体的信息,可能是其它的结构,便于扩展*/
/*.......*/ 
}
发送端要计算msg_len的值
接收端要先接收sizeof(unsigned int)个字节,得到msg_len,然后recv(..,msg_len..)

 

你的msg_len传过去有用么?对方知道你是什么endian?

 

 

俺以前做过一个项目,改造国内一个著名的系统,其中的一部分就是原设计愚蠢地在CS间使用结构进行数据传输,遇到big-denian就瞎了,结果俺想了一招,做了一个通用的转换器解决了问题,省去了上千个应用程序的修改。

所以,网络上的数据传输绝对禁止使用带有2进制的结构数据,因为你不知道以后会出现什么样的机器使用什么样的体系,但是ASCII是不会改变的,除非你本就没想让自己的成果的生命期变得长久。

本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/archive/2012/07/25/2608670.html,如需转载请自行联系原作者
你可能感兴趣的文章
Juniper ScreenOS下的MIP, VIP, DIP, NAT-src, NAT-dst区别
查看>>
896.Montonic Array - LeetCode
查看>>
LNMP之源码自定义安装
查看>>
beego+mysql的美剧网站源码
查看>>
Android的Fragment
查看>>
javascript没有加载完就不可以响应ajax请求了么
查看>>
我的友情链接
查看>>
hashmap的初始容量为什么设置为16?
查看>>
10、二进制中1的个数
查看>>
好程序员带你认识“jQuery”
查看>>
不断重复
查看>>
jquery-event01
查看>>
9,mysql触发器
查看>>
在交换机上拒绝非法的DHCP服务器分配IP地址
查看>>
解决ezSQL编码问题
查看>>
[转]如何用Jmeter做压力测试
查看>>
跨站点如何快速部署DC
查看>>
C#修改目录和文件权限
查看>>
EL表达式
查看>>
深入浅出Hadoop Mahout数据挖掘实战(算法分析、项目实战、中文分词技术)
查看>>