Mac OS 上的 Python ioctl 错误

标签 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

最佳答案

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

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

关于Mac OS 上的 Python ioctl 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094835/

相关文章:

c++ - 在不相关的进程之间共享套接字(监听)

sockets - 套接字操作成功后的SO_ERROR值

python - 识别满足条件的 DataFrame 索引对象

python - 如何使用 pandas 系列获取 .get_else ?

python - 是否可以根据对单个 pandas DataFrame 列的查询跨行进行多次更新

objective-c - Lion 不会运行使用 Mountain Lion 构建的应用程序

macos - Mac动态库中的动态符号表?

python - Python如何按降序排列每个字母的出现频率?

cocoa - 如何将我的 OSX Cocoa 应用程序与 facebook 连接?

python - 在 python 中监听已用于 UDP 数据包的端口?