2010-05-29 11 views

risposta

12

Per ottenere il nome dell'host è possibile utilizzare: gethostname o il metodo asincrono WSAAsyncGetHostByName

per avere le informazioni indirizzo, è possibile utilizzare: getaddrinfo o la versione Unicode GetAddrInfoW

È possibile ottenere ulteriori informazioni sul computer nome come il dominio utilizzando l'API Win32: .

4

Ecco una soluzione multipiattaforma ... Windows, Linux e MacOSX. È possibile ottenere indirizzo IP, porta, sockaddr_in, porta.

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

Questo è fantastico, grazie mille! – Stan

+0

come testare la funzione GetSinIP? –

+0

Si noti che il nome host restituito da 'gethostname()' è ** non ** necessariamente il nome restituito dalla risoluzione del nome di dominio per qualsiasi interfaccia dell'host! Tuttavia ** potrebbe ** essere lo stesso nome, se configurato in questo modo. – alk

Problemi correlati