在套接字上发送结构

时间:2013-11-19 08:42:56

标签: c++ sockets serialization

我正在尝试实现一个程序,通过c ++套接字从客户端向服务器发送结构。

到目前为止,我在自己的计算机上工作正常(在我自己的计算机上都是服务器和客户端),但我怀疑在不同的计算机上运行服务器和客户端时可能会遇到麻烦。

到目前为止我所拥有的是:

struct myStruct
{
    int whatever;
};

//Sender

myStruct obj;
obj.whatever = 123;
char *byteStream = (char *) &obj;

write(socketFD, byteStream, sizeof(myStruct));

//Receiver

char *byteStream = new char[sizeof(myStruct)];
read(socketFD, byteStream, sizeof(myStruct));

myStruct *received = (myStruct *) byteStream;
cout<<received->whatever;

接收器的cout声明打印123.

4 个答案:

答案 0 :(得分:4)

只要byte order相同(例如,两者都是PC),这应该可以在不同的计算机上运行。

答案 1 :(得分:3)

不同的系统可能使用不同的byte orderstructure padding。您需要确保两侧的结构均为packed。通常应该始终按网络顺序(big endian)发送多字节整数。使用ntohl和朋友在字节顺序之间转换。

答案 2 :(得分:2)

只要保留 endianness 结构包装(一旦您的struct中有多个数据成员,那就很好了) ),,当您的结构中有数据成员分配堆内存时,使用sizeof(myStruct)会给您带来问题。

从一开始我就不会依赖sizeof。构建一个函数来获取数据大小并使用它。

答案 3 :(得分:1)

你应该认真考虑某种序列化库。 JSON非常受欢迎且非常容易调试,因为它本质上是文本格式。 Google protocol buffers效率更高,但需要更多努力才能使其发挥作用。还有其他类似的库,如Thrift