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 への 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]. これにより、プロトコル階層にスタックされる代わりに、2 つの異なるカプセル化が提供されます。

于 2011-07-05T15:33:18.783 に答える