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 ?