Книга: Разработка приложений в среде Linux. Второе издание

17.8.3. Пример поиска информации хоста с использованием унаследованных функций

17.8.3. Пример поиска информации хоста с использованием унаследованных функций

Ниже приводится пример программы, использующей inet_aton(), inet_ntoa(), gethostbyname(), gethostbyaddr(). Она принимает единственный аргумент, который может быть либо именем хоста, либо IP-адресом в десятичном представлении с точками. Она отыскивает хост и распечатывает все имена хоста и IP-адреса, ассоциированные с ним.

Любой аргумент, который является действительным десятичным адресом, считается IP-номером, а не именем хоста.

 1: /* lookup.с */
 2:
 3: /* Получает либо имя хоста, либо IP-адрес в командной строке, выводит
 4:    каноническое имя хоста для данного хоста и все IP-номера и имена
 5:    хостов, ассоциированные с ним. */
 6:
 7: #include <netdb.h> /* для gethostby* */
 8: #include <sys/socket.h>
 9: #include <netinet/in.h> /* для адресных структур */
10: #include <arpa/inet.h> /* для inet_ntoa() */
11: #include <stdio.h>
12:
13: int main(int argc, const char ** argv) {
14:  struct hostent * answer;
15:  struct in_addr address, ** addrptr;
16:  char ** next;
17:
18:  if (argc != 2) {
19:   fprintf(stderr, "поддерживается только одиночный аргументn");
20:   return 1;
21:  }
22:
23:  /* Если аргумент выглядит как IP, то принимаем его как таковой
24:     и выполняет обратный поиск имени */
25:  if (inet_aton(argv[1], &address))
26:   answer = gethostbyaddr((char *)&address, sizeof(address),
27:                           AF_INET);
28:  else
29:   answer = gethostbyname(argv[1])
30:
31:  /* поиск имени хоста не удался */
32:  if (!answer) {
33:   herror("ошибка поиска хоста");
34:   return 1;
35:  }
36:
37:  printf("Каноническое имя хоста: %sn", answer->h_name);
38:
39:  /* если есть псевдонимы, все они выводятся на печать */
40:  if (answer->h_aliases[0]) {
41:   printf("Псевдонимы:");
42:   for(next = answer->h_aliases; *next; next++)
43:    printf(" %s", *next);
44:   printf("n");
45:  }
46:
47:  /* отобразить все IP-адреса для данной машины */
48:  printf("Адреса:");
49:  for (addrptr = (structin_addr **) answer->h_addr_list;
50:   *addrptr; addrptr++)
51:   printf (" %s", inet_ntoa(**addrptr));
52:  printf("n");
53:
54:  return 0;
55: }

Ниже показан пример вывода этой программы.

$ ./lookup ftp.netscape.com
Каноническое имя хоста: ftp25.netscape.com
Псевдонимы: ftp.netscape.com anonftp10.netscape.com
Адреса: 207.200.74.21

Оглавление книги


Генерация: 1.198. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз