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

#rust #mio

#Ржавчина #mio

Вопрос:

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

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

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

Комментарии:

1. Вы видели эту серию Германа Дж. Радтке ? Он содержит полезную информацию об обработке ошибок в mio .

2. Спасибо, это чтение было интересным. К сожалению, он мало говорит об обработке ошибок 🙂

Ответ №1:

Все, что вы упоминаете, имеет очень точное значение и напрямую связано с POSIX / BSD Socket API. Решать вам.

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

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

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