windows客户端和linux服务端传递数据时是怎么屏蔽系统间的差异的?

跌落的阳光碎片 发布于 2016/08/31 20:42
阅读 158
收藏 0


如果我用C语言传一个结构体给服务端,这个结构体内有long long int 这样就会涉及到大小端问题,还有32位和64位系统之间的差异问题 ,直接传结构体可以吗?类似这样的结构体:

struct test{

    long long int i = 1235367445745;

    char name[100] = "my name";

    char info[100] = "sex girl";

}

客户端调用write(fd,test,sizeof(test))后这样发送给linux服务端后服务端可以拿到就直接用吗?是不是要解析呢?

如果可以的话,这个差异是怎么屏蔽掉的?

如果不可以的话,在项目中一般是怎么解决这个问题的,主要有哪些在项目中可用的第三方库或工具?

加载中
0
collinsz
collinsz

c/c++ 标准没有定义二进制实现,所以不同编译器的内存布局可能不一样的,也就是内存对齐问题。

不过你可以试下1字节对齐:

#pragma pack(push, 1) // exact fit - no padding
struct test{

    long long int i = 1235367445745;

    char name[100] = "my name";

    char info[100] = "sex girl";

}
#pragma pack(pop) //back to whatever the previous packing mode was



大小端问题: x86和x86-64机器都是little endian的
跌落的阳光碎片
其实我问的是表示层的问题,谢谢你,我已经弄懂了.
collinsz
collinsz
你需要在struct上加上#pragma pack(push, 1)。。像上面代码一样定义你的结构体。你可以在不同平台看下sizeof(test)是否一致
跌落的阳光碎片
不好意思.我想问下这个问题是要程序员来处理还是操作系统会自动处理啊?直接把结构体写入进socketfd 对面server端接收到后不做任何操作可以使用这个结构体吗?
返回顶部
顶部