2009-11-04 6 views

Odpowiedz

8

Kod ten powinien działać:

{ 
    ULONG outBufLen = 0; 
    DWORD dwRetVal = 0; 
    IP_ADAPTER_INFO* pAdapterInfos = (IP_ADAPTER_INFO*) malloc(sizeof(IP_ADAPTER_INFO)); 

    // retry up to 5 times, to get the adapter infos needed 
    for(int i = 0; i < 5 && (dwRetVal == ERROR_BUFFER_OVERFLOW || dwRetVal == NO_ERROR); ++i) 
    { 
     dwRetVal = GetAdaptersInfo(pAdapterInfos, &outBufLen); 
     if(dwRetVal == NO_ERROR) 
     { 
      break; 
     } 
     else if(dwRetVal == ERROR_BUFFER_OVERFLOW) 
     { 
      free(pAdapterInfos); 
      pAdapterInfos = (IP_ADAPTER_INFO*) malloc(outBufLen); 
     } 
     else 
     { 
      pAdapterInfos = 0; 
      break; 
     } 
    } 
    if(dwRetVal == NO_ERROR) 
    { 
     IP_ADAPTER_INFO* pAdapterInfo = pAdapterInfos; 
     while(pAdapterInfo) 
     { 
      IP_ADDR_STRING* pIpAddress = &(pAdapterInfo->IpAddressList); 
      while(pIpAddress != 0) 
      { 
          // 
          // <<<< 
          // here pAdapterInfo->Address should contain the MAC address 
          // >>>> 
          // 

       pIpAddress = pIpAddress->Next; 
      } 
      pAdapterInfo = pAdapterInfo->Next; 
     } 
    } 
    free(pAdapterInfos); 
    return false; 
} 
+0

Po co przydzielać pAdapterInfos za pomocą funkcji mallock zamiast stosu? – user626528

+1

Ponieważ bufor jest większy niż tylko jedna struktura. Pętla aktualizuje parametr wielkości. – Christopher

+0

(tak, zdaję sobie sprawę, że ta odpowiedź jest stara.) Czy możesz wyjaśnić, w jaki sposób ten kod działa w prozie, zamiast zawierać kilka uwag wyjaśniających fragmenty? –

4

trzeba tylko opanować API IPhelper ... to jest link do get you started, z przykładami robi tylko to, czego potrzebujesz.

Powiązane problemy