【问题标题】:How to set a source address for ICMP messages in Python?如何在 Python 中为 ICMP 消息设置源地址?
【发布时间】:2012-08-15 19:37:58
【问题描述】:

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

【问题讨论】:

  • 你在哪里挂机?你试过什么?

标签: python ping icmp source-address


【解决方案1】:

您展示的示例代码使用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?

【讨论】:

  • 非常感谢!我认为这正是我所需要的。我不理解这种方式的 bind() 函数。我会尽力让你知道。
  • @gcomte 如果它有助于解决问题,请将问题标记为已回答,这样它可以帮助其他人。
  • 不行...socket.error: [Errno 49] Can't assign requested address
  • @gcomte:此错误消息表示操作系统拒绝您尝试设置的地址。也许你它不属于你的主机,或者只是因为如果你将端口号设置为 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多