你的问题表述暗示着你所需要的是这个:
company foo;
send(sockfd, &foo, sizeof(foo), 0); // DO NOT do this
这将基本上把company
结构体的所有内存转储到您的套接字中。在这种情况下,这不起作用。即使它有点可行,这是一个非常糟糕的想法。它不起作用的原因是vector
不直接包含数据。它们指向数据。这意味着当您将包含向量的结构体转储到套接字时,您将转储指向内存的指针,而不是指向的内容。这将导致(在最好的情况下)在接收端崩溃。
对于单个person
或car
对象,它可能会有些作用。它们不包含指针,因此它们的内存包含所有相关值。
在发送方:
person joe = { "Joe", 35 };
send(sockfd, &joe, sizeof(joe), 0); // may work, but is a bad idea, see below
接收方需要:
person joe;
recv(sockfd, &joe, sizeof(joe), 0);
但是,这仍然是个坏主意。它依赖于发送端和接收端具有完全相同的结构体内存布局。由于许多原因,这可能不是真实的情况。一些原因包括一个在PowerPC芯片上,另一个在Intel x86芯片上。或者一个在使用Visual Studio编译的Windows机器上,另一个在使用gcc编译的Linux机器上。或者可能有人对编译器标志进行了某些调整,导致默认的结构布局不同。有很多原因。
实际上,你应该使用像大家建议的序列化框架。我建议使用Google protocol buffers或其他人已经链接的Boost序列化框架。但还有许多其他的选择。
另一个应该提及的序列化框架是Cap'n Proto,因为它非常快(几乎和直接将结构体的内存映像倒入套接字一样快)。