karty sieciowe.

0

Witam.
Chciałbym wydobyć listę wszystkich kart sieciowych na komputerze i wskazać tą, która udostępnia internet, jak to zrobić? Uzyskałem już listę wszystkich adapterów z pomocą winpcapa oraz samego winapi, kod:

winapi:

WSADATA        wd;
          SOCKET        sock;
          char            buf[65535];
          DWORD            dwSize = 65535;
          int                nRet;
          SOCKET_ADDRESS_LIST *pAddr;
          SOCKADDR*    saddr;

          nRet = WSAStartup(MAKEWORD(2,0), &wd);
          if(nRet != 0){
              qDebug()<<"WSAStartup fail with code " << nRet << endl;

          }
          sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
          if(sock == INVALID_SOCKET){
              qDebug()<< "socket fail with code " << WSAGetLastError();
          }
          ZeroMemory(buf, 65535);
          nRet = WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, 65535,
      &dwSize, NULL, NULL);
          if(nRet != SOCKET_ERROR){
              pAddr = reinterpret_cast<SOCKET_ADDRESS_LIST*>(buf);
              nRet = pAddr->iAddressCount;
              saddr = pAddr->Address->lpSockaddr;
              while (0 < nRet--){

      qDebug()<<inet_ntoa(reinterpret_cast<SOCKADDR_IN*>(saddr)->sin_addr);
                  saddr++;
              }
              nRet = 0;
          }else {
              qDebug()<< "WSAIoctl fail with code " << WSAGetLastError() << endl;
              nRet = -3;
          }
          closesocket(sock);
          WSACleanup();

jeszcze jeden sposób z pomocą funkcji GetAdaptersInfo():

char* buf;
                PIP_ADAPTER_INFO    pAdaptersInfo;
                PIP_ADDR_STRING        pAddr;
                DWORD                            dwSize = 0;

                if(GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW){
                    qDebug()<< "GetAdaptersInfo fail" << endl;
                    return;
                }
                buf = new char[dwSize];
                if (!buf) return;
                pAdaptersInfo = reinterpret_cast<PIP_ADAPTER_INFO>(buf);
                if (GetAdaptersInfo (pAdaptersInfo, &dwSize) == ERROR_SUCCESS){
                    while (pAdaptersInfo){
                        pAddr = &pAdaptersInfo->IpAddressList;
                        while (pAddr){
                            qDebug()<<"Address: " << pAddr->IpAddress.String << "/" <<
                                pAddr->IpMask.String << endl;
                            pAddr = pAddr->Next;
                        }
                        pAdaptersInfo = pAdaptersInfo->Next;
                    }
                }
                delete[] buf;

Nie wiem teraz jak określić która ma dostęp do internetu. Może ktoś pomóc ?

0

Zacznij od określenia co jest potrzebne: typ, gateway, ip{, dns}, i podepnij dodatkowe warunki pod drugi przykład (pAdaptersInfo->IpAddressList, ->GatewayList).
Typ połączenia też warto sprawdzić, typowo pAdaptersInfo->Type powinno być równe MIB_IF_TYPE_ETHERNET.
Dla listy serwerów dns użyj funkcji GetNetworkParams, GetPerAdapterInfo.