2010-05-29 6 views

Antwort

12

Um die Hostnamen erhalten Sie verwenden können: gethostname oder von der Asynchron-Methode WSAAsyncGetHostByName

die Adresse Informationen zu erhalten, können Sie verwenden: getaddrinfo oder die Unicode-Version GetAddrInfoW

Sie können mehr Informationen über den Computer erhalten Benennen Sie wie die Domäne, indem Sie die Win32-API verwenden: .

4

Hier ist eine Multiplattform-Lösung ... Windows, Linux und MacOSX. Sie können IP-Adresse, Port, Sockaddr_in, Port erhalten.

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

Das ist genial, vielen Dank! – Stan

+0

Wie testen Sie Ihre GetSinIP-Funktion? –

+0

Bitte beachten Sie, dass der von 'gethostname()' zurückgegebene Hostname ** nicht unbedingt der Name ist, der von der Domain-Namensauflösung für eine der Schnittstellen des Hosts zurückgegeben wird! Es ** könnte jedoch ** der gleiche Name sein, wenn diese Art und Weise konfiguriert wird. – alk

Verwandte Themen