GetAdaptersInfo を使用したネットワーク アダプターの管理

GetAdaptersInfo 関数は、システムに関連付けられているネットワーク アダプターに関する情報をIP_ADAPTER_INFO構造体へのポインターを入力します。

GetAdaptersInfo を使用するには

  1. pAdapterInfo というIP_ADAPTER_INFO変数へのポインターと、ulOutBufLen という ULONG 変数を宣言します。 これらの変数は、 パラメーターとして GetAdaptersInfo 関数に渡されます。 また、dwRetVal という名前の DWORD 変数を作成します (エラー チェック用)。

    IP_ADAPTER_INFO  *pAdapterInfo;
    ULONG            ulOutBufLen;
    DWORD            dwRetVal;
    
    
  2. 構造体にメモリを割り当てます。

    pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
    ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    
    
  3. GetAdaptersInfo を最初に呼び出して、必要なサイズを ulOutBufLen 変数に取得します。

    注意

    この関数の呼び出しは失敗することを目的としており、pAdapterInfo に返されるすべての情報を保持するのに十分なサイズを ulOutBufLen 変数で指定するために使用されます。 これは、この型のデータ構造と関数の一般的なプログラミング モデルです。

     

    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) {
        free (pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen );
    }
    
    
  4. GetAdaptersInfo を 2 回目に呼び出し、pAdapterInfoulOutBufLen をパラメーターとして渡し、一般的なエラー チェックを行います。 その値を DWORD 変数 dwRetVal に返します (より広範なエラー チェックを行う場合)。

    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) {
        printf("GetAdaptersInfo call failed with %d\n", dwRetVal);
    }
    
    
    
  5. 呼び出しが成功した場合は、 pAdapterInfo 構造体のデータの一部にアクセスします。

    PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
    while (pAdapter) {
        printf("Adapter Name: %s\n", pAdapter->AdapterName);
        printf("Adapter Desc: %s\n", pAdapter->Description);
        printf("\tAdapter Addr: \t");
        for (UINT i = 0; i < pAdapter->AddressLength; i++) {
            if (i == (pAdapter->AddressLength - 1))
                printf("%.2X\n",(int)pAdapter->Address[i]);
            else
                printf("%.2X-",(int)pAdapter->Address[i]);
        }
        printf("IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String);
        printf("IP Mask: %s\n", pAdapter->IpAddressList.IpMask.String);
        printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
        printf("\t***\n");
        if (pAdapter->DhcpEnabled) {
            printf("\tDHCP Enabled: Yes\n");
            printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String);
        }
        else
          printf("\tDHCP Enabled: No\n");
    
      pAdapter = pAdapter->Next;
    }
    
    
  6. pAdapterInfo 構造体に割り当てられたメモリを解放します。

    if (pAdapterInfo)
            free(pAdapterInfo);
    
    

次の手順: GetInterfaceInfo を使用したインターフェイスの管理

前の手順: GetNetworkParams を使用した情報の取得