2011-07-04 5 views
0

私はプロトコルを作成しようとしますが、私はいくつかの問題を理解しています。私は すべての層のクラスを作成しました。次に、私のためにパケットを ビルドするいくつかの方法を作成しました。私は、パケットを作成するときscapy independent layers、encapsulationなし

:それは 理にかなって パケットは、例えばIP()/ICMP()のためのような(カプセル化されていることを私の理解に、この手段、

<Foo | <Bar |>>

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

私のような何かを得ます)。今、私の問題は、もっと好きなものを持っていたいということです。

<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") 

は今、私はよく分からない:ここでは私が使用したコード(簡易版)に従います。どのように 私はより良い方法でそれを行うだろうか?私のプロトコルでは、レイヤーは独立していて でカプセル化されていません。

答えて

2

あなたはFoo内部Barしたくない場合は、リストを使用していない理由を、私は理解していない...例えば、これは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つの異なるカプセル化が、プロトコル階層にスタックされずに提供されます。