2011-03-23 59 views
3

我需要使用Python從TCP流套接字讀取完整(原始)IP幀。本質上,我需要一個未經修改的框架,就像它脫離物理線路一樣,包括所有標題信息。如何從Python中的TCP套接字讀取完整的IP幀?

我一直在Python中尋找原始套接字,但我遇到了一些問題。我不需要組建我自己的數據包,我只需要逐字閱讀並轉發它們。

那麼,如何從現有的TCP套接字(在Python中)讀取整個IP幀(包括頭文件)呢?

最好我只想使用標準庫。另外,我在Linux主機上。

謝謝!

+6

您不能「從TCP套接字讀取整個IP幀」(不管使用哪種語言)。 TCP套接字不提供對原始數據包的訪問。您可能需要使用數據包嗅探接口。 – 2011-03-23 19:23:48

+0

那麼,如果我創建了一個TCP服務器,是否可以創建一個連接到TCP端口的原始套接字?無論哪種方式,我認爲我正在建議使用數據包嗅探界面。 – 2011-03-23 19:47:46

+0

原始套接字沒有「端口」語義!在您的TCP服務器中,套接字是在網絡上的圖層上創建的。所有接收到的數據都已被操作系統從較低層剝離。獲取它們的唯一方法是通過嗅探原始數據包並自己確定類型/端口和其他高級語義(或通過某個庫)。 – Santa 2011-03-24 01:25:32

回答

3

如果您不介意使用Scapy,這不是標準庫的一部分,並且超速並非要求,您可以使用它的sniff函數。它需要回調。喜歡的東西:

pkts_rxd = [] 
def process_and_send(pkt): 
    pkts_rxd.append(pkt) 
    sendp(pkt, 'eth1') 
sniff(prn=process_and_send, iface='eth0', count=100) 

您可以在不同的線程或進程運行在呼吸,與count=0如果你希望它永遠跑在隊列粘接收的數據包。只要確保你將str(pkt)放在隊列中。當我在multiprocessing.Queue上放置scapy數據包時,我看到了奇怪的事情。

Debian和Ubuntu在它們的存儲庫中都有Scapy。我不知道rpm發行版。從源代碼安裝相當容易:./setup.py install

+0

感謝您的建議和示例!現在在代碼中試試這個... – 2011-03-23 19:48:21

+0

好吧,這絕對是一種方式。謝謝你的提示! – 2011-03-24 18:01:11