2013-06-25 4 views
2

Учитывая адрес IPv4, как получить связанное с ним имя сетевого интерфейса, например «Подключение локальной сети Ethernet», в Windows с использованием C++? В качестве альтернативы, как получить список имен сетевых интерфейсов и адресов IPv4 для локального компьютера? Я могу получить только адреса IPv4, используя getaddrinfo и inet_ntoa.Получить имя сетевого интерфейса с адреса IPv4

+0

Это зависит от платформы. Например, вы должны использовать GetAdaptersInfo для окон. – mattn

+0

@mattn В документации для GetAdaptersInfo говорится, чтобы использовать GetAdaptersAddresses в XP и более поздних версиях. Является ли это предпочтительным? –

+0

Да, лучше использовать GetAdaptersAddresses, если вы хотите, чтобы он работал на XP или позже. – 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; 
}