【问题标题】:Get computername from hostname in C++?从 C++ 中的主机名获取计算机名?
【发布时间】:2020-03-11 08:59:37
【问题描述】:

IP 地址是192.168.23.4。我可以使用以下代码 sn-p 从 ipaddress 获取主机名:

struct sockaddr_in sa;
char str[INET_ADDRSTRLEN];
inet_pton(AF_INET, "192.168.23.4", &(sa.sin_addr));

struct sockaddr_in saGNI;
char hostname[NI_MAXHOST];
char servInfo[NI_MAXSERV];
u_short port = 27015;
saGNI.sin_family = AF_INET;
saGNI.sin_addr.s_addr = sa.sin_addr.s_addr;
saGNI.sin_port = htons(port);

DWORD dwRetval = getnameinfo((struct sockaddr *) &saGNI,
    sizeof(struct sockaddr),
    hostname,
    NI_MAXHOST, servInfo, NI_MAXSERV, NI_NUMERICSERV);
printf("HostName: %s", hostname);

我得到了表单的输出

计算机名.domain.com

如何从主机名中获取计算机名?

例如输入

计算机名.domain.com

例如输出

计算机名

有没有什么方法可以直接获取已知IP地址的系统的ComputerName?

我正在寻找与在远程系统上使用 Hostname 命令显示的结果相同的结果。

【问题讨论】:

标签: c++ windows ip-address hostname


【解决方案1】:

查看 getnameinfo 的手册页

http://man7.org/linux/man-pages/man3/getnameinfo.3.html

根据手册页,您应该设置 NI_NOFQDN 标志。

 NI_NOFQDN
          If set, return only the hostname part of the fully qualified
          domain name for local hosts.

【讨论】:

【解决方案2】:

根据 emirc 的建议, 以下代码正在打印计算机名:

struct sockaddr_in sa;
char str[INET_ADDRSTRLEN];
inet_pton(AF_INET, "192.168.23.4", &(sa.sin_addr));

struct sockaddr_in saGNI;
char hostname[NI_MAXHOST];
char servInfo[NI_MAXSERV];
u_short port = 27015;
saGNI.sin_family = AF_INET;
saGNI.sin_addr.s_addr = sa.sin_addr.s_addr;
saGNI.sin_port = htons(port);

DWORD dwRetval = getnameinfo((struct sockaddr *) &saGNI,
    sizeof(struct sockaddr),
    hostname,
    NI_MAXHOST, servInfo, NI_MAXSERV, NI_NOFQDN);
printf("HostName: %s", hostname);

注意: 我已将标志从 NI_NUMERICSERV

NI_NOFQDN

【讨论】:

    【解决方案3】:

    你的意思是,你想截断第一个句点之前的字符串?

    std::string host(hostname);
    size_t pos = host.find('.');
    if (pos != std::string::npos)
    {
       host = host.substr(0,pos);
    }
    strcpy(hostname, host.c_str());
    

    【讨论】:

    • 单行:std::getline(std::stringstream(hostname), host, '.');
    【解决方案4】:

    如果您有兴趣查找运行代码的计算机的主机名,Boost.Asio 可以简化任务:

    #include <iostream>
    #include <string>
    #include <boost/asio.hpp>
    
    int main() {
      std::string hostname = boost::asio::ip::host_name();
      std::cout << "hostname = " << hostname << std::endl;
    }
    

    请注意,这需要使用-lpthread 选项进行编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多