Вызывается метод recv_event() объекта ChatObjects::Comm для получения сообщения с сервера и разбиения его путем синтаксического анализа на код события и данные. Этот код будет применяться для поиска обработчика в таблице переходов %messages. Если таковой найден, он вызывается. В ином случае выводится предупреждающее сообщение. После вызова данной подпрограммы подпрограмма do_server () возвращает код события как результат своего выполнения.
Строки 76-88. Регистрация. Подпрограмма do_login () вначале отправляет код события logoff, если глобальная переменная $nickname уже определена. Затем она запрашивает у пользователя регистрационное имя путем вызова подпрограммы get_nickname () и отправляет на сервер сообщение login_req.
Теперь подпрограмма ожидает получения сообщения login_ack с подтверждением регистрации от сервера. Возможно, что запрос или подтверждение будут потеряны при передаче, поэтому подпрограмма do_login() несколько раз повторяет попытку регистрации, используя при этом функцию select () с шестисекундным тайм-аутом для ожидания ответа. Если подтверждение LOGIN_ACK не будет получено после пяти попыток, подпрограмма do_login() отказывается от дальнейших попыток.
Строки 89-158. Обработка событий сервера. Остальная часть этой клиентской программы в основном состоит из подпрограмм обработки событий сервера. Каждая из них выполняет синтаксический анализ данных событий сервера (если в этом есть необходимость) и выводит сообщение для пользователя, к примеру, его информационную подписку про солнечные модули гибкие . Типичным примером является подпрограмма list_channel () , которая вызывается при получении клиентом сообщения channel_item, содержащего информацию о том, к каким дискуссионным каналам может присоединиться пользователь.