C:recv() - 区分数据包

时间:2014-10-22 16:33:33

标签: c network-programming network-protocols

我有一个线程服务器,通常每个客户端一个线程,所以我收到的任何数据包都来自同一个源。

我正在设计一个基于

的协议
struct Packet
{
     int Data;
     char Data2 [size];
} Packet;

以及我可能需要的任何其他排列。

到目前为止,我能够区分数据包的唯一方法是基于它们的大小。由于服务器和客户端都具有相同的结构声明,服务器上的sizeof(Packet)将与客户端上的sizeof(数据包)(假设相同的硬件)相同,并且当我调用时

 int bytesReceived = recv(...);

 switch (bytesReceived) { (...) }

我可以将缓冲区传递给特定于数据包的函数来处理它。

这充其量是不完美的,因为

  1. 每个平台的数据类型大小可能不同 - >服务器和客户端之间可能出现不匹配的情况
  2. 我可能有两个相同大小的不同包。
  3. 这个问题的解决方法是什么?如何以更好的方式设计协议?

1 个答案:

答案 0 :(得分:1)

  

每个平台的数据类型大小可能不同 - >服务器和客户端之间可能会出现不匹配的情况

使用<stdint.h>中的类型,例如uint32_t。另外,请确保维护协议字节顺序(小端或大端),以便在平台的字节顺序不同时,在发送之前和接收之后反转整数。

  

我可能有两个相同大小的不同数据包。

在数据包标头中发送数据包长度和数据包类型。类似的东西:

+----------------+--------------+----------------------------+
| message-length | message-type | message-payload            |
| 4 bytes        | 2 bytes      | (message-length - 6) bytes |
+----------------+--------------+----------------------------+