Поиск общепринятого порта по имени

В большинстве клиентских программ необходимо предусмотреть поиск порта протокола для конкретной службы, которая должна быть вызвана. Например, в клиенте почтового сервера SMTP необходимо выполнить поиск общепринятого порта, назначенного для протокола SMTP. Для этого клиент вызывает библиотечную функцию getservbyname, которая принимает два параметра: строку с указанием желаемой службы и строку с указанием используемого протокола. Загрузка и Новости - 1102 hp картридж - акция! чуть ли не даром. Функция возвращает указатель на структуру типа servent, которая также определена во включаемом файле netdb.h:

struct servent { char *s_name; /* Стандартное имя службы */ char **s_aliases; /* Другие псевдонимы */ int s_port; /* Порт службы */ char *sj?roto; /* Используемый протокол */ }}

Если в клиенте TCP необходимо найти официально назначенный номер порта протокола для SMTP, в нем вызывается функция getservbyname, как показано в следующем примере:

struct servent *sptr; if ( sptr = getservbyname( "smtp", "tcp" )) { /* Теперь номер порта - в поле sptr->s_port */ } else { /* Возникла ошибка - обработать ошибку */ } 6.8. Номера портов и сетевой порядок байтов

Функция getservbyname возвращает номер порта протокола службы в сетевом порядке байтов. В главе 5 рассмотрено понятие сетевого порядка байтов и описаны библиотечные процедуры, позволяющие преобразовать данные из сетевого порядка байтов в порядок, используемый на локальном компьютере. Этого достаточно для понимания того, что функция getservbyname возвращает обозначение порта именно в той форме, которая требуется для использования в структуре sockaddr_in, но это внутреннее представление может не соответствовать представлению данных на локальном компьютере. Поэтому возвращаемое этой функцией значение нельзя выводить на печать без преобразования в локальный порядок байтов, т.к. оно может показаться неправильным. Новости - 1102 hp картридж - акция!

6.9. Поиск протокола по имени

В интерфейсе сокетов предусмотрен механизм, позволяющий преобразовать в клиентской или серверной программе имя протокола в целочисленную константу, назначенную этому протоколу. Поиск соответствия между этими значениями выполняет библиотечная функция getprotobyname. Вызов этой функции предусматривает передачу имени протокола в виде строкового параметра, а функция getprotobyname при ее вызове возвращает адрес структуры типа protoent. Если функция getprotobyname не может обратиться к базе данных для преобразования или указанное имя не существует, она возвращает нуль. База данных с именами протоколов позволяет определить на сетевом узле псевдонимы для каждого имени. Структура protoent имеет поле для официально назначенного имени протокола, а также поле, которое указывает на список псевдонимов. Объявление структуры содержится во включаемом файле netdb.h на языке С:

struct protoent { char *p_name; /* Стандартное имя протокола */ char **p_aliases; /* Список допустимых псевдонимов */ int р proto; /* Стандартный номер протокола */ }

Если в клиентской программе необходимо выполнить поиск официально назначенного номера протокола для UDP, в ней вызывается функция getprotobyname, как показано в следующем примере:

struct protoent *pptrj if ( pptr = getprotobyname( HudpH )) { /* Теперь стандартный номер протокола - в поле pptr->pj?roto */ } else { /* Возникла ошибка - обработать ошибку */ } 6.10. Алгоритмы клиентов TCP

Разработка клиентского программного обеспечения обычно проще по сравнению с разработкой серверного программного обеспечения. Поскольку все проблемы обеспечения надежности и управления потоком данных решаются с помощью протокола TCP, задача построения клиента с использованием TCP является наиболее простой из всех задач сетевого программирования. В клиенте TCP применяется алгоритм 6.1 для установления соединения с сервером и обмена с ним данными. В соответствии с этим алгоритмом, клиентское приложение распределяет сокет и подключает его к серверу. Затем оно отправляет через установленное соединение запросы и получает ответы. В следующих разделах каждый из этапов данного алгоритма рассматривается более подробно.

Алгоритм 6.1. Клиент с установлением логического соединения
  • 1. Найти IP-адрес и номер порта протокола сервера, с которым необходимо установить связь.
  • 2. Распределить сокет.
  • 3. Указать, что для соединения нужен произвольный, неиспользуемый порт протокола на локальном компьютере, и позволить программному обеспечению TCP выбрать такой порт.
  • 4. Подключить сокет к серверу.
  • 5. Выполнять обмен данными с сервером по протоколу прикладного уровня (для этого обычно требуется передавать запросы и принимать ответы).
  • 6. Закрыть соединение.
Похожие статьи Меню Опрос Фото Популярное