2014-04-02 64 views
2

我想寫一個嗅探所有傳入TCP數據包的數據包嗅探器。在我查找的一個示例中,而不是使用SOCK_RAW而不是SOCK_STREAM?python3中的原始套接字

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 
except socket.error as e: 
    print('Socket creation failed. Error Code {} Message {}'.format(str(e[0]),str(e[1]))) 
    sys.exit() 

#Include IP headers 
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 
packet = s.recvfrom(65565) 

1)在上述情況下,我可以使用SOCK_STREAM而不是SOCK_RAW。 2)recvfrom(65565)是什麼意思? 這是否意味着從所有TCP端口recv而不是特定的TCP端口?

回答

1
  1. 如果使用SOCK_STREAM而不是SOCK_RAW,則不能讀取協議標題,而只能讀取通過TCP傳輸的數據。另一方面,SOCK_RAW將允許您訪問完整的數據包標題。就你而言,如你想建立自己的協議分析器(嗅探器),SOCK_RAW應該是你的選擇。

  2. 的方法定義recvfrom是:

    socket.recvfrom(BUFSIZE [,標誌])

    從插座接收數據。返回值是一個對(字符串, 地址),其中 字符串是接收表示所述數據的字符串和地址是 套接字發送的

此方法僅接收最大bufsize字節數據的地址從插座。

+0

recvfrom()會從所有的TCP端口接收數據?套接字抽象如何與端口配合使用? – liv2hak

+1

由於端口是TCP和UDP的概念,因此不會從原始套接字的端口接收數據*。套接字將接收所有具有指定IPPROTO_ *的數據包(在您的情況下爲IPPROTO_TCP)。 –