【发布时间】:2012-12-15 05:07:46
【问题描述】:
我正在尝试在 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
【问题讨论】:
-
你确定 IOCTL 代码(即
SIOCGIFCONF的实际值)在 OSX 和 Linux 中是一样的吗? -
其实我不是。我试过环顾四周,但似乎找不到 Mac 特定 ioctl 的文档,也找不到标志列表/十六进制值表。 ://
-
找出系统头文件的位置,并在其中搜索文本
SIOCGIFCONF。 -
我查阅了 unix 手册页,上面写着“0x00008912”,这似乎与我使用的相同。我正在检查头文件。
-
@DavidRobertsson 你说得对
SIOCGIFCONF。我想说的是Mac OS X 不支持SIOCGIFHWADDR。我会相应地更新我的答案。谢谢指出!
标签: python macos sockets system-calls ioctl