我有一个 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。
那我该怎么办呢?
答案 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