0

我尝试创建一个协议,但我有一些理解问题。我为每一层创建了一个类。然后我创建了一些为我构建数据包的方法,通过将层堆叠在另一个之上。

当我创建一个数据包时:

a=Foo()/Bar() (or a=test())

我得到类似的东西:

<Foo | <Bar |>>,这意味着,据我了解,数据包是封装的(例如IP()/ICMP()在有意义的地方)。现在,我的问题是我想要更多类似的东西:

<Foo |> <Bar |>

我究竟做错了什么?下面是我使用的代码(简化版):

#!/usr/bin/env python
import logging
logging.getLogger("scapy").setLevel(1)
from scapy.all import *

class Foo(Packet):
    name = "Foo packet"
    fields_desc = [ 
                ByteField("foo1", 0x23)
                ]   


class Bar(Packet):
    name = "Bar packet"
    fields_desc = [ 
                ByteField("bar1", 0x42)
                ]   

def test():
    a=Foo()
    b=Bar()
    return a/b

if __name__ == "__main__":
    interact(mydict=globals(), mybanner="test-env")

现在,我不确定“/”是否是这种情况下的正确运算符。我将如何以更好的方式做到这一点?在我的协议中,这些层是独立的,没有被封装。

4

1 回答 1

2

如果您不想Bar在里面Foo,我不明白您为什么不使用列表...例如,这是对 10.2.2.2 的两个 ping 的列表...[IP(dst="10.2.2.2") / ICMP(), IP(dst="10.2.2.2") / ICMP()]

sr([IP(dst="10.2.2.2") / ICMP(), IP(dst="10.2.2.2") / ICMP()])
Begin emission:
........................*Finished to send 2 packets.
......*
Received 32 packets, got 2 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:2 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>

或者在你的情况下return [a, b]...... 这将提供两种不同的封装,而不是将它们堆叠在协议层次结构中

于 2011-07-05T15:33:18.783 回答