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

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

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

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

//unixdomain/unixstrserv01.c

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int listenfd, connfd;

 6  pid_t childpid;

 7  socklen_t clilen;

 8  struct sockaddr_un cliaddr, servaddr;

 9  void sig_chld(int);

10  listenfd = Socket(AF_LOCAL, SOCK_STREAM, 0);

11  unlink(UNIXSTR_PATH);

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

13  servaddr.sun_family = AF_LOCAL;

14  strcpy(servaddr.sun_path, UNIXSTR_PATH);

15  Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));

16  Listen(listenfd, LISTENQ);

17  Signal(SIGCHLD, sig_chld);

18  for (;;) {

19   clilen = sizeof(cliaddr);

20   if ((connfd = accept(listenfd, (SA*)&cliaddr, &clilen)) < 0) {

21    if (errno == EINTR)

22     continue; /* назад в for() */

23    else

24     err_sys("accept error");

25   }

26   if ((childpid = Fork()) == 0) { /* дочерний процесс */

27    Close(listenfd); /* закрывается прослушиваемый сокет */

28    str_echo(connfd); /* обработка запроса */

29    exit(0);

30   }

31   Close(connfd); /* родитель закрывает присоединенный сокет */

32  }

33 }

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

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

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

Обратите внимание, что этот вызов функции bind отличается от вызова, показанного в листинге 15.2. Здесь мы задаем размер структуры адреса сокета (третий аргумент) как общий размер структуры sockaddr_un, а не просто число байтов, занимаемое полным именем. Оба значения длины приемлемы, поскольку полное имя должно оканчиваться нулем.

Оставшаяся часть функции такая же, как и в листинге 5.9. Используется та же функция str_echo (см. листинг 5.2).

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

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

//unixdomain/umxstrcli01.c

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sockfd;

 6  struct sockaddr_un servaddr;

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

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

 9  servaddr sun_family = AF_LOCAL;

10  strcpy(servaddr.sun_path, UNIXSTR_PATH);

11  Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));

12  str_cli(stdin, sockfd); /* выполняет всю работу */

13  exit(0);

14 }

6 Теперь структурой адреса сокета, которая должна содержать адрес сервера, будет структура sockaddr_un.

7 Первый аргумент функции socketAF_LOCAL.

8-10 Код для заполнения структуры адреса сокета идентичен коду, показанному для сервера: инициализация структуры нулем, установка семейства протоколов AF_LOCAL и копирование полного имени в элемент sun_path.

12 Функция str_cli — та же, что и раньше (в листинге 6.2 представлена последняя разработанная нами версия).

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

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

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

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.Клиент


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

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

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


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

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

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


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

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

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


Проектирование систем клиент-сервер

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

Проектирование систем клиент-сервер Факт, что системы клиент-сервер должны быть спроектированы для использования в сетях. Для новичков часто бывает потрясением открытие того, что "молниеносно выполняемая" задача, которая работала в приложении под Paradox или Access, занимает


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

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

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


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

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

Пример: сервер времени и даты с указанием протокола В листинге 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.6. Клиент и сервер дейтаграммного доменного протокола Unix

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

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