我有一个线程服务器,通常每个客户端一个线程,所以我收到的任何数据包都来自同一个源。
我正在设计一个基于
的协议struct Packet
{
int Data;
char Data2 [size];
} Packet;
以及我可能需要的任何其他排列。
到目前为止,我能够区分数据包的唯一方法是基于它们的大小。由于服务器和客户端都具有相同的结构声明,服务器上的sizeof(Packet)将与客户端上的sizeof(数据包)(假设相同的硬件)相同,并且当我调用时
int bytesReceived = recv(...);
switch (bytesReceived) { (...) }
我可以将缓冲区传递给特定于数据包的函数来处理它。
这充其量是不完美的,因为
这个问题的解决方法是什么?如何以更好的方式设计协议?
答案 0 :(得分:1)
每个平台的数据类型大小可能不同 - >服务器和客户端之间可能会出现不匹配的情况
使用<stdint.h>
中的类型,例如uint32_t
。另外,请确保维护协议字节顺序(小端或大端),以便在平台的字节顺序不同时,在发送之前和接收之后反转整数。
我可能有两个相同大小的不同数据包。
在数据包标头中发送数据包长度和数据包类型。类似的东西:
+----------------+--------------+----------------------------+
| message-length | message-type | message-payload |
| 4 bytes | 2 bytes | (message-length - 6) bytes |
+----------------+--------------+----------------------------+