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