Mac OS上的Python ioctl错误

时间:2012-12-30 21:27:42

标签: python macos sockets system-calls ioctl

我正在尝试在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

2 个答案:

答案 0 :(得分:5)

问题是Mac OS X和其他BSD系统不支持SIOCGIFHWADDR。你必须使用 getifaddrs ,现在Linux也支持它,尽管它似乎没有被Python公开。但是,您可以使用 ctypes 来实现这一目标。我希望 this example (BSD风格的许可证)可以帮助您。

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

答案 1 :(得分: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.