2012-03-12 88 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家伙可能有自己的。

相关问题