Чтобы получить полное имя машины, мы должны сначала получить локальное имя хоста, а затем найти каноническое имя.
Самый простой способ сделать это - сначала получить локальное имя хоста с помощью 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()
будет таким же, как и у неквалифицированного имени хоста.