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

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].

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

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

<p>17.4.3. Соединение с сервером</p>

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

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

 1: /* uclient.c */

 2:

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

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

 5:

 6: #include

 7: #include

 8: #include

 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;

36: }

Клиент не особенно отличается от сервера. Единственные изменения состоят в том, что последовательность функций bind(), listen(), accept() заменяется одним вызовом connect(), при этом копируется немного другой набор данных.

<p>17.4.4. Запуск примеров домена Unix</p>

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

<p>17.4.5. Неименованные сокеты домена Unix</p>

Благодаря тому, что сокеты домена Unix обладают некоторыми преимуществами перед каналами (например, они являются полнодуплексными), они часто используются в качестве механизма IPC. Для того чтобы облегчить этот процесс, вводится системный вызов socketpair().

#include

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных