【发布时间】:2015-08-14 18:03:32
【问题描述】:
因此,我尝试查看几个不同的答案。我认为可能有希望的是这个:
How to check network interface type is Ethernet or Wireless on Windows using Qt?
但是,我对网络甚至 Windows 都不太了解。就个人而言,我无法理解他们网站上的大多数 Microsoft 文档。我尝试过INetworkConnection、NativeWiFi 等。但要么他们没有做我想做的事,要么我无法从可用的文档中弄清楚如何去做。
话虽如此,我想使用 C++ 检查运行该程序的设备是否通过以太网电缆连接到互联网。基本上,我想做以下事情:
- 如果计算机仅连接到无线,请运行程序
- 如果电脑只连接有线,不要运行程序
- 如果计算机同时连接到有线和无线,请不要运行程序
但是,问题是我不知道如何检查设备是否连接了以太网。有没有办法做到这一点?我没有使用 QT。谢谢!
编辑:我还应该包括到目前为止我已经尝试过的内容。
我尝试使用GetAdaptersInfo 并从PIP_ADAPTER_INFO 变量类型中获取Type 特征,但无论我是否在以太网上,这总是给我Unknown type 71。
GetAdaptersInfo 的文档在这里:
https://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx
谢谢
编辑 2:这是我用于 GetAdaptersInfo 的代码
bool is_on_ethernet{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
UINT i;
struct tm newtime;
char buffer[32];
errno_t error;
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
if(pAdapterInfo == NULL)
printf("Error allocating memory need to call GetAdaptersInfo");
if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW){
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
}
if((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR){
pAdapter = pAdapterInfo;
switch(pAdapter->Type){
case MIB_IF_TYPE_OTHER:
printf("Other\n");
return false;
break;
case MIB_IF_TYPE_ETHERNET:
printf("Ethernet\h");
return true;
break;
case MIB_IF_TYPE_TOKENRING:
printf("Token Ring\n");
return false;
break;
case MIB_IF_TYPE_FDDI
printf("FDDI\n");
return false;
break;
case MIB_IF_TYPE_PPP
printf("PPP\n");
return false;
break;
case MIB_IF_TYPE_LOOPBACK
printf("Lookback\n");
return false;
break;
case MIB_IF_TYPE_SLIP
printf("Slip\n");
return false;
break;
default
printf("Unknown type %ld\n\n", pAdapter->Type);
return false;
break;
}
}
if(pAdapterInfo)
free(pAdapterInfo);
return false;
}
【问题讨论】:
-
您有尝试使用 GetAdaptersInfo 的示例代码吗?
-
我愿意;我现在将其添加为编辑。很抱歉没有包括在内!
-
@Nighthawk441 好的——我已将代码作为编辑包含在内。再次,抱歉之前缺少代码!谢谢你的评论:)
-
我没有足够的信息来保证答案。但据我所知,GetAdaptersInfo 将返回所有已安装适配器的链接列表。您拥有的代码看起来像在 msdn 上找到的示例代码,它只检查第一个适配器。因此,您需要使用 IP_ADAPTER_INFO 中的 Next 指针遍历每个适配器。您可以获取每种适配器类型,但它不会说明它是否已连接。
-
@Nighthawk441 好吧,我没有意识到代码只检查了第一个适配器。我将循环遍历它们,然后尝试确定每个是否已连接。谢谢!
标签: c++ windows wireless ethernet