c++中的网络适配器信息

Network Adapter Information in C++

本文关键字:信息 网络适配器 c++      更新时间:2023-10-16

在Windows 8上,是否有任何标准函数可以在C中使用,以便获得系统中处理以太网的每个网络接口卡的IP地址和网络掩码列表?我能想到的获得此类信息的唯一其他方法是解析ipconfig的输出,但我真的不想在c++中走那条路。

微软有一个叫做IP Helper API的东西。他们的文档非常全面,入门页包含一些基本示例。

下面是GetAdaptersInfo的一个例子:

编辑:在XP和更高版本,GetAdaptersInfo()已被弃用,使用GetAdaptersAddresses()代替(信用归Remy Lebeau)。

PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while (pAdapter) {
    printf("Adapter Name: %sn", pAdapter->AdapterName);
    printf("Adapter Desc: %sn", pAdapter->Description);
    printf("tAdapter Addr: t");
    for (UINT i = 0; i < pAdapter->AddressLength; i++) {
        if (i == (pAdapter->AddressLength - 1))
            printf("%.2Xn",(int)pAdapter->Address[i]);
        else
            printf("%.2X-",(int)pAdapter->Address[i]);
    }
    printf("IP Address: %sn", pAdapter->IpAddressList.IpAddress.String);
    printf("IP Mask: %sn", pAdapter->IpAddressList.IpMask.String);
    printf("tGateway: t%sn", pAdapter->GatewayList.IpAddress.String);
    printf("t***n");
    if (pAdapter->DhcpEnabled) {
        printf("tDHCP Enabled: Yesn");
        printf("ttDHCP Server: t%sn", pAdapter->DhcpServer.IpAddress.String);
    }
    else
      printf("tDHCP Enabled: Non");
  pAdapter = pAdapter->Next;
}

这是关于提取网络参数的部分:

    FIXED_INFO *pFixedInfo;
    IP_ADDR_STRING *pIPAddr;
    ULONG ulOutBufLen;
    DWORD dwRetVal;
    pFixedInfo = (FIXED_INFO *) malloc(sizeof (FIXED_INFO));
    ulOutBufLen = sizeof (FIXED_INFO);
    if (GetNetworkParams(pFixedInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        free(pFixedInfo);
        pFixedInfo = (FIXED_INFO *) malloc(ulOutBufLen);
        if (pFixedInfo == NULL) {
            printf("Error allocating memory needed to call GetNetworkParamsn");
        }
    }
   printf("tHost Name: %sn", pFixedInfo->HostName);
        printf("tDomain Name: %sn", pFixedInfo->DomainName);
        printf("tDNS Servers:n");
        printf("tt%sn", pFixedInfo->DnsServerList.IpAddress.String);
        pIPAddr = pFixedInfo->DnsServerList.Next;
        while (pIPAddr) {
            printf("tt%sn", pIPAddr->IpAddress.String);
            pIPAddr = pIPAddr->Next;
        }
        printf("tNode Type: ");
        switch (pFixedInfo->NodeType) {
        case 1:
            printf("%sn", "Broadcast");
            break;
        case 2:
            printf("%sn", "Peer to peer");
            break;
        case 4:
            printf("%sn", "Mixed");
            break;
        case 8:
            printf("%sn", "Hybrid");
            break;
        default:
            printf("n");
        }
        printf("tNetBIOS Scope ID: %sn", pFixedInfo->ScopeId);
        if (pFixedInfo->EnableRouting)
            printf("tIP Routing Enabled: Yesn");
        else
            printf("tIP Routing Enabled: Non");
        if (pFixedInfo->EnableProxy)
            printf("tWINS Proxy Enabled: Yesn");
        else
            printf("tWINS Proxy Enabled: Non");
        if (pFixedInfo->EnableDns)
            printf("tNetBIOS Resolution Uses DNS: Yesn");
        else
            printf("tNetBIOS Resolution Uses DNS: Non");

还有GetInterfaceInfo和更多。