使用 C 中的 UDP 套接字将结构从客户端传递到服务器
Passing a struct from client to server using UDP sockets in C
在 C 语言中如何使用套接字将结构从 UDP 客户端传递到 UDP 服务器?您如何访问服务器上结构包含的变量?如果传输的是下面的结构,服务器如何看到姓名或年龄是什么?
struct animal {
int age;
char name[25];
};
你写入UDP数据包缓冲区的是从结构地址开始的结构内容。接收端应将接收到的数据复制到相同大小的缓冲区中,然后将其转换为完全相同的结构,以完全相同的方式定义。
正确的答案是使用 Google Protobuf 之类的东西,这将保护您免受字节序、整数大小以及服务器和客户端版本之间结构的未来变化的影响。这是一个将您的结构成员打包成中性数据包格式的库,然后可以在另一端进行解析。
然而,对于学习低级 UDP 套接字的人来说,在两台相同的机器之间发送这样的结构很简单:
send( sock, &myanimal, sizeof( myanimal ), 0 );
在服务器上:
recv( sock, &newanimal, sizeof( myanimal ), 0 );
(对未连接的 UDP 套接字使用 sendto
和 recvfrom
)。
这将创建一个字节对字节的副本,其工作方式与 memcpy()
一样。如果您的主机不匹配,则该副本可能与您的结构不一致。但如果他们这样做,您将像在客户端上一样在服务器上访问它。
您可以使用 socketpair()
在您自己的进程中创建套接字的两端(很像 pipe()
)并测试它,甚至无需构建 UDP 部分。在那里工作后,继续使用 UDP。
在 C 语言中如何使用套接字将结构从 UDP 客户端传递到 UDP 服务器?您如何访问服务器上结构包含的变量?如果传输的是下面的结构,服务器如何看到姓名或年龄是什么?
struct animal {
int age;
char name[25];
};
你写入UDP数据包缓冲区的是从结构地址开始的结构内容。接收端应将接收到的数据复制到相同大小的缓冲区中,然后将其转换为完全相同的结构,以完全相同的方式定义。
正确的答案是使用 Google Protobuf 之类的东西,这将保护您免受字节序、整数大小以及服务器和客户端版本之间结构的未来变化的影响。这是一个将您的结构成员打包成中性数据包格式的库,然后可以在另一端进行解析。
然而,对于学习低级 UDP 套接字的人来说,在两台相同的机器之间发送这样的结构很简单:
send( sock, &myanimal, sizeof( myanimal ), 0 );
在服务器上:
recv( sock, &newanimal, sizeof( myanimal ), 0 );
(对未连接的 UDP 套接字使用 sendto
和 recvfrom
)。
这将创建一个字节对字节的副本,其工作方式与 memcpy()
一样。如果您的主机不匹配,则该副本可能与您的结构不一致。但如果他们这样做,您将像在客户端上一样在服务器上访问它。
您可以使用 socketpair()
在您自己的进程中创建套接字的两端(很像 pipe()
)并测试它,甚至无需构建 UDP 部分。在那里工作后,继续使用 UDP。