网络传输结构体,字节序,大小端怎么解决

何日人再来 2009-06-08 12:38:12
rt,还有对齐
采用base64编码?
还是写个函数,里面把基本类型都转成网络字节序?
...全文
1774 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
还是有办法的,将传送和接收端的结构体定义中,元素的顺序完全颠倒一下,然后将接收到的数据也完全颠倒,结构体指针就可以用了
何日人再来 2009-06-10
  • 打赏
  • 举报
回复
没人来补充了吗?好吧,谢谢各位了
ok1234567 2009-06-09
  • 打赏
  • 举报
回复
如果要通用,就不是传送结构体,实际上网络上连变量的概念最好都不要有,只有字节
所以,你必须把你要传送的东西全部转换成字节后,再发送出去,在c中,以字节方式存在的数据,是不需要进行转换的,比如char *什么的,对于多字节字符串,依然免不了解释

如果你要直接收发结构体数据,那也是可以的,核心的问题:结构体长度一致,当然两边的平台一致是基本前提
dch4890164 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 greatws 的回复:]
没必要考虑大小端、字节序、对其的问题,只要2边的这个结构体定义一样就行了。接收端直接转换成struct xxx*指针的形式使用,和发送端就一致了。
[/Quote]
呵呵不是吧,这个有点误导人了就
sun007700 2009-06-09
  • 打赏
  • 举报
回复
在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的, 比如i386芯片是低字节在内存地址的低端,
高字节在高端,而alpha芯片却相反. 为了统一起来,在Linux下面,有专门的字节转换函数.
unsigned long int htonl(unsigned long int hostlong)
unsigned short int htons(unisgned short int hostshort)
unsigned long int ntohl(unsigned long int netlong)
unsigned short int ntohs(unsigned short int netshort)

在这四个转换函数中,h 代表host, n 代表 network.s 代表short l 代表long
第一个函数的意义是将本机器上的long数据转化为网络上的long. 其他几个函数的意义也差不多.


转载:http://blog.csdn.net/jenshy/archive/2006/04/18/667944.aspx
skyxie 2009-06-08
  • 打赏
  • 举报
回复
1.

#pragma pack(push)
#pragma pack(1)
//定义结构体
#pragma pack(pop)


2. 传输的时候都使用网络字节序,这是标准的做法。
发送方htonl/s 接收方ntohl/s
hendriclee 2009-06-08
  • 打赏
  • 举报
回复
有一个函数可以转换网络字节序列,参考:http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_17298.html
何日人再来 2009-06-08
  • 打赏
  • 举报
回复
一个一个转很繁琐啊,而且有些类型怎么转啊象int,char *这样的怎么转啊
有没有更好的解决方案呢?你们都是怎么做的?
skyxie 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 greatws 的回复:]
没必要考虑大小端、字节序、对其的问题,只要2边的这个结构体定义一样就行了。接收端直接转换成struct xxx*指针的形式使用,和发送端就一致了。
[/Quote]
你的程序没有出bug只能说是因为C/S两端的机器恰好都是相同的endian
(确实大部分机器都是little endian的)
greatws 2009-06-08
  • 打赏
  • 举报
回复
没必要考虑大小端、字节序、对其的问题,只要2边的这个结构体定义一样就行了。接收端直接转换成struct xxx*指针的形式使用,和发送端就一致了。
blackcat242 2009-06-08
  • 打赏
  • 举报
回复
我都是一个一个转的
wocow3 2009-06-08
  • 打赏
  • 举报
回复
主要注意结构体align问题,统一成nopack减少无用的数据传输
#include <PshPack1.h>
//定义结构体
...
#include <PopPack.h>
jyh_baoding 2009-06-08
  • 打赏
  • 举报
回复
传输前转化为网络需,接收是转化为本机序

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