2012-03-12 122 views
3

我想通過ICMP數據包發送消息,但我不知道該怎麼做。如何通過套接字發送ICMP數據包?

這是我目前擁有的代碼,但顯然是行不通的:「你好!」

s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) 
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1) 
s.settimeout(3.0) 
s.sendto("Hello!" + "\r\n", (server, 7)) 
msg = s.recvfrom(buff_size) 
s.close() 

我必須從服務器字符串是否收到答案發送,但我不明白。 我想,「你好!」字符串將被封裝成數據字段:

enter image description here

回答

4

爲了構建ICMP數據包,您必須使用原始套接字自己創建整個數據包。 struct module對此很有用。其次,爲了甚至使用原始套接字,你需要有權限這麼做 - 你應該以root身份運行(我知道這是一個充分的條件,但我不是100%確定的這是必要的條件)。 ping(1)可執行文件能夠執行此操作,因爲它是一個setuid可執行文件,它在運行時以root用戶身份運行。由於腳本無法在Linux上運行setuid,因此您必須在C中創建一個包裝程序setuid程序,該程序只執行您的Python腳本。

1

我不認爲SOCK_RAW走向的ICMP數據報給你,因爲你設置的協議字段來IPPROTO_ICMP!你必須自己構建數據包。

看看ping的來源。

在GNU/Linux操作系統中有(至少)兩種流行包,提供ping。一個是netkit,另一個是iputils。 (netkit-combo是一個包含所有netkit實用程序的tarball:telnet,FTP,...)* BSD傢伙可能有自己的。

相關問題