我有一台线程服务器,通常每个客户端一个线程,因此,无论我收到什么数据包,都将来自同一源。

我正在设计基于的协议

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


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

到目前为止,我区分包的唯一方法是根据包的大小。由于服务器和客户端具有相同的结构声明,因此服务器上的sizeof(Packet)将与客户端上的sizeof(Packet)(假定硬件相同)相同,并且在我调用时

 int bytesReceived = recv(...);

 switch (bytesReceived) { (...) }


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

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


每个平台的数据类型大小可能有所不同->服务器与客户端之间可能会发生不匹配
我可能有两个大小相同的不同数据包。


有什么好的解决方法来解决这个问题?如何更好地设计协议?

最佳答案

每个平台的数据类型大小可能有所不同->服务器与客户端之间可能会发生不匹配


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


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


发送数据包长度以及数据包标题中的数据包类型。就像是:

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

关于c - C:recv()—区分包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26512479/

10-09 09:48