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

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, "поддерживается только одиночный аргумент ");

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 ", service->s_name);

29:  printf("tcp-порт: %d ", 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(" ");

37:  }

38:

39:  return 0;

40: }

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

$ ./services http

служба: http

tcp-порт: 80

$ ./services source

служба: chargen

tcp-порт: 19

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Рост популярности номеров социального страхования

Из книги Все под контролем: Кто и как следит за тобой автора Гарфинкель Симеон

Рост популярности номеров социального страхования Изначально не предполагалось использовать номера социального страхования (SSN) в качестве универсального идентификатора для каждого американского гражданина, однако буквально через 10 лет они стали таковыми.• В 1943 году


Считыватель номеров автомобилей

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Считыватель номеров автомобилей Электронные метки служат не только для опознавания машин на открытой дороге. Американская таможня установила считыватели номеров автомобилей на большинстве пограничных пунктов между США и Канадой. Используемая в этих системах


Добавление в список контактов номеров пользователей Skype

Из книги Сетевые средства Linux автора Смит Родерик В.

Добавление в список контактов номеров пользователей Skype Создадим список контактов, который отобразится на панели Контакты, там, где теперь только один контакт Тест-звонок Skype. Чтобы добавить туда нового абонента, вам необходимо выполнить следующие действия.1. Щелкните


Добавление в список контактов обычных номеров телефонов

Из книги XSLT автора Хольцнер Стивен

Добавление в список контактов обычных номеров телефонов Рассмотрим, как добавить в список контактов обычные номера телефонов.1. Щелкните кнопкой мыши на значке Добавить абонента на вкладке Контакты. Откроется диалоговое окно Добавить контакт (см. рис. 3.21).2. Нажмите


Отображение портов

Из книги Технология XSLT автора Валиков Алексей Николаевич

Отображение портов Большинство серверов TCP/IP принимают обращения от клиентов через порт с определенным номером. Так, например, сервер, реализующий протокол SMTP (Simple Mail Transfer Protocol — простой протокол передачи почты), использует при работе порт 25, а Web-сервер, поддерживающий


Перенаправление портов

Из книги Ководство автора Лебедев Артём Андреевич

Перенаправление портов Бывают ситуации, при которых обращение к одному узлу должно быть перенаправлено на другой узел либо на другой порт того же компьютера. Эта задача решается с помощью перенаправления портов, организуемого с помощью программы


Создание номеров страниц:

Из книги VBA для чайников автора Каммингс Стив

Создание номеров страниц: <fo:page-number> Встроенный форматирующий объект <fo:page-number> создает встроенную область, отображающую номер текущей страницы. Например:<fo:block> You are now reading page <fo:page-number/>.</fo:block>С элементом <fo:page-number> можно применять следующие


Вычисление номеров

Из книги 1С: Бухгалтерия 8 с нуля. 100 уроков для начинающих автора Гладкий Алексей Анатольевич

Вычисление номеров Пожалуй, самым простым для понимания (но не самым простым в использовании) способом вычисления номера является использование XPath-выражений. Этот способ практически идентичен использованию xsl:value-of, как было показано в начале этой главы. Единственным


§ 91. Краткая история телефонных номеров

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

§ 91. Краткая история телефонных номеров 18 июня 2002Известно, что первые слова, сказанные по телефону 10 марта 1876 года, принадлежат шотландскому изобретателю Александру Грэму Беллу: Mr. Watson — Come here — I want to see you («Мистер Ватсон, зайдите, я хочу вас видеть» — англ.). Чтобы


Урок № 13. Классификатор номеров ГТД

Из книги автора

Урок № 13. Классификатор номеров ГТД Классификатор номеров ГТД предназначен для хранения номеров всех грузовых таможенных деклараций, по которым когда-либо было поступление импортных товарно-материальных ценностей. Содержимое справочника используется, например, в


10.7.2. Сканирование портов

Из книги автора

10.7.2. Сканирование портов В разд. 1.1 мы говорили о том, что на начальном этапе взлома компьютера хакер должен получить как можно больше сведений о жертве. Средством сбора первичной информации является сканирование портов. Делать это с собственного компьютера опасно,


8.1.5. Вывод номеров строк

Из книги автора

8.1.5. Вывод номеров строк С помощью опции -n выводимые строки можно пронумеровать. В результате вы сможете с легкостью устанавливать, в какой позиции файла находится требуемая строка. Например:$ grep -n "48"


2.9. Номера портов

Из книги автора

2.9. Номера портов В любой момент времени каждый транспортный протокол (UDP, TCP, SCRIPT) может использоваться несколькими процессами. Все три протокола различают эти процессы при помощи 16-разрядных целых чисел — номеров портов (port numbers).Когда клиент хочет соединиться с сервером,