Мы выбрали первую схему по следующим причинам. Прежде всего, хотелось избежать слишком большой переработки клиентской программы, которая потребовалась бы в том случае, если бы задача контроля над тем, к каким каналам присоединился пользователь, перешла к клиенту. Кроме того, хотелось сохранить возможность введения на сервере общего контроля над тем, что содержится в сообщениях клиентов, к примеру, это может быть информация по ремонту sony xperia e3 . Во многих системах интерактивной переписки предусмотрена функция, позволяющая администратору сервера призвать к порядку пользователя, который в своих действиях выходит за рамки приличий. Поскольку все общедоступные сообщения должны проходить через сервер, то существует возможность добавить это средство позже. Немаловажным является также то, что исходящие многоадресные сообщения имеют время жизни TTL, который может иметь разный смысл в различных клиентских подсетях. Если все многоадресные сообщения исходят от сервера, то появляется возможность обеспечить “постоянство” области распространения общедоступных сообщений.
Вначале рассмотрим программу сервера, а затем и программу клиента. Первое изменение весьма незначительно. В модуле ChatObjects::ChatCodes введена новая константа с кодом события. Это сообщение отправляется сервером клиенту для указания на то, к какому порту он должен выполнить привязку для получения многоадресных сообщений. Теперь рассмотрим сценарий сервера. Он почти не отличается от первоначальной версии, поэтому представим только те фрагменты, которые в нем изменились.
Строки 4-7. Загрузка модулей, содержащих подклассы многоадресной рассылки. Вместо загрузки модулей ChatObjects::Channel и ChatObjects::Comm, загружаются немного измененные подклассы ChatObjects::MChannel и ChatObjects::MComm.
Строки 19-21. Чтение параметров из командной строки. Из командной строки считываются три параметра с обозначением управляющего порта, порта многоадресной рассылки и значения TTL исходящих общедоступных сообщений. Если порт многоадресной рассылки не указан, применяется номер управляющего порта, увеличенный на единицу. Если не указано значение TTL, то используется значение 31, соответствующее области распространения в масштабах всей организации.