0

我正在尝试更改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 做同样的事情。

4

1 回答 1

3

您展示的示例代码使用了一个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 中使用原始套接字?

于 2012-08-20T13:44:27.823 回答