Как мне найти полное имя хоста текущей машины в C (имя хоста и информация о домене)?
-
21-08-2019 - |
Вопрос
Как мне получить полное имя для текущей системы в проекте на языке C (POSIX)?
Например, я могу получить только имя хоста моей машины, выполнив
gethostname()
из unistd.h.Это могло бы дать мне machine3
взамен, но на самом деле я ищу machine3.somedomain.com
например.
Как мне получить эту информацию?Я не хочу использовать вызов system() для этого, если это возможно.
Решение
Чтобы получить полное имя для компьютера, мы должны сначала получить локальное имя хоста, а затем выполнить поиск по каноническому имени.
Самый простой способ сделать это - сначала получить локальное имя хоста, используя 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);
Конечно, это сработает только в том случае, если у машины есть полное доменное имя для передачи - в противном случае результат 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 нет способа получить домен.
Я верю, что вы ищете:
gethostbyaddress - адрес хостинга
Просто передайте ему IP localhost.
Существует также функция gethostbyname, которая также полезна.
Самый простой способ, попробуйте uname()
Если это не сработает, используйте gethostname(), затем gethostbyname() и, наконец, gethostbyaddr()
H_name хостента{} должно быть вашим полным доменным именем