我尝试创建一个协议,我有一些理解问题。一世 为每一层创建了一个类。然后我创建了一些构建的方法 通过将这些层一个堆叠在另一个上面来为我提供数据包。
创建数据包时:
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")
现在,我不确定“/”对于这种情况是否是正确的运算符。怎么样 我会以更好的方式做到吗?在我的协议中,层是独立的 而不是封装。
答案 0 :(得分: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]
。这将提供两个不同的封装,而不是它们堆叠在协议层次结构中