Класс TCPServer Описание простейшего TCP-сервера сводится к написанию обработчика, который запускается для каждого входящего соединения работающего сервера. Прежде чем писать этот обработчик, нужно ответить на два вопроса:
-- первый тип -- то, что принимает обработчик в качестве параметра -- второй тип -- то, какого типа сообщения он принимает class TCPServer serverState serverMessage where -- то, что нужно определить tcpHandler -- обработчик для каждой сессии :: serverState -- состояние сервера -> AcceptData -- параметры соединения -> Proc serverMessage () -- принимает сообщения типа serverMessage -- то, что не нужно определять. Используется для управления startManager -- запускает сервер :: serverState -- состояние сервера -> Bool -- каждое соединение -- это OS-процесс? -> Integer -- прослушиваемый порт -> Proc t -- возвращает процесс менеджера (Process (TCPManager serverMessage)) stopManager, killManager -- останавливают сервер :: Process (TCPManager serverMessage) -- процесс менеджера -> Proc t () getConnections -- получить список активных соединений :: Process (TCPManager serverMessage) -- процесс менеджера -> Proc t (Connections serverMsg) -- возвращает список активных соединений Управление сервером Функции startManager, stopManager и killManager используются для запуска и остановки сервера соответственно. При этом существует два способа остановить работающий сервер:
Важное об управлении сервером Особенности внутренней организации сервера таковы, что при запуске мы получаем ссылку на процесс, который фактически не принимает соединения, а выполняет задачи по их регистрации и правильного осуществления способов остановки. Это процесс-менеджер сервера. Через него осуществляется всё управление сервером. Приёмом соединений занимается другой процесс. Поэтому убийство процесса-менеджера не приведет к остановки сервера и будет ошибочным. Вместо этого получится процесс-зомби, который неконтролируемо всё еще будет принимать соединения и запускать обработчики. Так делать не нужно. Следует останавливать сервер только через stopManager или killManager. Тип TCPManager serverMessage — это тип сообщений процесса-менеджера. Не используется напрямую. Открыт для написания расширений. Тип AcceptData = (Handle, HostName, PortNumber) — параметры текущего соединения Это второй аргумент обработчика.
Тип Connections serverMessage = Map (Process serverMessage) AcceptData Список активных соединений, возвращаемый функцией getConnections. |