Как обрабатывать ошибки в мио?

Я строю многопоточный асинхронный HTTP-сервер поверх MIO.

Как я должен обрабатывать события на клиенте TcpStream соединения?

  • За is_readable это довольно просто: я читаю запрос и пишу ответ.
  • Для других видов я не уверен. Нужно ли мне shutdown() поток, если я получу is_error или же is_hup? Как насчет is_none()?

1 ответ

Решение

Все вещи, которые вы упоминаете, имеют очень точное значение и отображаются непосредственно в POSIX/BSD Socket API. Тебе решать.

is_hup Читайте, значит другая сторона вешает трубку отправляющей стороне. Это значит, что он больше ничего не отправит. Однако это могло держать чтение открытым, и вы все равно могли бы захотеть отправить в него некоторые данные.

shutdown закрывает Чтение / Запись / Оба https://doc.rust-lang.org/std/net/enum.Shutdown.html, так что вам решать, что и когда вы хотите сделать.

TcpStream внутренне держит FileDesc и это будет close fd когда вы бросаете его, так что если вы этого не сделаете shutdown вручную все равно будет закрыто, как только вы удалите данные TcpStream от использования. https://github.com/rust-lang/rust/blob/master/src/libstd/sys/unix/fd.rs#L217

Другие вопросы по тегам