#sockets #ocaml #channel
#сокеты #ocaml #канал
Вопрос:
Я пытаюсь реализовать CLI с помощью 2 команд:
run
это порождает сокет unix/my/path/file.sock
и выдает выводwatch
который подключается к сокету и перенаправляет вывод на свой собственный вывод
Когда я завершаю выполнение watch
команды, я не могу понять, почему run
команда также завершается. Они не вызывают никаких исключений или системных сигналов. Я заметил, что проблемы возникают из-за flush
функции. После вызова он действует как exit 0
. Как же так?
Вот источники: https://github.com/soywod/comodoro
Ответ №1:
Сервер должен прослушивать отключение клиента и удалять соединение из списка соединений. Что-то вроде этого может сработать:
let client_thread conn =
let in_ch = in_channel_of_descr conn in
while true do
try input_line in_ch |> ignore
with End_of_file ->
(* Remove conn from !conn and close the conn *)
done
in
let add_conn () =
(* ... *)
Thread.create client_thread conn |> ignore;
(* ... *)
in
Комментарии:
1. Действительно, я не хотел слушать канал in, потому что мне это не нужно, но на самом деле обязательно знать, когда клиент отключается. Теперь работает как шарм, спасибо!