如何通过套接字发送ICMP数据包?

Puy*_*ver 3 python sockets

我正在尝试通过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()
Run Code Online (Sandbox Code Playgroud)

如果字符串“ Hello!”,我必须从服务器收到答复。已发送,但我不知道。我想那是“你好!” 字符串将被封装到“数据”字段中:

在此处输入图片说明

Ada*_*eld 5

为了构造ICMP数据包,您必须使用原始套接字自己创建整个数据包。该struct模块对此很有用。

其次,为了首先使用原始套接字,您需要获得许可-您应该以root身份运行(我知道这是一个充分的条件,但我不能100%地确定这是必要条件条件)。该ping(1)可执行文件能够执行此操作,因为它是setuid可执行文件,在您运行时以root身份运行。由于无法在Linux上将脚本设置为setuid,因此您必须在C中创建一个包装setuid程序,该程序仅执行Python脚本。