DHCPを使ってIPアドレスを再取得する

ここでは、IpRenewAddress関数を利用して「ipconfig /renew」と同様の動作をするプログラムの書き方を説明したいと思います。

サンプルコード

以下の例では、全てのネットワークインターフェースのIPアドレスを更新しています。 動作としては「ipconfig /renew」と同様です。

ネットワークインターフェースのリストは、GetInterfaceInfo()関数を利用して取得できます。 IpRenewAddress()は、GetInterfaceInfoで取得したネットワークアダプタ構造体を利用してIPアドレスの更新を行います。


#include <stdio.h>

#include <winsock2.h>
#include <iphlpapi.h>

int
main()
{
 int i;
 PIP_INTERFACE_INFO pInfo = NULL;
 ULONG ulOutBufLen = 0;
 DWORD dwRetVal = 0;

 /* 変数 ulOutBufLen に必要なサイズを取得 */
 if (GetInterfaceInfo(NULL, &ulOutBufLen)
       == ERROR_INSUFFICIENT_BUFFER) {
   pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen);
 }

 /* 実際にデータを取得する */
 dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);

 if (dwRetVal == NO_ERROR ) {
   printf("Number of Adapters: %ld\n\n", pInfo->NumAdapters);

   for (i=0; i<pInfo->NumAdapters; i++) {
     printf("Adapter Name: %ws\n", pInfo->Adapter[i].Name);
     printf("Adapter Index: %ld\n", pInfo->Adapter[i].Index);

     if (IpRenewAddress(&pInfo->Adapter[i]) == NO_ERROR) {
      printf("renewed\n");
     } else {
      printf("renew failed\n");
     }

     printf("\n");
   }
 } else {
   printf("GetInterfaceInfo failed.\n");
   LPVOID lpMsgBuf;
		
   if (FormatMessage(
           FORMAT_MESSAGE_ALLOCATE_BUFFER | 
           FORMAT_MESSAGE_FROM_SYSTEM | 
           FORMAT_MESSAGE_IGNORE_INSERTS,
           NULL,
           dwRetVal,
           MAKELANGID(LANG_NEUTRAL,
                      SUBLANG_DEFAULT), /* Default language */
           (LPTSTR) &lpMsgBuf,
           0,
           NULL ))  {
     printf("Error: %s", lpMsgBuf);
   }

   LocalFree( lpMsgBuf );
 }

 return 0;
}

サンプルコード実行例

上記コードをコンパイルして出来たものを実行すると、以下のようになります。


C:> a.exe
Number of Adapters: 2

Adapter Name: \DEVICE\TCPIP_{22EXXC3D-F01D-4231-AE59-C23EXXXX6C66}
Adapter Index: 2
renewed

Adapter Name: \DEVICE\TCPIP_{4E7XX61B-836C-49AB-8B02-775BXXXX7352}
Adapter Index: 3
renewed

関連情報

DHCP

ipconfig

IPv6基礎検定

YouTubeチャンネルやってます!