C++ Windows chiamata di funzione che si ottiene locale hostname e indirizzo IP

C’è built-in di windows in C++ chiamata di funzione che si può ottenere hostname e indirizzo IP? Grazie.

  • gethostname(), getaddrinfo()
InformationsquelleAutor Stan | 2010-05-29

 

2 Replies
  1. 4

    Qui è una soluzione multipiattaforma… di Windows, Linux e MacOSX.
    È possibile ottenere l’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 && strlen(pIP) < IPMaxLen)
                    strcpy(pIPStr, pIP);
            }
        }
    
        return ipaddr;
    }
    
    
    int GetSinPort(struct sockaddr_in *_psin)
    {
        int port;
    
        port = 0;
    
        if ( _psin )
            port = _Xntohs(_psin->sin_port);
    
        return port;
    }
    • Questo è fantastico, grazie mille!
    • come testare il vostro GetSinIP funzione?
    • Siete pregati di notare che il nome host come restituito da gethostname() è non necessariamente il nome restituito dalla risoluzione del nome di dominio per qualsiasi host interfacce! Esso, tuttavia, potrebbe essere lo stesso nome, se configurato in questo modo.
    • Mancanti attuazione di adjust_str() sto indovinando che converte IP numerico in stringa? Sarebbe bello se si aggiunto anche 8 anni fa)
    • adjust_str() è semplicemente una funzione di sicurezza per copiare la stringa. Ho già cambiato da strcpy() nel codice di cui sopra.

Lascia un commento