2009-11-04 12 views

Respuesta

8

Este código debería funcionar:

{ 
    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

¿Por qué asignar pAdapterInfos usando mallock en lugar de stack? – user626528

+1

Como el búfer es más grande, solo esa estructura. El ciclo actualiza el parámetro de tamaño. – Christopher

+0

(sí, me doy cuenta de que esta respuesta es antigua.) ¿Puede explicar cómo funciona este código en prosa, en lugar de tener un par de comentarios que expliquen partes y piezas? –

4

sólo tiene que dominar la API IPHelper ... esto es un enlace a get you started, con ejemplos haciendo justo lo que necesita.

Cuestiones relacionadas