2

我正在尝试在 Mac 上运行以下函数并且它正在抛出

struct.pack('iL', bytes, names.buffer_info()[0])
IOError: [Errno 102] Operation not supported on socket

它在linux上工作得很好。谁能告诉我发生了什么事?


代码:

def _get_interface_list():
max_iface = 32  # Maximum number of interfaces(Aribtrary)
bytes = max_iface * 32
is_32bit = (8 * struct.calcsize("P")) == 32  # Set Architecture
struct_size = 32 if is_32bit else 40

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
names = array.array('B', '\0' * bytes)
outbytes = struct.unpack('iL', fcntl.ioctl(
    s.fileno(),
    0x8912,  # SIOCGIFCONF
    struct.pack('iL', bytes, names.buffer_info()[0])
))[0]
namestr = names.tostring()
return namestr
4

2 回答 2

5

问题是 Mac OS X 和其他 BSD 系统不支持SIOCGIFHWADDR. 您必须使用getifaddrs,现在 Linux 也支持它,尽管 Python 似乎没有公开它。但是,您可以使用ctypes来完成此操作。我希望这个例子(BSD 风格的许可证)对你有所帮助。

此外,您可以通过使用netifaces来避免所有麻烦。

于 2012-12-31T00:55:19.107 回答
0

在 OS X 10.9 上,SIOCGIFCONF 的标志值是 0xc00c6924。

更新

我做了一些小测试,并没有抛出任何错误。我不确定它是否 100% 工作,但我也从 Apple 找到了这个:https ://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man4/ip.4.html where "addr" is the local IP address of the desired interface or INADDR_ANY to specify the default interface. An interface's local IP address and multicast capability can be obtained via the SIOCGIFCONF and SIOCGIFFLAGS ioctls. Normal applications should not need to use this option.

于 2014-06-28T23:08:35.190 回答