Как хорошо, что дырочку для клизмы
Имеют все живые организмы.
(о биективности отображений, но для сетей также подходит)
Разберем работу сервера
Что должен лелать сервер? Сервер должен одновременно принимать запросы на подключение, отвечать на запросы уже подключенных пользователей и в случае необходимости делать отправку массового и личного оповещения пользователей. Да вот беда - мы не можем реализовать линейную программу (по принципу ее выполнения) с реагированием на воздействия. Нет, мы конечно же можем, но это будет драйвер ОС. Потому, мы решаем поступить следующим образом - запустить одного управляющего и его подчиненных. То есть - у нас есть работа, требующая выполнения сразу нескольких действий. Любой работник (программа), может выполнять только одно действие. А если создать организацию с управляющим (ничего не делающей программой) и подчиненными ему работниками, выполняющими каждый свои обязанности, то получится очень даже складная система и работа пойдет слаженно. Главное что бы не подчиненные не выпендривались и четко выполняли инструкции данные управляющим. Управляющий, в свою очередь, не должен заходить за заранее определенные рамки и должен понимать, что подчиненный умеющий только читать - писать не будет. Эдакое разделение трудовых обязанностей. А вслучае чего - все устраиваются железнодорожниками: управляющий ссылается на невыполнение служебных обязанностей подчиненными, которые в свою очередь жалуются на невыполнимость запросов управляющего ("Но ведь моя должность называется ТОЛЬКО ЧТЕНИЕ, а не ЧТЕНИЕ И ЗАПИСЬ").
Поскольку подчиненные теперь обладают некоторой независимостью от управляющего (и наоборот ~--- управляющие не зависит от подчиненных), то выход каждого из них на работу (внутри-ведомственный эфир. Здесь ведомство - машина-сервер) не регламентированно, а потому нужна жесткая дисциплина, достигаемая конкретным согласованием временных рамок.
Таким образом, что бы все работало как положено, мы сначала запускаем управляющую программу. Она создает каналы связи с подчиненными (системный pipe), выполняющими только одно действие. Отдельно запускает подчиненных с параметрами канала связи. У нас будет всего три подчиненных - прием подключений, прием сообщений, отправка сообщений. Затем, программа для получения подключений создает серверный сокет, передает его номер управляющему, он в свою очередь передает его программам приема и отправки сообщений. При получении нового подключения программа ППП (Программа-Получатель Подключений) передает сведения об отправителе ЗП (Запроса на Подключение) управляющему, передает эти данные ПОС (Программе Отправки Сообщений). Она отправляет запрос на дополнительные сведения о клиенте. Клиент отправляет сведения о себе. Их получает ППС (Программа Получения Сообщений) и отправляет их ПУ (Программе Управляющему).
Во время простоя (отсутсвия ВС, ИС, ВП (Входящих Сообщений, Исходящих Сообщений, Входящих Подключений)) ПУ обходит каналы связи с ППП, ППС, ПОС. Канал связи с ППП работает только на чтение (возможно и на запись для подтверждения и синхронизации). Канал связи с ППС работает только на чтение (возможно и на запись для подтверждения и синхронизации). Канал связи с ПОС работает только на запись (возможно и на чтение для подтверждения и синхронизации).
Разберем работу клиента
Клиент выполняет прием сообщений, отправку сообщений и ввод с клавиатуры. Организация такаяжа как и у сервера, только вместо ППП будет ПВК (Программа Ввода с Клавиатуры).
------------------------------------
Разбор окончен. Спасибо за внимание. Далее будет исходный код сервера и клиента.