我正在尝试更改ping 的这种实现,以便可以为消息设置不同的源地址。我想做的-S
与原始 ping 的选项可以做的完全一样:
ifconfig em0 10.0.1.1 netmask 255.255.255.0 alias
ifconfig em0 10.0.2.1 netmask 255.255.255.0 alias
ping -c4 -S 10.0.1.1 10.0.2.1
这当然有效,但我想用 Python 做同样的事情。
我正在尝试更改ping 的这种实现,以便可以为消息设置不同的源地址。我想做的-S
与原始 ping 的选项可以做的完全一样:
ifconfig em0 10.0.1.1 netmask 255.255.255.0 alias
ifconfig em0 10.0.2.1 netmask 255.255.255.0 alias
ping -c4 -S 10.0.1.1 10.0.2.1
这当然有效,但我想用 Python 做同样的事情。
您展示的示例代码使用了一个IPPROTO_ICMP
套接字,它可以使用bind()
.
因此,就在该my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
行之后,您可以添加:
my_socket.bind((your_source_address, 0))
元组中的第二个参数是端口号,似乎被忽略了IPPROTO_ICMP
。
请注意,操作系统可能不允许您将套接字绑定到任意地址,而只能绑定属于您的主机的有效地址,这对于您的用例来说可能已经足够了。如果你想设置一个完全任意的源地址,你可能需要使用一个IPPROTO_RAW
套接字来代替,然后自己构建整个 IP 包头。请参阅此问题以获取一些提示:如何在 Python 中使用原始套接字?