如何在C++中通过主机名获取计算机名称?

3

IP地址是192.168.23.4。我能够使用以下代码片段从ip地址中获取主机名:

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地址的系统的计算机名称?
我正在寻找与在远程系统上使用“主机名”命令显示的相同结果。

请将答案放在“答案”区块中。稍后,您可以接受您自己的答案。同时请参阅如何接受答案? - jww
4个回答

4

1
同样适用于Winsock,以防万一:https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getnameinfo - parktomatomi

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。


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());

1
一行代码:std::getline(std::stringstream(hostname), host, '.'); - parktomatomi

-1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接