Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

30:

31: /* поиск имени хоста не удался */

32: if (!answer) {

33: herror("ошибка поиска хоста");

34: return 1;

35: }

36:

37: printf("Каноническое имя хоста: %s\n", 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

17.8.4. Поиск номеров портов

Новые функции

getaddrinfo
и
getnameinfo
предлагают простое выполнение преобразований имен служб в номера портов с одновременным определением имени хоста. В старых реализациях поиск имен служб проводился абсолютно независимо от поиска имен хостов. Доступ к именам служб можно получить через функцию
getservbyname
.

#include <netdb.h>

struct servent * getservbyname(const char * name,

 const char * protocol);

Первый параметр

name
представляет собой имя службы, о которой в приложении требуется информация. Параметр
protocol
указывает протокол для использования. База данных служб содержит информацию о других протоколах (особенно UDP); конкретное определение протокола позволяет функции игнорировать информацию по другим протоколам. Параметр
protocol
обычно является строкой
"tcp"
, хотя могут использоваться и другие имена протоколов, например,
"udp"
.

Функция

getservbyname
возвращает указатель на структуру, которая содержит информацию о запрашиваемой службе. Информация может перезаписываться при последующем вызове
getservbyname
, поэтому важные данные нужно сохранять в приложении. Функция
getservbyname
возвращает следующую информацию:

#include <netdb.h>

struct servent {

 char * s_name; /* имя службы */

 char ** s_aliases; /* псевдонимы службы */

 int s_port; /* номер порта */

 char * s_proto; /* протокол для использования */

}

Каждая служба может иметь несколько имен, ассоциированных с ней, но только один номер порта. Переменная

s_name
регистрирует каноническое имя службы,
s_port
содержит официальный номер порта данной службы (представленный в сетевом порядке байтов),
s_proto
представляет протокол для использования (например,
"tcp"
). Член
s_aliases
является массивом указателей псевдонимов службы (указатель
NULL
обозначает конец списка).

Если функция не выполняет свою работу, то она возвращает

NULL
и устанавливает
h_errno
. Ниже приведен пример программы, которая извлекает TCP-службу, указанную в командной строке, и выводит на экран каноническое имя, номер порта и все псевдонимы данной службы.

 1: /* services.с */

 2:

 3: #include <netdb.h>

 4: #include <netinet/in.h>

 5: #include <stdio.h>

  • Читать дальше
  • 1
  • ...
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: