获取本地主机名和 IP 地址的 C++ Windows 函数调用

Posted

技术标签:

【中文标题】获取本地主机名和 IP 地址的 C++ Windows 函数调用【英文标题】:C++ Windows function call that get local hostname and IP address 【发布时间】:2011-02-25 09:37:35 【问题描述】:

是否有可以获取主机名和 IP 地址的内置 windows C++ 函数调用?谢谢。

【问题讨论】:

【参考方案1】:

这是一个多平台解决方案... 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;

【讨论】:

如何测试你的GetSinIP函数? 请注意,gethostname() 返回的主机名不一定一定是任何主机接口的域名解析返回的名称!但是,如果以这种方式配置,它可能是相同的名称。 缺少 adjust_str() 的实现我猜它会将数字 IP 转换为字符串?如果您添加它会很棒(尽管是 8 年前) adjust_str() 只是一个复制字符串的安全函数。我已经在上面的代码中通过 strcpy() 对其进行了更改。【参考方案2】:

要获取主机名,您可以使用:gethostname 或异步方法 WSAAsyncGetHostByName

要获取地址信息,您可以使用:getaddrinfo或unicode版本GetAddrInfoW

您可以使用 Win32 API 获取有关计算机名称(如域)的更多信息:GetComputerNameEx。

【讨论】:

以上是关于获取本地主机名和 IP 地址的 C++ Windows 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Elastic Beanstalk 中的 Spring Boot 应用程序中获取客户端主机名和/或客户端 IP 地址?

如何查看主机名和IP地址

获取本地主机IP地址[重复]

查看局域网中连接的主机名和对应的IP地址

Java如何获取本地计算机的IP地址和主机名?

单实例asm,修改主机名和ip地址后的重配置