C++ 数据包处理程序,或从指针生成类

C++ 数据包处理程序,或从指针生成类,c++,networking,C++,Networking,我有网络客户端和服务器,可以一起通信。他们可以向两边发送数据包,但我不知道如何以“正确”的方式处理数据包 我知道的一些失败: 预先制作的类的数组(它们的列表)。我可以用地图 开关(PacketID)外壳1:。。。。我想这就是原因 尝试使enum类与Java类似。这将是第一个解决方案 包处理程序的最佳解决方案是什么?什么是最快的?最简单的编码方法是什么 也许有人在C++中有好的打包例子,BeACOS我在交换机旁边没有找到。 编辑: C++中的开关是O(1),所以它们是快速实现的!(仅一次跳转+

我有网络客户端和服务器,可以一起通信。他们可以向两边发送数据包,但我不知道如何以“正确”的方式处理数据包

我知道的一些失败:

  • 预先制作的类的数组(它们的列表)。我可以用地图

  • 开关(PacketID)外壳1:。。。。我想这就是原因

  • 尝试使enum类与Java类似。这将是第一个解决方案

包处理程序的最佳解决方案是什么?什么是最快的?最简单的编码方法是什么

也许有人在C++中有好的打包例子,BeACOS我在交换机旁边没有找到。 编辑: C++中的开关是O(1),所以它们是快速实现的!(仅一次跳转+检查)

但是,您需要有一个写包函数、一个读函数和一个执行函数。太多了,不是吗?所有这些都需要3个不同的箱子

还有另一种方法(使用switch),即“简单”:

\define PACKET\u ADDCASE(x,y)case PACKETS::x:x(case\u ACTION,y);
#定义数据包检测器(x,y)交换机(x){\
数据包添加情况(数据包定义,y)\
包装箱(包装,y)\
数据包地址(数据包连接,y)\
\

case default:std::coutIMO除非您是为普通分组路由器工作,否则通常不需要对(去)分组器进行特殊优化

对于我来说,我有一个基本序列化程序类,每个数据包都有一个扩展类,如下所示:

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);
    ...
}
交换机(数据包::get_id(缓冲区,buflen)){
案例kPacket_Foo:返回doPacket_Foo(buffer,buflen);
案例K包装条:返回包装条(缓冲器,buflen);
...
}
int-doPacket\u-Foo(常数为8*buffer,大小为buflen){
PacketFoo p;
if(p.read_from(buffer,buflen)<0)返回-1;
printf(“foo=%d\n”,p.dummy);
...
}
int doPacket\u Bar(常数为8*BUFFLEN大小的缓冲区){
包装条p;
if(p.read_from(buffer,buflen)<0)返回-1;
printf(“foo=%d\n”,p.bar);
...
}

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

谷歌搜索,我认为这是最好的方法…使用我的define struct-这将是最简单的方法,而且速度也很快。对于这样简单的宏/文本替换,我建议不要使用
#define
。简单的
案例XXX:
可读性更强,大家都知道ws什么是
case
,但是对于
PACKET\u ADDCASE
,你必须在其他地方查找它的实际含义。查找上面的一行,是的,这将是一个大问题;)顺便说一句,我可以将它命名为CCASE,或者其他一些东西,如果它不是那么容易理解的话。
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);
    ...
}