我有网络客户端&服务器,可以在一起交流。他们可以向两边发送数据包,但我不知道如何在"右边"方式。
我认识的一些溃败:
预制类的数组(列表)。可以使用Map。
开关(PacketID)案例1:....我认为这解释了自己
尝试制作像Java一样的枚举类。它将成为第一个解决方案。
什么是数据包处理程序的最佳解决方案?什么是最快的?什么方法最容易编码?
也许有人在C ++中有很好的PacketHandling示例,beacos我没有在交换机旁找到。
编辑: C ++中的开关是O(1),所以它们是快速的! (只有一次跳跃+检查)
但是,您需要具有1个写入数据包功能,一个读取功能和一个执行功能。太多了,不是吗?你需要3差异。所有这些案件。
还有其他方法(使用开关),即#34;简单":
#define PACKET_ADDCASE(x,y) case PACKETS::x: x(CASE_ACTION, y);
#define PACKET_CHECKER(x,y) switch(x) { \
PACKET_ADDCASE(PacketDef, y)\
PACKET_ADDCASE(PacketPing, y)\
PACKET_ADDCASE(PacketJoin, y)\
\
case default: std::cout << "Error! Bad packet ID!"; }
void readPacket(PacketData p)
{
#define CASE_ACTION ReadPacket
PACKET_CHECKER(PacketID, p);
}
(别忘了取消它)。
答案 0 :(得分:0)
IMO除非您使用普通数据包路由器,否则通常不需要对(解)打包器进行特殊优化。
对我来说,我有一个基本的序列化程序类,以及每个数据包的扩展类,如下所示:
switch ( Packet::get_id(buffer, buflen) ) {
case kPacket_Foo: return doPacket_Foo(buffer, buflen);
case kPacket_Bar: return doPacket_Bar(buffer, buflen);
...
}
int doPacket_Foo(const uint8_t* buffer, size_t buflen) {
PacketFoo p;
if ( p.read_from(buffer, buflen) < 0 ) return -1;
printf ("foo = %d\n", p.dummy);
...
}
int doPacket_Bar(const uint8_t* buffer, size_t buflen) {
PacketBar p;
if ( p.read_from(buffer, buflen) < 0 ) return -1;
printf ("foo = %d\n", p.bar);
...
}
使用此模式,您可以轻松添加新数据包,并保持统一。