IpRenewAddress 関数 (iphlpapi.h)
IpRenewAddress 関数は、以前に動的ホスト構成プロトコル (DHCP) を使用して取得した IPv4 アドレスのリースを更新します。
構文
IPHLPAPI_DLL_LINKAGE DWORD IpRenewAddress(
[in] PIP_ADAPTER_INDEX_MAP AdapterInfo
);
パラメーター
[in] AdapterInfo
更新する IP アドレスに関連付けられているアダプターを指定する IP_ADAPTER_INDEX_MAP 構造体へのポインター。
戻り値
関数が成功した場合、戻り値はNO_ERROR。
関数が失敗した場合は、 FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。
リターン コード | 説明 |
---|---|
|
パラメーターの 1 つが無効です。 このエラーは、AdapterInfo パラメーターが NULL の場合、または AdapterInfo パラメーターが指すPIP_ADAPTER_INDEX_MAP構造体の Name メンバーが無効な場合に返されます。 |
|
IPv4 アドレスの更新のために DHCP への要求中に例外が発生しました。 |
|
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。 |
解説
IpRenewAddress 関数は IPv4 に固有であり、動的ホスト構成プロトコル (DHCP) で以前に取得した IPv4 アドレスのみを更新します。 AdapterInfo パラメーターが指すIP_ADAPTER_INDEX_MAP構造体の Name メンバーは、更新する DHCP アドレスを決定するために使用される唯一のメンバーです。
IP_ADAPTER_INDEX_MAP構造体の配列は、GetInterfaceInfo 関数によってIP_INTERFACE_INFO構造体に返されます。 GetInterfaceInfo によって返されるIP_INTERFACE_INFO構造体には、IP_INTERFACE_INFO構造体の NumAdapters メンバーが IPv4 を持つネットワーク アダプターが有効になっていないことを示している場合でも、少なくとも 1 つのIP_ADAPTER_INDEX_MAP構造体が含まれています。 GetInterfaceInfo によって返されるIP_INTERFACE_INFO構造体の NumAdapters メンバーが 0 の場合、IP_INTERFACE_INFO構造体で返される単一のIP_ADAPTER_INDEX_MAP構造体のメンバーの値は未定義です。
AdapterInfo パラメーターが指すIP_ADAPTER_INDEX_MAP構造体の Name メンバーが NULL の場合、IpRenewAddress 関数はERROR_INVALID_PARAMETERを返します。
IPv6 アドレスの解放または更新に使用できる機能はありません。 これを行うには、Ipconfig コマンドを実行する必要があります。
ipconfig /release6
ipconfig /renew6
例
次の例では、ローカル システムで IPv4 が有効になっているネットワーク アダプターの一覧を取得し、リスト内の最初のアダプターの IPv4 アドレスを解放して更新します。
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
/* Note: could also use malloc() and free() */
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
void main()
{
// Before calling IpReleaseAddress and IpRenewAddress we use
// GetInterfaceInfo to retrieve a handle to the adapter
PIP_INTERFACE_INFO pInfo;
pInfo = (IP_INTERFACE_INFO *) MALLOC( sizeof(IP_INTERFACE_INFO) );
ULONG ulOutBufLen = 0;
DWORD dwRetVal = 0;
// Make an initial call to GetInterfaceInfo to get
// the necessary size into the ulOutBufLen variable
if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) {
FREE(pInfo);
pInfo = (IP_INTERFACE_INFO *) MALLOC (ulOutBufLen);
}
// Make a second call to GetInterfaceInfo to get the
// actual data we want
if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR ) {
printf("\tAdapter Name: %ws\n", pInfo->Adapter[0].Name);
printf("\tAdapter Index: %ld\n", pInfo->Adapter[0].Index);
printf("\tNum Adapters: %ld\n", pInfo->NumAdapters);
}
else if (dwRetVal == ERROR_NO_DATA) {
printf("There are no network adapters with IPv4 enabled on the local system\n");
FREE(pInfo);
pInfo = NULL;
return;
}
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("\tError: %s", lpMsgBuf);
}
LocalFree( lpMsgBuf );
return;
}
// Call IpReleaseAddress and IpRenewAddress to release and renew
// the IP address on the first network adapter returned
// by the call to GetInterfaceInfo.
if ((dwRetVal = IpReleaseAddress(&pInfo->Adapter[0])) == NO_ERROR) {
printf("IP release succeeded.\n");
}
else {
printf("IP release failed.\n");
}
if ((dwRetVal = IpRenewAddress(&pInfo->Adapter[0])) == NO_ERROR) {
printf("IP renew succeeded.\n");
}
else {
printf("IP renew failed.\n");
}
/* Free allocated memory no longer needed */
if (pInfo) {
FREE(pInfo);
pInfo = NULL;
}
}
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | iphlpapi.h |
Library | Iphlpapi.lib |
[DLL] | Iphlpapi.dll |