Win32環境でDHCPアドレスを取得

ここでは、Windows環境においてDHCPでIPアドレスを取得(もしくは更新)する方法を説明したいと思います。

サンプル

Win32API経由でIPHLPAPI(IP Helper API)を利用すると、DHCPでIPアドレスを取得できます。 詳細はコード中にコメントとして記述しています。


#!/usr/bin/ruby

require 'Win32API'
#require 'dl/win32'

# IPHLPAPIを利用するための準備
GetInterfaceInfo = Win32API.new('iphlpapi', 'GetInterfaceInfo', %w(p p), 'i')
IpRenewAddress = Win32API.new('iphlpapi', 'IpRenewAddress', %(p), 'i')

# 32ビットint
intPtr = "\0" * 4;

# 必要なサイズを調べるためにNULLで呼び出し
GetInterfaceInfo.call(nil, intPtr)

# 必要なサイズがintPtrに入っているのでゲット
sz = intPtr.unpack('i')

# mallocのつもり
ptr = "\0" * sz[0]

# 本番呼び出し
GetInterfaceInfo.call(ptr, intPtr)

# アダプタの数をゲット
numAdapters, = ptr.unpack('i')
p numAdapters

# 全てのネットワークアダプタに対してDHCP IPアドレス取得処理
i = 0
while i < numAdapters

  # 情報を確認用
  # この部分が無くてもDHCPでIPアドレス取得はできます
  adapterIndex, = ptr[4+i*(256+4),4].unpack('i')
  adapterName, = ptr[4+i*(256+4)+4, 128];
  p adapterIndex
  puts adapterName

  # DHCPでIPアドレスを取得(更新)
  # 指定するネットワークアダプタに関する情報は
  # GetInterfaceInfoで取得したもの

  puts "renew\n"
  adapterPtr = ptr[4+i*(256+4), 256+4];
  IpRenewAddress.call(adapterPtr)

  i = i + 1
end


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

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