使用dispatch_hook()

2024-09-24 08:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用dispatch_hook()链接不同层。我有这样的包裹。我只想知道是否有更好的方法使用dispatch_hook()来完成此操作。在

这就是我如何制作我的包裹:

>>>> pkt=PCEPCommonHeader(Type=6)/PCEPErrorMsg(error_objects=[PCEPErrorObject()])

>>> pkt.show()
###[ PCEP common header ]###
  Version= 1
  Flags= 0
  Type= PCEPErrorMsg
  Length= None
###[ PCEPErrorMsg ]###
     \error_objects\
      |###[ PCEP-ERROR OBJECT ]###
      |  \common_object_header\
      |   |###[ PCEP Common Object Header ]###
      |   |  oclass= PCEP-ERROR
      |   |  oType= 1
      |   |  resflags=
      |   |  pflag=
      |   |  iflag=
      |   |  obLength= 4
      |  Reserved= 0
      |  flags= 0
      |  ET= 0
      |  EV= 0
>>>  

代码剪贴:

^{pr2}$

Tags: 方法objects链接typeerrorcommonhookheader
1条回答
网友
1楼 · 发布于 2024-09-24 08:35:24

.dispatch_hook()背后的思想是有一个主类,我们称它为Protocol,它继承(直接或不)自Packet,并有派生类(直接或不继承自Protocol或{});假设我们有Protocol1和{}。在

当您(或Scapy)通过调用Protocol()实例化类时,将调用.dispatch_hook()方法。它使用与传递给Protocol()的完全相同的参数进行调用,并返回将要(真正)使用的类。在

让我们举一个真实的例子,来自Scapy代码。Ether()(Ethernet v2)和Dot3()()是非常相似的第二层协议:都以6字节的目的地址开始,然后是6字节的源地址。Ether()接下来的两个字节是有效负载的类型,而Dot3()接下来的两个字节是包的大小。因为一个数据包不能超过1500个字节,而且以太网类型不能少于1500个(至少要精确到1536个)。在

来自Scapy代码(文件scapy/layers/l2.py):

class Ether(Packet):
    [...]
    @classmethod
    def dispatch_hook(cls, _pkt=None, *args, **kargs):
        if _pkt and len(_pkt) >= 14:
            if struct.unpack("!H", _pkt[12:14])[0] <= 1500:
                return Dot3
        return cls

class Dot3(Packet):
    [...]
    @classmethod
    def dispatch_hook(cls, _pkt=None, *args, **kargs):
        if _pkt and len(_pkt) >= 14:
            if struct.unpack("!H", _pkt[12:14])[0] > 1500:
                return Ether
        return cls

如果需要,可以找到一个更复杂和完整的示例in TorPylle,它是Scapy中TOR协议的实现。在

相关问题 更多 >