Чтение онлайн

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

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>

 6:

 7: /* Отображает номер порта TCP и все псевдонимы службы,

 8: указанной в командной строке */

 9:

10: /* services.с отыскивает номер порта для службы */

11: int main(int argc, const char ** argv) {

12: struct servent * service;

13: char ** ptr;

14:

15: if (argc != 2) {

16: fprintf(stderr, "поддерживается только одиночный аргумент\n");

17: return 1;

18: }

19:

20: /* поиск службы в /etc/services, в случае неудачи

21: передается ошибка */

22: service = getservbyname(argv[1] , "tcp");

23: if (!service) {

24: herror("getservbyname failed");

25: return 1;

26: }

27:

28: printf("служба: %s\n", service->s_name);

29: printf("tcp-порт: %d\n", ntohs(service->s_port));

31: /* отобразить все псевдонимы, которые имеет данная служба */

32: if (*service->s_aliases) {

33: printf("псевдонимы:");

34: for (ptr = service->s_aliases; *ptr; ptr++)

35: printf(" %s", *ptr);

36: printf("\n");

37: }

38:

39: return 0;

40: }

Ниже показан пример запуска программы. Обратите внимание на то, что она извлекает службы либо по каноническому имени, либо по псевдониму.

$ ./services http

служба: http

tcp-порт: 80

$ ./services source

служба: chargen

tcp-порт: 19

псевдонимы: ttytst source

Глава 18

Время

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

Газлайтер. Том 18

Володин Григорий Григорьевич
18. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 18

Секретарь лорда Демона

Лунёва Мария
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Секретарь лорда Демона

Жатва душ. Остров мертвых

Сугралинов Данияр
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Жатва душ. Остров мертвых

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Служанка. Второй шанс для дракона

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Служанка. Второй шанс для дракона

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Имперский Курьер. Том 2

Бо Вова
2. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 2

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Наследница долины Рейн

Арниева Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Наследница долины Рейн

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом