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
関連情報