【问题标题】:Netmask/ip-address lookup on BSD/OS XBSD/OS X 上的网络掩码/IP 地址查找
【发布时间】:2013-01-08 13:50:35
【问题描述】:

如何使用 python 标准库函数在 OS X(或 BSD)上进行 ip-address/netmask 等查找。我正在处理一个过程,无法让我的脚本在 Mac 上运行。在 Linux 机器上,这很简单:

ifname = "eth0"
SIOCGIFNETMASK = 0x891b
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.inet_ntoa(fcntl.ioctl(s.fileno(), SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24])

它返回例如网络掩码。在 OS X 上,我收到 Operation not supported on socket 错误:

>>> import socket, fcntl, struct
>>> ifname = "en0"
>>> SIOCGIFNETMASK = 0x891b
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> socket.inet_ntoa(fcntl.ioctl(s.fileno(), SIOCGIFNETMASK, struct.pack('256s', ifname))[20:24])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 102] Operation not supported on socket
>>> 

看起来 SIOCGIFNETMASK、SIOCGIFADDR 等偏移量在 BSD/OS X 系统中是不同的。知道如何解决这个问题吗?已经找到了几篇关于同一问题的帖子,但没有得到明确的答案。任何投入将不胜感激。提前致谢。干杯!!

【问题讨论】:

  • 有趣的 svnweb.freebsd.org/base?view=revision&revision=230207

标签: python linux macos network-programming bsd


【解决方案1】:

我没有 BSD 系统可以尝试,但希望它能工作

socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24])

【讨论】:

  • 我已经尝试过35099,但在 OS X 上出现了同样的错误。无论如何,谢谢!!
  • 你试过 SIOCSFNETMASK 0x891c 吗?
  • 您是否也尝试过 SOCK_STREAM 而不是 SOCK_DGRAM?只是好奇
  • 刚试过0x891c 也不管用;以完全相同的错误失败。看起来SIOCSIFNETMASK 不是 BSD [子] 系统的方式。干杯!!
  • SOCK_DGRAM 相同 - 失败并出现同样的错误。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多