我正在尝试更改this implementation of ping,以便为消息设置不同的源地址。
我想要做的与原始ping的-S
选项可以完全相同:
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做同样的事情。
答案 0 :(得分: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数据包头。请参阅此问题以获取一些指示:How Do I Use Raw Socket in Python?