15.6. Клиент и сервер дейтаграммного доменного протокола Unix

15.6. Клиент и сервер дейтаграммного доменного протокола Unix

Теперь мы перепишем наши клиент и сервер UDP из разделов 8.3 и 8.5 с использованием сокетов. В листинге 15.5 показан сервер, который является модификацией листинга 8.1.

Листинг 15.5. Эхо-сервер дейтаграммного доменного протокола Unix

//unixdomain/unixdgserv01.c

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sockfd;

 6  struct sockaddr_un servaddr, cliaddr;

 7  sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);

 8  unlink(UNIXDG_PATH);

 9  bzero(&servaddr, sizeof(servaddr));

10  servaddr.sun_family = AF_LOCAL;

11  strcpy(servaddr.sun_path, UNIXDG_PATH);

12  Bind(sockfd, (SA*)&servaddr, sizeof(servaddr));

13  dg_echo(sockfd, (SA*)&cliaddr, sizeof(cliaddr));

14 }

6 Две структуры адреса сокета относятся теперь к типу sockaddr_un.

7 Для создания дейтаграммного доменного сокета Unix первый аргумент функции socket должен иметь значение AF_LOCAL.

8-12 Константа UNIXDG_PATH определяется в заголовочном файле unp.h как /tmp/unix.dg. Сначала мы вызываем функцию unlink, чтобы удалить полное имя в случае, если оно сохранилось после предыдущего запуска сервера, а затем инициализируем структуру адреса сокета перед вызовом функции bind. Ошибка при выполнении функции unlink — это нормальное явление.

13 Используется та же функция dg_echo (см. листинг 8.2).

В листинге 15.6 представлен эхо-клиент дейтаграммного доменного протокола Unix. Это модификация листинга 8.3.

Листинг 15.6. Эхо-клиент дейтаграммного доменного протокола Unix

//unixdomain/unixdgcli01.с

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sockfd;

 6  struct sockaddr_un cliaddr, servaddr;

 7  sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);

 8  bzero(&cliaddr, sizeof(cliaddr)); /* связывание сокета с адресом */

 9  cliaddr.sun_family = AF_LOCAL;

10  strcpy(cliaddr.sun_path, tmpnam(NULL);

11  Bind(sockfd, (SA*)&cliaddr, sizeof(cliaddr));

12  bzero(&servaddr, sizeof(servaddr)); /* заполняем структуру адреса

                                           сокета сервера */

13  servaddr.sun_family = AF_LOCAL;

14  strcpy(servaddr.sun_path, UNIXDG_PATH);

15  dg_cli(stdin, sockfd, (SA*)&servaddr, sizeof(servaddr));

16  exit(0);

17 }

6 Структурой адреса сокета, содержащей адрес сервера, теперь будет структура sockaddr_un. Мы также размещаем в памяти одну из этих структур, чтобы она содержала адрес клиента, о чем мы расскажем далее.

7 Первый аргумент функции socket — это AF_LOCAL.

8-11 В отличие от клиента UDP при использовании дейтаграммного доменного протокола Unix требуется явно связать с помощью функции bind полное имя с нашим сокетом, чтобы сервер имел полное имя, на которое он мог бы отправить свой ответ. Мы вызываем функцию tmpnam, чтобы получить уникальное полное имя, с которым затем при помощи функции bind свяжем наш сокет. Вспомните из раздела 15.4, что при отправке дейтаграммы на неприсоединенный дейтаграммный доменный сокет Unix не происходит неявного связывания полного имени с сокетом. Следовательно, если мы опустим этот шаг, вызов сервером функции recvfrom в функции dg_echo возвращает пустое полное имя, что затем приведет к ошибке, когда сервер вызовет функцию sendto.

12-14 Код для заполнения структуры адреса сокета заранее известным полным именем идентичен коду, представленному ранее для сервера.

15 Функция dg_cli остается той же, что и раньше (см. листинг 8.4).

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

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

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

2.2.9.1 Взаимодействие клиент-сервер

Из книги Руководство администратора баз данных Informix. автора Кустов Виктор

2.2.9.1 Взаимодействие клиент-сервер Продукты INFORMIX построены на принципах архитектуры клиент/сервер. Это означает, что сервер INFORMIX-OnLine DS выполняется на одном компьютере, а клиентские приложения выполняются на других компьютерах, связанных с сервером сетью. При этом от


11.6.8.4. Пара клиент/сервер

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

11.6.8.4. Пара клиент/сервер Пара клиент/сервер подобна паре драйвер/ядро, за исключением того, что часть ядра является запущенным в фоновом режиме демоном, от которого не требуется интерактивная работа и наличие собственного пользовательского интерфейса. Обычно демон


