В этой пересмотренной версии метод send_to_all () сервера будет заменен другим. Вместо поиска каждого клиента и отправки ему одноадресного сообщения, к примеру, содержащего результаты лотереи , выполняется единственный вызов метода send_eveht () объекта связи с использованием адреса группы многоадресной рассылки в качестве адреса назначения. Более подробно этот метод будет рассмотрен при описании кода.
Рассмотрим пересмотренный протокол интерактивной переписки с точки зрения клиента. В первоначальной версии этой системы клиент обменивался с сервером сообщениями через единственный сокет UDP, назначенный серверу. В новой версии эта схема изменена.
Клиент создает сокет для взаимодействия с сервером. Этот этап остается так же, как и в первоначальном приложении. Для отправки от клиента к серверу всех сообщений применяется один сокет; мы будем называть его управляющим сокетом.
Клиент создает второй сокет для получения многоадресных сообщений. При регистрации клиента сервер отвечает двумя сообщениями. Первое подтверждает успешную регистрацию, а второе содержит номер порта, через который клиент должен принимать многоадресные сообщения. Клиент отвечает на это, создавая второй сокет и привязывая его к указанному порту. Теперь клиент выполняет в цикле функцию select (), ожидая перехода в состояние готовности сокета многоадресной рассылки, а также стандартного устройства ввода и управляющего сокета.
Клиент присоединяется к группам многоадресной рассылки для подключения к каналам. Существует взаимно однозначное соответствие между каналами интерактивной переписки и группами многоадресной рассылки. После того как клиент подключается к новому каналу интерактивной переписки, сервер отвечает подтверждением, содержащим адрес группы многоадресной рассылки, через который передаются общедоступные сообщения для нее. Клиент присоединяется к группе с использованием методаmcast_add ().
Клиент выходит из группы многоадресной рассылки для отключения от канала. Что бы отключиться от канала, клиент вызывает метод mcast_drop ().
Клиент, как и прежде, отправляет общедоступные сообщения. Для отправки общедоступного сообщения клиент посылает его на сервер, а сервер ретранслирует сообщение как многоадресное. Поэтому код клиентской программы для отправки общедоступного сообщения остается таким же, как и в первоначальной версии.
С точки зрения сервера необходимо внести следующие изменения.