从C ++中的主机名获取计算机名?

时间:2019-11-15 08:35:25

标签: c++ windows ip-address hostname

IP地址为192.168.23.4。我可以使用以下代码段从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);

我得到的是表格的输出

  

ComputerName.domain.com

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

例如输入

  

ComputerName.domain.com

例如,输出

  

计算机名

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

我正在寻找与在远程系统上使用“主机名”命令显示的结果相同的结果。

4 个答案:

答案 0 :(得分:3)

检查手册页中的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.

答案 1 :(得分:1)

根据emirc的建议, 以下代码正在打印Computername:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您有兴趣查找运行代码的计算机的主机名,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选项进行编译。