我要如何找到在C(主机名和域名信息),目前该机的全名?
-
21-08-2019 - |
题
在C项目(POSIX),我如何才能完全合格的名称为当前系统?
例如,我可以做让我的机器只是主机名
从unistd.h中gethostname()
。这可能给我machine3
的回报,但我实际上是寻找machine3.somedomain.com
例如。
我如何去获得这些信息?我不想使用系统()的调用,如果能够做到这一点。
解决方案
要为一台机器得到一个完全合格的名字,我们必须首先获取本地主机名,然后查找的规范名称。
要做到这一点的最简单的方法是通过首先获得使用uname()
或gethostname()
本地主机名,然后用gethostbyname()
执行查找和看它返回该结构的h_name
构件。如果使用的是ANSI C,你的必须的使用uname()
代替gethostname()
。
示例:
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
printf("Hostname: %s\n", hostname);
struct hostent* h;
h = gethostbyname(hostname);
printf("h_name: %s\n", h->h_name);
不幸的是,gethostbyname()
不赞成在当前POSIX说明书中,因为它不使用IPv6打好。这段代码的更现代的版本将使用getaddrinfo()
。
示例:
struct addrinfo hints, *info, *p;
int gai_result;
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /*either IPV4 or IPV6*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
if ((gai_result = getaddrinfo(hostname, "http", &hints, &info)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_result));
exit(1);
}
for(p = info; p != NULL; p = p->ai_next) {
printf("hostname: %s\n", p->ai_canonname);
}
freeaddrinfo(info);
当然,这将仅在机器具有FQDN,得到工作 - 如果没有,getaddrinfo()
的结果最终被同为不合格的主机名
其他提示
我的解决办法:
#ifdef WIN32
#include <Windows.h>
#include <tchar.h>
#else
#include <unistd.h>
#endif
void GetMachineName(char machineName[150])
{
char Name[150];
int i=0;
#ifdef WIN32
TCHAR infoBuf[150];
DWORD bufCharCount = 150;
memset(Name, 0, 150);
if( GetComputerName( infoBuf, &bufCharCount ) )
{
for(i=0; i<150; i++)
{
Name[i] = infoBuf[i];
}
}
else
{
strcpy(Name, "Unknown_Host_Name");
}
#else
memset(Name, 0, 150);
gethostname(Name, 150);
#endif
strncpy(machineName,Name, 150);
}
gethostname()
是POSIX的方式来获得本地主机名。检查出man
。
BSD功能getdomainname()
可以给你的域名,你可以建立完整的主机名。有没有POSIX的方式得到一个域名我害怕。
在简单的方法,尝试UNAME()
如果不起作用,使用gethostname(),然后的gethostbyname(),最后gethostbyaddr()
hostent {}的h_name复制应该是你的FQDN
不隶属于 StackOverflow