我有一台线程服务器,通常每个客户端一个线程,因此,无论我收到什么数据包,都将来自同一源。
我正在设计基于的协议
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/