在 C++ 中从主机名获取计算机名?
Get computername from hostname in C++?
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
例如输出
ComputerName
有什么方法可以直接获取已知IP地址的系统的ComputerName吗?
我正在寻找与在远程系统上使用 Hostname 命令显示的结果相同的结果。
您的意思是,您想截断第一个句点之前的字符串?
std::string host(hostname);
size_t pos = host.find('.');
if (pos != std::string::npos)
{
host = host.substr(0,pos);
}
strcpy(hostname, host.c_str());
查看 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.
如果您有兴趣查找代码为 运行 的计算机的主机名,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
选项进行编译。
根据 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
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
例如输出
ComputerName
有什么方法可以直接获取已知IP地址的系统的ComputerName吗?
我正在寻找与在远程系统上使用 Hostname 命令显示的结果相同的结果。
您的意思是,您想截断第一个句点之前的字符串?
std::string host(hostname);
size_t pos = host.find('.');
if (pos != std::string::npos)
{
host = host.substr(0,pos);
}
strcpy(hostname, host.c_str());
查看 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.
如果您有兴趣查找代码为 运行 的计算机的主机名,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
选项进行编译。
根据 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