11.6.8.4. Пара клиент/сервер

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

11.6.8.4. Пара клиент/сервер Пара клиент/сервер подобна паре драйвер/ядро, за исключением того, что часть ядра является запущенным в фоновом режиме демоном, от которого не требуется интерактивная работа и наличие собственного пользовательского интерфейса. Обычно демон


4.2. Приложение типа клиент-сервер

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

4.2. Приложение типа клиент-сервер Пример приложения модели клиент-сервер приведен на рис. 4.1. Именно на него мы будем ссылаться в тексте этой главы и главы 6 при необходимости проиллюстрировать использование программных каналов, FIFO и очередей сообщений System V.Клиент


6.7. Пример программы клиент-сервер

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

6.7. Пример программы клиент-сервер Перепишем наш пример программы типа клиент-сервер из раздела 4.2 с использованием двух очередей сообщений. Одна из очередей предназначена для передачи сообщений от клиента серверу, а другая — в обратную сторону.Заголовочный файл svmsg.h


10.1.2 TCP и модель клиент/сервер

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

10.1.2 TCP и модель клиент/сервер TCP естественным образом интегрируется в окружение клиент/сервер (см. рис. 10.1). Серверное приложение прослушивает (listen) поступающие запросы на соединение. Например, службы WWW, пересылки файлов или доступа с терминала прослушивают запросы,


Клиент-сервер

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Клиент-сервер Средства локального доступа.* Локальная заглушка TCP/IP. Для многоуровневых серверных приложений и других клиентов доступ к локальному серверу на любой поддерживаемой платформе осуществляется через протокол TCP/IP: даже при отсутствии сетевой карты соединение


Характеристики СУБД клиент-сервер

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

Характеристики СУБД клиент-сервер Масштабируемость Появление сравнительно недорогих компьютерных сетей между 1980-ми и 1990-ми годами вызвало увеличенный спрос на масштабируемые информационные системы с дружественным пользователю интерфейсом. Программное обеспечение


Двухуровневая архитектура клиент-сервер

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

Двухуровневая архитектура клиент-сервер На рис. 6.1 изображена гибкая система, где множество серверов Firebird выполняются на платформах с различными операционными и файловыми системами. Здесь присутствует смесь рабочих станций, на которых выполняются удаленные клиенты,


Динамические приложения клиент-сервер

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

Динамические приложения клиент-сервер Во время выполнения программы приложениям часто бывают нужны операторы SQL, которые создаются или изменяются приложениями или вводятся пользователями. Приложения обычно предоставляют пользователю списки выбора, извлекаемые из


Пример: сервер времени и даты с указанием протокола

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

Пример: сервер времени и даты с указанием протокола В листинге 11.7 есть небольшая проблема: первый аргумент функции tcp_listen — пустой указатель, объединенный с семейством адресов AF_UNSPEC, который задает функция tcp_listen, — может заставить функцию getaddrinfo возвратить структуру


Пример: не зависящий от протокола UDP-клиент времени и даты

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

Пример: не зависящий от протокола UDP-клиент времени и даты Теперь мы перепишем наш клиент времени и даты, показанный в листинге 11.3, так, чтобы в нем использовалась наша функция udp_client. В листинге 11.10 представлен не зависящий от протокола исходный код.Листинг 11.10. UDP-клиент


Пример: не зависящий от протокола UDP-сервер времени и даты

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

Пример: не зависящий от протокола UDP-сервер времени и даты В листинге 11.13 представлен наш сервер времени и даты, полученный путем модификации листинга 11.8 и предназначенный для использования UDP.Листинг 11.13. Не зависящий от протокола UDP-сервер времени и даты//names/daytimeudpsrv2.c 1


15.2. Структура адреса доменного сокета Unix

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

15.2. Структура адреса доменного сокета Unix В листинге 15.1[1] показана структура адреса доменного сокета Unix, задаваемая включением заголовочного файла <sys/un.h>.Листинг 15.1. Структура адреса доменного сокета Unix: sockaddr_unstruct sockaddr_un { uint8_t     sun_len; sa_family_t sun_family;    /* AF_LOCAL


15.5. Клиент и сервер потокового доменного протокола Unix

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

15.5. Клиент и сервер потокового доменного протокола Unix Теперь мы перепишем наш эхо-клиент и эхо-сервер TCP из главы 5 с использованием доменных сокетов Unix. В листинге 15.3 показан сервер, который является модификацией сервера из листинга 5.9 и использует потоковый доменный