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;
}


  • プログラム実行前のipconfig

  • 実行前は、IPアドレス 192.168.1.2 のみが割り当てられている。




  • プログラム実行後のipconfig

  • プログラムを管理者権限で実行すると、以下のように IPアドレスとして 192.168.1.100 が新たに割り当てられる (実行環境はWindows Vista。管理者権限で実行するには、実行ファアイルを右クリックし、ポップアップから「管理者として実行(A)...」をクリックする)。




    参考
    http://msdn.microsoft.com/en-us/library/aa365801(VS.85).aspx