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

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

Жанры

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

Троан Эрик В.

Шрифт:

};

В ядре Linux 2.6.7 значение переменной

UNIX_PATH_MAX
равно
108
, но в последующих версиях ядра Linux оно может измениться.

Первый член

sun_family
должен содержать
AF_UNIX
для того, чтобы показать, что структура содержит адрес домена Unix. Параметр
sun_path
хранит путевое имя, которое нужно использовать для соединения. Если системным вызовам, относящимся к сокету, передается размер адреса, то передаваемая длина равна количеству символов в путевом имени плюс размер элемента
sun_family
. Параметр
sun_path
не обязательно должен заканчиваться
'\0'
, хотя обычно делают именно так.

17.4.2. Ожидание соединения

Как объяснялось выше, ожидание установки соединения на сокете домена Unix придерживается следующей процедуры: создание сокета, привязка адреса к сокету, перевод системы в режим ожидания соединений и принятие соединения.

Ниже показан пример простого сервера, который многократно принимает соединения с сокетом домена Unix (файл

sample-socket
в текущем каталоге) и считывает все данные из сокета, посылая их на стандартный вывод.

 1: /* userver.c */

 2:

 3: /* Ожидает соединения на сокете ./sample-socket домена Unix.

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

 5: из сокета в stdout до тех пор, пока вторая сторона не

 6: закрывает соединение. Далее ожидает следующее соединение

 7: с сокетом. */

 8:

 9: #include <stdio.h>

10: #include <sys/socket.h>

11: #include <sys/un.h>

12: #include <unistd.h>

13:

14: #include "sockutil.h" /* некоторые служебные функции */

15:

16: int main (void) {

17: struct sockaddr_un address;

18: int sock, conn;

19: size_t addrLength;

20:

21: if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)

22: die("socket");

23:

24: /* Удалить все сокеты (или файлы), существовавшие ранее */

25: unlink("./sample-socket");

26:

27: address.sun_family = AF_UNIX; /* сокет домена Unix */

28: strcpy(address.sun_path, "./sample-socket");

29:

30: /* Общая длина адреса, включая элемент

31: sun_family */

32: addrLength = sizeof(address.sun_family) +

33: strlen(address.sun_path);

34:

35: if (bind(sock, (struct sockaddr *) &address, addrLength))

36: die("bind");

37:

38: if (listen(sock, 5))

39: die("listen");

40:

41: while ((conn = accept(sock, (struct sockaddr *) &address,

42: &addrLength)) >=0) {

43: printf("----
получение данных\n");

44: copyData(conn, 1);

45: printf("---- готово\n");

46: close(conn);

47: }

48:

49: if (conn < 0)

50: die("accept");

51:

52: close(sock);

53: return 0;

54: }

Несмотря на небольшой размер приведенной программы, она хорошо иллюстрирует, как написать простой серверный процесс. Этот сервер является итеративным, поскольку он обрабатывает только одного клиента за раз. Можно создавать также параллельные серверы, управляющие несколькими клиентами одновременно [124] .

124

Исходя из условий реального мира, большинство серверных программ должны быть параллельными. Однако многие из них фактически созданы как итерационные сервера. Например, Web-серверы, в основном, обрабатывают только одно соединение за раз через данный процесс. Для того чтобы разрешить соединение нескольким клиентам, сервер организован в виде множества отдельных процессов. Это делает создание Web-сервера более простым. Если ошибка прерывает работу одного из таких процессов, она затрагивает только одно клиентское соединение.

Обратите внимание на то, что функция

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

Серверный код приводит тип указателя

struct sockaddr_un
, передаваемого и в
bind
, и в
accept
, к
(struct sockaddr *)
. При прототипировании различных системных вызовов, относящихся к сокетам, предполагается, что они принимают указатель на
struct sockaddr
. Приведение типа предотвращает появление уведомлений от компилятора о несоответствии типов указателей.

17.4.3. Соединение с сервером

Процесс соединения с сервером через сокет домена Unix состоит из создания сокета и присоединения к требуемому адресу через функцию

connect
. Как только сокет присоединен, он может обрабатываться как любой другой файловый дескриптор.

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

 1: /* uclient.c */

 2:

 3: /* Подключиться к сокету ./sample-socket домена Unix, скопировать stdin

 4: в сокет, после этого выйти из программы. */

 5:

 6: #include <sys/socket.h>

 7: #include <sys/un.h>

 8: #include <unistd.h>

 9:

10: #include "sockutil.h" /* некоторые служебные функции */

11:

12: int main(void) {

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

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

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

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

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9