2011-07-04 68 views
0

我嘗試創建一個協議,並且我有一些理解問題。我爲 創建了每個圖層的類。然後,我創建了一些方法,爲我構建 數據包,方法是將這些層疊在一起。scapy獨立層,沒有封裝

當我創建一個包:

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

現在,我不知道,如果「/」是這種情況下,正確的操作。 如何以更好的方式做到這一點?在我的協議中,這些層是獨立的 而不是封裝的。

回答

2

如果你不想BarFoo做,我不明白你爲什麼不使用列表...比如這是兩坪至10.2.2.2列表... [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]。這將提供兩種不同的封裝,而不是將它們堆疊在協議層次結構中