Как обнаружить tcp, отключенный в элементе приемника tokio в библиотеке tokio-serde?

#rust #serde #rust-tokio

Вопрос:

Я нашел библиотеку под названием tokio-serde, которая будет отправлять и получать данные с помощью сокета tokio tcp, а также сериализовывать и десериализовывать их с помощью serde json.

Есть два примера, которые покажут, как вы можете создать сервер и клиент с помощью этой библиотеки.

В этом примере вы можете увидеть, как отправлять данные с помощью serialized объекта.

 serialized
        .send(json!({...}));
 

https://github.com/carllerche/tokio-serde/blob/master/examples/client.rs

Поэтому я создал серверное приложение и сохранил serialized объекты в векторе, чтобы отправлять им сообщения позже. Но по любой причине эти соединения могут быть отключены, и одноранговый клиент может быть недоступен.

Здесь моя проблема в том, как я могу определить, когда клиент отключен, используя serialized объект ?

Я просмотрел документацию, но не смог найти никакого решения.

Любая помощь действительно ценится. Огромное спасибо.

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

1. В общем случае вы получите ошибку при чтении или записи в поток, если другая сторона отключилась. Tokio-serde, похоже, просто подчиняется базовому типу ошибки, который будет std::io::Error . Кроме того, вы можете проверить его с помощью .ready() TcpStream и обнаружить любые ошибки таким образом.

Ответ №1:

Согласно комментарию @kmdreko. Я попытался получить доступ к базовому TcpSocket и определить состояние отключения, используя это.

Что-то подобное помогло бы определить, отключен ли клиент:

 if serialized.get_ref().get_ref().as_ref().ready(Interest::WRITABLE).await.is_err() { 
    // Connection error
}
 

Я знаю, что есть много get_ref() звонков, но это то, что я нашел на данный момент.