Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

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) {

13: struct sockaddr_un address;

14: int sock;

15: size_t addrLength;

16:

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

18: die("socket");

19:

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

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

22:

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

24: sun_family */

25: addrLength = sizeof(address.sun_family) +

26: strlen(address.sun_path);

27:

28: if (connect(sock, (struct sockaddr *) &address, addrLength))

29: die("connect");

30:

31: copyData(0, sock);

32:

33: close(sock);

34:

35: return 0;

  • Читать дальше
  • 1
  • ...
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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