Win32 IPLHLPAPI GetInterfaceInfoを使う
ここでは、Windows環境でネットワークインターフェース情報を取得する方法を説明したいと思います。 Win32APIを利用するとWindowsのNative APIを使えますが、ここではネットワーク情報を取得するためのIPHLPAPI(IP Helper API)を利用します。 (IP Helper APIに関しては「VC++ IP Helper APIプログラミング解説」をご覧下さい。)
サンプル
以下、サンプルです。 解説はソースコード中に記述しています。
#!/usr/bin/ruby
require 'Win32API'
#require 'dl/win32'
# iphlpapi GetInterfaceInfoオブジェクトを生成
GetInterfaceInfo = Win32API.new('iphlpapi',
'GetInterfaceInfo', %w(p p), 'i')
# 32ビットint
intPtr = "\0" * 4;
# NULLを渡してintPtrに必要サイズを入れてもらう
GetInterfaceInfo.call(nil, intPtr)
# 返ってきた必要サイズを整数へunpack
sz = intPtr.unpack('i')
# mallocのつもり
# IP_INTERFACE_INFO
ptr = "\0" * sz[0]
# 本番呼び出し
GetInterfaceInfo.call(ptr, intPtr)
# アダプタ数をゲット
numAdapters, = ptr.unpack('i')
p numAdapters
# 各アダプタの情報を取得していく
i = 0
while i < numAdapters
# IP_ADAPTER_INDEX_MAP
adapterIndex, = ptr[4+i*(256+4),4].unpack('i')
adapterName, = ptr[4+i*(256+4)+4, 128];
p adapterIndex
p adapterName
i = i + 1
end
「require 'Win32API'」は将来「require 'dl/win32'」に変わるそうです。