使用套接字复制struct

时间:2014-07-30 05:31:30

标签: c sockets network-programming

如何在网络套接字上复制struct?我想在套接字上交换以下类型的struct

struct msg{
  char *from;
  char *to;
  int size;
};
struct msg m1={"me","you",20};

int sd=socket(AF_INET,SOCK_STREAM,0);
send(sd,&m1,sizeof(struct msg),0);

然而,我无法理解另一方收到的价值。尝试将结构字段从指针更改为固定大小的数组,但这也无济于事。

1 个答案:

答案 0 :(得分:1)

您的实施存在一些问题。 您需要了解的是,线路上的数据(通信链路)只是一个字节数组,它取决于链路两侧的平台,将它们解析为更有意义的内容。这意味着将数据序列化到通信介质并将其反序列化为人类可读格式必须彼此匹配以及在每一侧使用的平台。例如,从小端平台发送到大端平台(intel到motorolla)而不需要处理字节切换将导致另一端的数据完全混乱。

回到你的例子,你天真地将指针传递给你的结构,好像它是一个字符数组。这假设分配给变量的内存是连续的,但不一定是这种情况。另外,每边的环境存在字节对齐的问题,这意味着除非在两端都设置为1,否则发送端的编译器可能会将一些变量填充为零值,导致另一方读取它们如果将其设置为不同的字节对齐方式,则会有所不同。

总结一下: 为了使其安全地工作,您需要将变量显式复制到发送缓冲区,并在另一侧显式读取它们。你还应该确保你在两边使用相同的平台(我假设你有两个智能)。 顺便说一句,在处理字符串时,你需要确保复制尾部0,所以当你试图读取另一边的字符串时,它会正确读取。