DHCPアドレスを解放する

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

サンプルコード

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

ネットワークインターフェースのリストは、GetInterfaceInfo()関数を利用して取得できます。 IpReleaseAddress()は、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 (IpReleaseAddress(&pInfo->Adapter[i]) == NO_ERROR) {
      printf("released\n");
     } else {
      printf("release 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
released

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

関連情報

DHCP

ipconfig

IPv6基礎検定

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