网络传输时可以直接发送一个结构体吗?该如何处理

网络传输时可以直接发送一个结构体吗?
网络传输时可以直接发送一个结构体吗?

通信双方可能是不同的平台。

类似这样:

C/C++ code


typedef struct 
{
    int   f0;
    int  f1;
}A;

typedef struct
{
    char c0[128];
    char c1[64];
}B;

A a;
B b;

send(fd, (void*)(&a),sizeof(a), flags);    // Line 1
send(fd, (void*)(&b),sizeof(b), flags);   // Line 2




我认为 Line1是错误的做法(大小端),而Line2是可行的(长期维护性考虑),但是不太好的做法。

各位有何见解?

谢谢!


------解决方案--------------------
这要看网络传输的两端是否都是由你来完成。如果不是,那如果对方不支持的结构,你没发传;如果都是你做的,那么传输的内容的数据结构你是清楚的,所以结构也没有问题,只是按数据流传输就是了。
用int型不是很好,它是与计算机相关的,32位下,int型是32位,64位下,int型是64位了,所以最好不用
------解决方案--------------------
可以定一个长度字段,这样后面就可以知道数据长度了,其次用一些固定长度,比如char等不太会变的类型
------解决方案--------------------
我建议通信双方约定一个相同的大小端,比如统一用litten-endian;
任何通信者都通过条件编译或者其他手段,强制使用这种规范。
------解决方案--------------------
如果真有你所说的问题,那么你用char数组也解决不了这个问题啊,发送端不知道接收端会以何种方式去将char组织成整形,它也不知道该怎么把整形拆成char啊
------解决方案--------------------
当然可以了,自定义协议
自定义大小端,字节对齐
------解决方案--------------------
那就不行了,双方如果设置好了也行,比如都是32位程序,内存对齐也一致,大小端也一致,数据类型也一致等等。

------解决方案--------------------
为什么你认为1是正确的呢?不管你这个char内的顺序如何组合,对方计算机都不知道你这边的int的存储方式,它怎么就能正确组合出12345的整数呢?
------解决方案--------------------
所以你必须要考虑这个问题的话,就要加协议,向对方表明你的整形的存储方式,到底是高字节在前,还是低字节在前,对方才能根据自己的存储方式来决定怎么将接收到的内容进行存储。
对于发送端来说,不管什么类型发送,到接收方都是char*数组,没有区别
------解决方案--------------------
你认为可以吗?如果可以,那你的担心本身就不存在了。你觉得字节的顺序就是整形的内存顺序吗?你担心的不就是这个顺序吗?发送端组织char*的时候,你不可能预知接收方的大小端,自然只能选择自己的大小端顺序发送,那接收端收到后,也不知道对方是按大端顺序还是小端顺序发送的吧?那你怎么存储到内存呢?
------解决方案--------------------
跨语言最好用字串,基本上各种语言对字串支持的都很好,但是内存结构就不是了,C++没问题,其他语言,没有优势,反倒不方便。
------解决方案--------------------
用同样的结构体接收就好了
------解决方案--------------------
int float long在结构体中传输都要网络字节大小端的问题。

------解决方案--------------------
BASE64编码,传字符串

收到后解码,这样很方便

------解决方案--------------------
探讨
你认为可以吗?如果可以,那你的担心本身就不存在了。你觉得字节的顺序就是整形的内存顺序吗?你担心的不就是这个顺序吗?发送端组织char*的时候,你不可能预知接收方的大小端,自然只能选择自己的大小端顺序发送,那接收端收到后,也不知道对方是按大端顺序还是小端顺序发送的吧?那你怎么存储到内存呢?

------解决方案--------------------
学习来了 各位大侠