Chinaunix

标题: 不同平台,数据如何传输 [打印本页]

作者: DesignInside    时间: 2008-12-26 15:10
标题: 不同平台,数据如何传输
Hi all

我的服务端是PPC,客户端是x86.
现在要传递数据,数据类型是一个结构体
struct msg
{
    int a;
    int b;
    int c[32];
}

网络传递好像也是大端模式吧?

请问,我应该如何处理这种情况?
是不是服务器不用管这个问题,因为它接受到的数据已经是大端模式了。
作者: cugb_cat    时间: 2008-12-26 15:12
web service
gsoap
作者: DesignInside    时间: 2008-12-26 15:24
原帖由 cugb_cat 于 2008-12-26 15:12 发表
web service
gsoap


狗狗了一把 不太明白 而且我用的操作系统是vxworks....

这么复杂啊?没有简单一点的解决方案?
作者: cugb_cat    时间: 2008-12-26 15:29
原帖由 DesignInside 于 2008-12-26 15:24 发表


狗狗了一把 不太明白 而且我用的操作系统是vxworks....

这么复杂啊?没有简单一点的解决方案?

自己定协议,自己把结构序列化。
作者: chary8088    时间: 2008-12-26 15:44
原帖由 cugb_cat 于 2008-12-26 15:29 发表

自己定协议,自己把结构序列化。

同意
作者: DesignInside    时间: 2008-12-26 15:45
原帖由 cugb_cat 于 2008-12-26 15:29 发表

自己定协议,自己把结构序列化。

....
谢谢
我自己再想想
作者: 老手    时间: 2008-12-26 15:47
网络传输并没有自动进行字节序的转化。这个过程你必须去做 。
不管是PPC,还是X86 , 都必须转换到特定的字节序。即便肯定有一方的转换程序只是摆个样子而已。
自定协议是需要的 。 直接传递结构除了字节序问题之外 , 还可能有字节对齐问题。
作者: DesignInside    时间: 2008-12-26 15:54
搜了一把
发现一段话

同构平台间,直接发就可以了,不需要 ntohs。
异构平台间,两边 #pragma pack(1),并 htons/ntohs。
作者: cugb_cat    时间: 2008-12-26 15:59
原帖由 DesignInside 于 2008-12-26 15:54 发表
搜了一把
发现一段话

同构平台间,直接发就可以了,不需要 ntohs。
异构平台间,两边 #pragma pack(1),并 htons/ntohs。

建议你还是用文本格式进行传输,就像http一样。
作者: langue    时间: 2008-12-26 16:04
标题: 回复 #8 DesignInside 的帖子
挑个骨头:他那个“构”字容易产生歧义。
化学里有“同分异构体”的概念,化学式相同但分子结构不同就叫同分异构体。还是别随便造词的好。

当你不能统一目标平台特性的时候,为了编写可移植代码,记得统统转换成相同字节序。双向都要做。7 楼也说了,不转换也摆摆样子。

IPC 么……既然你选择 socket 通讯,那么也就那点东西。

有空看看这个:http://luca.ntop.org/Teaching/Appunti/asn1.html
作者: 老手    时间: 2008-12-26 16:07
原帖由 DesignInside 于 2008-12-26 15:54 发表
搜了一把
发现一段话

同构平台间,直接发就可以了,不需要 ntohs。
异构平台间,两边 #pragma pack(1),并 htons/ntohs。


不全面。

不自定协议:你无法确定要收多少数据, 你也无法知道这些数据是属于哪个结构的 。
除非你就只用一个结构。
作者: zhangruiyi    时间: 2008-12-26 16:21
不管怎么说,为了代码的可移植性,你都应该使用ntohl,htonl这类函数进行字节序的转换。
你不必关心你现在的系统是大端还是小端的。从主机发到网络上的调用htonl
从网络接收到主机的数据调用ntohl
作者: DesignInside    时间: 2008-12-26 16:22
标题: 回复 #10 langue 的帖子
谢谢 有空我会看看

to 老手 我现在的情况就是使用一个结构体,所以我觉得是可以的:wink:

谢谢cugb_cat 虽然你说的我都不是很懂(http怎样传输我真的不知道--!),但是我会去慢慢学习的...
作者: ljoo    时间: 2008-12-26 16:36
tcp udp 层,不用大管大端小端吧这些是ip底层的问题吧.

难道用tcp 发过去一个 int i=0x1
tcp一收会变成0x8000?
不会吧
作者: eveson    时间: 2009-01-02 11:50
网路传输是大端
如果一侧是大端就直接用,如果另一端不是大端,linux下转化函数,忘记叫叫什么了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2