Win32API IPHLPAPI ネットワークアダプタにIPアドレスを追加する AddIPAddress
ネットワークアダプタにIPアドレスを追加するには、IPヘルパーAPIのAddIPAddress関数を用いる。
AddIPAddress関数のプロトタイプ
DWORD AddIPAddress( __in IPAddr Address, //ネットワークアダプタに追加するIPアドレス __in IPMask IpMask, //ネットマスク __in DWORD IfIndex, //ネットワークアダプターのインデックス __out PULONG NTEContext, //追加されたIPv4アドレスのNet Table Entryへのポインタ __out PULONG NTEInstance //追加されたIPv4アドレスのNet Table Entryインスタンスへのポインタ );
第3引数のIfIndexは、GetAdaptersInfo関数により取得したIP_ADAPTER_INFO構造体のIndexメンバの値を指定する。
ADAPTER_INFO構造体は、iptypes.h にて以下のように定義されている。
// // ADAPTER_INFO - per-adapter information. All IP addresses are stored as // strings // typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO* Next; DWORD ComboIndex; char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires; } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
AddIPAddressの使用例は以下のようになる。
#include <windows.h> #include <stdio.h> #include <winsock.h> #include <iphlpapi.h> #pragma comment(lib, "wsock32.lib") #pragma comment(lib, "iphlpapi.lib") int main() { PIP_ADAPTER_INFO pAdapterInfo; ULONG uiOutBuffLen; WCHAR AdapterName[1024] = {L'\0'}; //GetAdaptersInfoの第1引数にNULLを渡して、アダプタ情報を //取得するために確保するメモリサイズをuiOutBuffLenに取得する if (GetAdaptersInfo(NULL, &uiOutBuffLen) != ERROR_BUFFER_OVERFLOW) { puts("GetAdaptersInfo for get buffer length failed."); return 1; } //アダプタ情報を格納するためのメモリを確保 if ( (pAdapterInfo = (IP_ADAPTER_INFO *)malloc(uiOutBuffLen)) == NULL) { puts("malloc failed."); return 1; } //アダプタ情報を取得 if (GetAdaptersInfo(pAdapterInfo, &uiOutBuffLen) != NO_ERROR) { puts("GetAdaptersInfo failed."); return 1; } IPAddr ipv4Addr = inet_addr("192.168.1.100");//追加するIPアドレス IPAddr mask = inet_addr("255.255.255.0");//追加するIPアドレスに対するネットマスク DWORD NTEContext, NTEInstance; //GetAdaptersInfoで取得した1番目のネットワークアダプタインデックスに //IPアドレスを追加する (2番目以降のネットワークアダプタインデックスに //IPアドレスを追加する場合は、pAdapterInfo->Nextでアダプタ情報の //線形リストを手繰る必要がある)。 AddIPAddress(ipv4Addr, mask, pAdapterInfo->Index, &NTEContext, &NTEInstance); //メモリ解放 free(pAdapterInfo); return 0; }
実行前は、IPアドレス 192.168.1.2 のみが割り当てられている。
プログラムを管理者権限で実行すると、以下のように IPアドレスとして 192.168.1.100 が新たに割り当てられる (実行環境はWindows Vista。管理者権限で実行するには、実行ファアイルを右クリックし、ポップアップから「管理者として実行(A)...」をクリックする)。
参考
http://msdn.microsoft.com/en-us/library/aa365801(VS.85).aspx