2010-05-29 14 views

Respuesta

12

Para obtener el nombre de host puede utilizar: gethostname o el método asíncrono WSAAsyncGetHostByName

para obtener la información de direcciones, puede utilizar: getaddrinfo o la versión Unicode GetAddrInfoW

Puede obtener más información sobre el equipo nombre como el dominio mediante el uso de la API de Win32: .

4

Aquí hay una solución multiplataforma ... Windows, Linux y MacOSX. Puede obtener la dirección IP, puerto, sockaddr_in, puerto.

BOOL GetMyHostName(LPSTR pszBuffer, UINT nLen) 
{ 
    BOOL ret; 

    ret = FALSE; 

    if (pszBuffer && nLen) 
    { 
     if (gethostname(pszBuffer, nLen) == 0) 
      ret = TRUE; 
     else 
      *pszBuffer = '\0'; 
    } 

    return ret; 
} 


ULONG GetPeerName(SOCKET _clientSock, LPSTR _pIPStr, UINT _IPMaxLen, int *_pport) 
{ 
    struct sockaddr_in sin; 
    unsigned long ipaddr; 


    ipaddr = INADDR_NONE; 

    if (_pIPStr && _IPMaxLen) 
     *_pIPStr = '\0'; 

    if (_clientSock!=INVALID_SOCKET) 
    { 
     #if defined(_WIN32) 
     int locallen; 
     #else 
     UINT locallen; 
     #endif 

     locallen = sizeof(struct sockaddr_in); 

     memset(&sin, '\0', locallen); 

     if (getpeername(_clientSock, (struct sockaddr *) &sin, &locallen) == 0) 
     { 
      ipaddr = GetSinIP(&sin, _pIPStr, _IPMaxLen); 

      if (_pport) 
       *_pport = GetSinPort(&sin); 
     } 
    } 

    return ipaddr; 
} 


ULONG GetSinIP(struct sockaddr_in *_psin, LPSTR pIPStr, UINT IPMaxLen) 
{ 
    unsigned long ipaddr; 

    ipaddr = INADDR_NONE; 

    if (pIPStr && IPMaxLen) 
     *pIPStr = '\0'; 

    if (_psin) 
    { 
     #if defined(_WIN32) 
     ipaddr = _psin->sin_addr.S_un.S_addr; 
     #else 
     ipaddr = _psin->sin_addr.s_addr; 
     #endif 

     if (pIPStr && IPMaxLen) 
     { 
      char *pIP; 
      struct in_addr in; 

      #if defined(_WIN32) 
      in.S_un.S_addr = ipaddr; 
      #else 
      in.s_addr = ipaddr; 
      #endif 

      pIP = inet_ntoa(in); 

      if (pIP) 
       adjust_str(pIP, pIPStr, IPMaxLen); 
     } 
    } 

    return ipaddr; 
} 


int GetSinPort(struct sockaddr_in *_psin) 
{ 
    int port; 

    port = 0; 

    if (_psin) 
     port = _Xntohs(_psin->sin_port); 

    return port; 
} 
+1

Esto es increíble, muchas gracias! – Stan

+0

cómo probar su función GetSinIP? –

+0

Tenga en cuenta que el nombre de host devuelto por 'gethostname()' es ** no ** necesariamente el nombre tal como lo devuelve la resolución del nombre de dominio para cualquiera de las interfaces del host. Sin embargo ** podría ** ser el mismo nombre, si está configurado de esta manera. – alk

Cuestiones relacionadas