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

問題は、MacOSXおよびその他のBSDシステムがをサポートしていないことSIOCGIFHWADDRです。getifaddrsを使用する必要があります。これは、Pythonでは公開されていないようですが、Linuxでもサポートされています。ただし、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 に答える