2013-06-25 5 views
2

IPv4 주소가 주어지면 C++을 사용하는 Windows에서 "이더넷 어댑터 로컬 영역 연결"과 같은 관련 네트워크 인터페이스 이름을 얻는 방법은 무엇입니까? 또는 로컬 컴퓨터의 네트워크 인터페이스 이름과 IPv4 주소 목록을 얻는 방법은 무엇입니까? 나는 getaddrinfoinet_ntoa을 사용하는 IPv4 주소 만 얻을 수있다.IPv4 주소에서 네트워크 인터페이스 이름 가져 오기

+0

는 플랫폼에 따라 달라집니다. 예를 들어, Windows에서는 GetAdaptersInfo를 사용해야합니다. – mattn

+0

@mattn GetAdaptersInfo에 대한 설명서에 XP 이상에서 GetAdaptersAddresses를 사용한다고 나와 있습니다. 이것이 선호됩니까? –

+0

예, XP 이상에서 작동하도록하려면 GetAdaptersAddresses를 사용하는 것이 좋습니다. – mattn

답변

9
#include <windows.h> 
#include <iphlpapi.h> 
#include <stdio.h> 

#pragma comment(lib, "iphlpapi.lib") 

int 
main(int argc, char** argv) { 
    PIP_ADAPTER_INFO pAdapterInfo; 
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO)); 
    ULONG buflen = sizeof(IP_ADAPTER_INFO); 

    if(GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { 
    free(pAdapterInfo); 
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc(buflen); 
    } 

    if(GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) { 
    PIP_ADAPTER_INFO pAdapter = pAdapterInfo; 
    while (pAdapter) { 
     printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName); 
     printf("\tAdapter Desc: \t%s\n", pAdapter->Description); 
     printf("\tAdapter Addr: \t%ld\n", pAdapter->Address); 
     printf("\tIP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String); 
     printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String); 
     printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String); 
     if(pAdapter->DhcpEnabled) { 
     printf("\tDHCP Enabled: Yes\n"); 
     printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String); 
     printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained); 
     } else { 
     printf("\tDHCP Enabled: No\n"); 
     } 
     if(pAdapter->HaveWins) { 
     printf("\tHave Wins: Yes\n"); 
     printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String); 
     printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String); 
     } else { 
     printf("\tHave Wins: No\n"); 
     } 
     pAdapter = pAdapter->Next; 
    } 
    } else { 
    printf("Call to GetAdaptersInfo failed.\n"); 
    } 
} 
5

나뿐만 아니라 내 최소한의 버전을 공유 할 수 있습니다 :

#include <windows.h> 
#include <iphlpapi.h> 
#include <stdio.h> 

#pragma comment(lib, "iphlpapi.lib") 

int main() { 
    ULONG buflen = sizeof(IP_ADAPTER_INFO); 
    IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen); 

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { 
     free(pAdapterInfo); 
     pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen); 
    } 

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) { 
     for (IP_ADAPTER_INFO *pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) { 
      printf("%s (%s)\n", pAdapter->IpAddressList.IpAddress.String, pAdapter->Description); 
     } 
    } 

    if (pAdapterInfo) free(pAdapterInfo); 
    return 0; 
} 
관련 문제