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'」に変わるそうです。

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!