Поэтому я попытался найти несколько разных ответов для этого. Один, который, как я думал, может быть многообещающим, был следующим:
Как проверить сеть тип интерфейса — Ethernet или Wireless в Windows с использованием Qt?
Однако я не слишком много знаю о сетях или даже о Windows. Лично я не могу понять большую часть документации Microsoft на их сайтах. Я пробовал такие вещи, как INetworkConnection
, NativeWiFi
и т. д. Но либо они не делают то, что я хочу, либо я просто не могу понять, как это сделать из доступной документации.
При этом я хотел бы использовать C++, чтобы проверить, подключено ли устройство, на котором запускается эта программа, к Интернету через кабель Ethernet. В принципе, я хочу сделать следующее:
- Если компьютер подключен только к беспроводной сети, запустите программу
- Если компьютер подключен только к Wired, не запускайте программу
- Если компьютер подключен как к проводной, так и к беспроводной сети, не запускайте программу.
Однако проблема в том, что я не знаю, как проверить, подключено ли устройство к Ethernet. Есть ли способ сделать это? Я НЕ использую QT. Спасибо!
РЕДАКТИРОВАТЬ: я должен также включить то, что я пробовал до сих пор.
Я пытался использовать GetAdaptersInfo
и получить черту Type
из типа переменной PIP_ADAPTER_INFO
, но это всегда дает мне Unknown type 71
независимо от того, подключен я к сети Ethernet или нет.
Документация для этого 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;
}
if(row.Type == IF_TYPE_ETHERNET_CSMACD && row.MediaConnectState == MdiaConnectStateConnected)
, а затем вернул true внутри этого оператора if. Большое спасибо за ваше время и помощь. Я приму этот ответ сейчас. 18.08.2015getDevices
, наNdisPhysicalMedium802_3
18.08.2015