Вызов функции Windows C++, которые получают локальное имя хоста и IP-адрес

Есть ли встроенные окна вызов функции C++, который может получить имя хоста и IP-адрес?Спасибо.

9
задан Stan 29 May 2010 в 04:16
поделиться

2 ответа

Для получения имени хоста можно использовать: gethostname или асинхронный метод WSAAsyncGetHostByName

Чтобы получить информацию об адресе, вы можете использовать: getaddrinfo или версию в юникоде GetAddrInfoW

Вы можете получить больше информации об имени компьютера, например домен, используя Win32 API: GetComputerNameEx.

12
ответ дан 4 December 2019 в 12:59
поделиться

Вот мультиплатформенное решение ... 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 && 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;
}
4
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: