多个默认网关获取

时间:2016-01-07 18:59:39

标签: c++ network-programming mingw

我有一个 C ++ 的程序,它正在获得默认网关,所以它可以正常直到我在PC上尝试它有几个默认网关。这是我的代码:

DWORD Err,AdapterInfoSize =0;
    PIP_ADAPTER_INFO pAdapterInfo, pAdapt;
    if ((Err = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0) {
        if (Err != ERROR_BUFFER_OVERFLOW){
            std::cout<<"ERROR S05\n";
            cin.ignore();
        }
    }
    if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL) {
        std::cout<<"ERROR S06\n";
        cin.ignore();
    }
    if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0) {
        std::cout<<"ERROR S07\n";
        cin.ignore();
    }
    pAdapt = pAdapterInfo;
    while (pAdapt){
        dfltgw = pAdapt->GatewayList.IpAddress.String;
        break;
    }
    pAdapt = pAdapterInfo;
    cout << endl << "DEFAULT GATEWAY: " << dfltgw << endl;

PC ,我有一个 VirtualBox的虚拟网络我总是得到输出: 0.0.0.0 ,在我的PC上,我有1默认网关我得到了正确的IP。

那我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

通过添加:

修正了它
for (int izjson = 0; izjson < 50; izjson++) {
        string checkdf = pAdapterInfo->GatewayList.IpAddress.String;
        if(checkdf != "0.0.0.0") {
            dfltgw = checkdf;
            break;
        }
        pAdapterInfo = pAdapterInfo->Next; // Get next adapter info
    }

感谢@SergeyA

答案 1 :(得分:0)

您将获得系统中安装的所有适配器的列表,但您只是检查第一个(您的整个while循环没有实际意义,您在第一次迭代后就会突破它)。相反,您应该迭代适配器,直到找到合适的适配器。

为了回答注释中的一些混淆,假设默认网关是全局(而不是每个适配器)设置,这里是来自ipconfig输出的复制粘贴: Windows IP配置

Ethernet adapter Local Area Connection 11:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::4149:4c25:692d:dfec%91
   IPv4 Address. . . . . . . . . . . : 10.252.26.84
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Wireless LAN adapter Wireless Network Connection 14:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::79a2:afc8:7cd0:79ac%72
   IPv4 Address. . . . . . . . . . . : 192.168.10.9
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.10.1