包处理程序,或从指针生成类

时间:2014-09-27 16:34:31

标签: c++ networking

我有网络客户端&服务器,可以在一起交流。他们可以向两边发送数据包,但我不知道如何在"右边"方式。

我认识的一些溃败:

  • 预制类的数组(列表)。可以使用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);
}

(别忘了取消它)。

1 个答案:

答案 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);
    ...
}

使用此模式,您可以轻松添加新数据包,并保持统一。