Как работает getbyhostname ()? - PullRequest
       15

Как работает getbyhostname ()?

0 голосов
/ 04 февраля 2012

Я пишу простую программу UDP-клиент-сервер и не получаю ожидаемых результатов от getbyhostname ().Вот фрагмент моего кода:

char *clientHostName = malloc(HOST_NAME_MAX);
gethostname(clientHostName, HOST_NAME_MAX);
printf("%s\n",clientHostName);
struct hostent thehost = gethostbyname(clientHostName);
printf("%ld\n",(*((unsigned long *) thehost->h_addr_list[0])));

Итак, первый оператор print выдает то, что я ожидал, имя моего компьютера.Тем не менее, я ожидаю, что второй оператор печати распечатает мой IP-адрес.Но нет, он распечатывает что-то вроде этого: 4398250634. Что это такое, что он печатает?Как я могу получить свой IP-адрес?

Ответы [ 2 ]

7 голосов
/ 04 февраля 2012

Прежде всего, вы не должны использовать интерфейс gethostbyname.Он устарел и не может работать с IPv6, который является практическим практическим шоу-стопором в 2012 году. Правильный интерфейс для использования - getaddrinfo.После того как вы использовали getaddrinfo для поиска имени хоста и получения его в форме адреса сокета, вы можете использовать getnameinfo с флагом NI_NUMERICHOST, чтобы преобразовать его в форму IP-адреса для печати.Это работает как для IPv4 или IPv6, так и для любых будущих протоколов.

Что касается вашей конкретной проблемы с печатью, как вы ожидаете %ld для печати IP-адреса?Он печатает одно число (long) в десятичном виде (основание 10).Вместо этого вы можете привести указатель к unsigned char * и прочитать 4 элемента, каждый из которых должен быть напечатан с помощью %d, но, опять же, это плохой подход.

3 голосов
/ 04 февраля 2012

Функции, которые вы вызываете, и область, которую вы исследуете, дают вам 32-битную переменную с каждым 8-битным октетом, содержащим один сегмент вашего IP-адреса. Следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>

#define HOST_NAME_MAX 1024

int main (void) {
    char *clientHostName = malloc(HOST_NAME_MAX);
    gethostname(clientHostName, HOST_NAME_MAX);
    printf("%s\n",clientHostName);
    struct hostent *thehost = gethostbyname(clientHostName);
    printf("%ld\n",(*((unsigned long *) thehost->h_addr_list[0])));
    printf("%08lx\n",(*((unsigned long *) thehost->h_addr_list[0])));
    return 0;
}

на моей коробке Xubuntu выдает:

formaldehyde
16842879
0101007f

и, если разбить это шестнадцатеричное число в конце на 01, 01, 00 и 7f, то это (в обратном порядке из-за моего процессора) 127.0.1.1, один из циклических адреса.

...