从IPv4地址获取网络接口名称

4

在Windows下使用C ++,如何获取与IPv4地址相关联的网络接口名称,例如“以太网适配器本地连接”?或者,如何获取本地计算机的网络接口名称和IPv4地址列表?我只能使用getaddrinfoinet_ntoa获取IPv4地址。


这取决于平台。例如,在Windows上,你应该使用GetAdaptersInfo函数。 - mattn
@mattn GetAdaptersInfo的文档说在XP及更高版本上使用GetAdaptersAddresses。这是首选吗? - 1''
最好使用GetAdaptersAddresses,如果你想让它在XP或更高版本上运行。 - mattn
1
这似乎有效 https://gist.github.com/yoggy/1241986 - mattn
2个回答

10
#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");
  }
}

正如@sonyisda1所提到的,这是来自MSDN的内容。

可能需要提到这是从MSDN中获取的,如果使用WinXP或更高版本,则应改用GetAdaptersAddresses - sonyisda1

6
我也会分享我的简化版:

我将分享我的最简版本:

#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;
}

这很有帮助。 - iamrameshkumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接