Vérifiez si l’ordinateur Windows sur Ethernet via C ++

Donc, j’ai essayé de regarder quelques réponses différentes pour cela. Celui que je pensais être prometteur était celui-ci:

Comment vérifier le type d’interface réseau est Ethernet ou sans fil sous Windows en utilisant Qt?

Cependant, je ne sais pas vraiment trop sur le réseautage ou même sur Windows. Personnellement, je ne peux pas comprendre la plupart de la documentation de Microsoft sur leurs sites Web. J’ai essayé des choses comme INetworkConnection , NativeWiFi , etc. Mais soit ils ne font pas ce que je veux, soit je n’arrive pas à comprendre comment le faire à partir de la documentation disponible.

Cela étant dit, j’aimerais utiliser C ++ pour vérifier si le périphérique sur lequel ce programme est exécuté est connecté à Internet via un câble Ethernet. En gros, je veux faire ce qui suit:

  • Si l’ordinateur est connecté au réseau sans fil uniquement, exécutez le programme
  • Si l’ordinateur est connecté à Wired uniquement, n’exécutez pas le programme
  • Si l’ordinateur est connecté à la fois câblé ET sans fil, n’exécutez pas le programme

Cependant, le problème est que je ne sais pas comment vérifier si le périphérique est connecté à Ethernet. Y a-t-il un moyen de faire cela? Je n’utilise PAS QT. Je vous remercie!


EDIT: Je devrais aussi inclure ce que j’ai essayé jusqu’ici.

J’ai essayé d’utiliser GetAdaptersInfo et d’obtenir le trait Type du Type de variable PIP_ADAPTER_INFO , mais cela me donne toujours le Unknown type 71 que je sois sur Ethernet ou non.

La documentation pour ce GetAdaptersInfo est ici: https://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx

Merci


EDIT 2: Voici le code que j’utilisais pour 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; } 

Votre problème est quelque peu difficile car il peut être très compliqué d’obtenir l’adaptateur réseau “actuel” — Windows achemine les paquets en fonction de la configuration de l’adaptateur réseau et de l’accessibilité de la destination. déjà savoir comment récupérer les adresses IP et MAC (“adresse matérielle”) des adaptateurs disponibles, vous pouvez simplement utiliser votre hack pour récupérer un MAC pour votre adresse IP actuelle et filtrer / rechercher à l’intérieur de ma deuxième fonction pour cela! Le champ “PhysicalAddress” est ce que vous cherchez, c’est l’adresse MAC

J’ai fait l’expérience que la seule façon assez fiable de le faire via GetIfTable et GetIfTable2 , la première renvoie des informations adpater quelque peu superficielles et la seconde fournit des détails très détaillés . Voici un exemple d’implémentation, car il utilise la fonction détaillée pour interroger les adaptateurs WLAN:

 vector* getDevices(NDIS_PHYSICAL_MEDIUM type) { vector *v = new vector(); PMIB_IF_TABLE2 table = NULL; if(GetIfTable2Ex(MibIfTableRaw, &table) == NOERROR && table) { UINT32 i = 0; for(; i < table->NumEnsortinges; i++) { MIB_IF_ROW2 row; ZeroMemory(&row, sizeof(MIB_IF_ROW2)); row.InterfaceIndex = i; if(GetIfEntry2(&row) == NOERROR) { if(row.PhysicalMediumType == type) { v->push_back(row); } } } FreeMibTable(table); } return v; } 

Il ne vous rest plus qu’à parcourir la liste et à filtrer les adaptateurs désactivés et tout le rest:

 vector* wlan = getDevices(NdisPhysicalMediumNative802_11); //WLAN adapters //see https://msdn.microsoft.com/en-us/library/windows/desktop/aa814491(v=vs.85).aspx, "PhysicalMediumType" for a full list for(auto &row : *v) { //do some additional filtering, this needs to be changed for non-WLAN if( row.TunnelType == TUNNEL_TYPE_NONE && row.AccessType != NET_IF_ACCESS_LOOPBACK && row.Type == IF_TYPE_IEEE80211 && row.InterfaceAndOperStatusFlags.HardwareInterface == TRUE) { //HERE BE DRAGONS! } } 

Maintenant, il est assez facile de générer des listes d’adaptateurs WLAN et d’adaptateurs non WLAN (voir commentaire dans la deuxième fonction) , rechercher votre MAC actuel et conclure qu’il est câblé ou sans fil – mais ces listes peuvent se chevaucher version étendue de 802.3 mais 802.3 n’inclut pas 802.11 (puisque c’est une extension) – vous aurez donc besoin d’un peu de logique if / else pour séparer le WLAN des adaptateurs non-WLAN.

Vous pouvez également utiliser WlanEnumInterfaces pour obtenir tous les adaptateurs WLAN, mais c’est la même chose que d’utiliser la fonction ci-dessus avec NdisPhysicalMediumNative802_11 comme paramètre …

Donc tout d’abord, merci beaucoup à l’utilisateur @ Nighthawk441 pour m’avoir orienté dans la bonne direction. Sans cet utilisateur, je n’aurais certainement pas trouvé de solution.

Cela étant dit, la solution que j’ai maintenant est, au mieux, un hack. Cela semble fonctionner, mais je ne pense pas que ce soit même la meilleure option. Je laisserai donc cela comme une réponse, mais je ne l’accepterai pas pendant un petit moment si une meilleure réponse est trouvée. Je suis également très ouvert aux commentaires de quiconque concernant cette réponse.

En bref, j’ai fait une boucle à travers tous les adaptateurs de GetAdaptersInfo . Afin de voir si la carte était connectée, j’ai comparé l’adresse IP de la carte à la chaîne "0.0.0.0" , comme si c’était quelque chose d’autre que cela, je pensais qu’il était prudent de dire que la carte était connectée. Donc, sans plus tarder, voici le code que j’ai implémenté.

 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 needed to call GetAdaptersInfo"); if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW){ free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); } if((dwRetValue = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR){ do{ pAdapter = pAdapterInfo; ssortingng ip_ssortingng = pAdapter->IpAddressList.IpAddress.Ssortingng; switch(pAdapter->Type){ case MIB_IF_TYPE_OTHER: printf("Other\n"); break; ... case MIB_IF_TYPE_ETHERNET: printf("Ethernet\n"); //new code if(ip_ssortingng.compare("0.0.0.0") != 0){ free(pAdapterInfo); return true; } break; default: printf("Unknown type %ld\n", pAdapter->Type); break; } }while(pAdapterInfo = pAdapterInfo->Next); } if(pAdapterInfo) free(pAdapterInfo); return false; } 

Regarder cette référence m’a vraiment aidé:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365819%28v=vs.85%29.aspx

Merci donc à Nighthawk de m’avoir fourni cette information. J’espère que cela aidera quelqu’un d’autre! Si quelqu’un a des commentaires ou d’autres réponses, n’hésitez pas à les poster! Merci!