1

我正在用gopacket编写自定义层解码器。

LayerA包含一个Type可以是以下值之一的字段:

  • B-only,下一层是LayerB,后面是原始有效载荷
  • C-only,下一层是LayerC,后面是原始有效载荷
  • BC,下一层是LayerB,然后是LayerC ,然后是原始有效负载

LayerB中没有字段可以用来知道LayerC是否是下一个。LayerBLayerC解码不依赖于其他层是否存在。

编写LayerA的解码函数的正确方法是什么,因为它知道下一层是什么?

关于使用gopacket自定义层的教程并不多,而且这种情况与那里介绍的基本情况不同。

看来逻辑应该放在LayerA解码函数中,就在调用p.NextDecoder.

我想到了两种方法来实现这一点:

1.使用闭包

nextDecoder Decoder向结构LayerB添加一个字段。在LayerA的解码器中,当TypeC-only时,只需使用LayerC的解码器。否则,创建一个结构LayerB并相应地填充该字段nextDecoder。然后在闭包中使用这个结构,它将用作下一个解码器。

问题

LayerB的解码逻辑将在LayerA解码函数中(参见下面 Palyground 中的代码)。此外,在注册LayerB时使用哪个解码函数gopacket.RegisterLayer

2.有两个单独的层LayerB-C和LayerB-only

LayerB-C下一个解码器将是LayerC's,LayerB-only将只是有效载荷层。

问题

LayerB-onlyLayerB-C的解码功能是一样的,除了调用p.NextDecoder. 由于 go 中没有“继承”的概念,我不确定如何设计它以避免重复。也许创建一个带有函数的基于LayerB 的接口nextDecoder() LayerType,并让LayerB-CLayerB-only实现它?还是嵌入具有功能的类型LayerB-baseDecode?但他们都感觉不对劲。

代码

以下是每种描述方式的一些代码:https: //play.golang.org/p/N9ZpYqFb16Q。图层的实际内容不相关,除了LayerA.Type.

这段代码的结果符合预期,但我想知道是否有更好或更惯用的方法。

4

1 回答 1

0

您可以通过将下一层声明为接口来做到这一点,该接口可以支持 B 或 C。只要您声明的任何内容都适合 LayerType,这应该可以正常工作。

于 2020-03-05T09:58:56.930 回答