2010-05-29 70 views

回答

4

這是一個多平臺解決方案... Windows,Linux和MacOSX。 您可以獲取ip地址,端口,sockaddr_in,端口。

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

這太棒了,非常感謝! – Stan 2010-05-30 20:28:27

+0

如何測試你的GetSinIP函數? – 2012-03-02 15:19:27

+0

請注意,由'gethostname()'返回的主機名是**,不一定是任何主機接口的域名解析返回的名稱!但是,如果以這種方式進行配置,它可能**是相同的名稱。 – alk 2014-08-26 14:40:18