сбой сервера или просто вызвать `shutdown (fd, SHUT_WR)`? - PullRequest
0 голосов
/ 28 ноября 2018

Когда сервер выходит из строя или просто звонит shutdown(fd, SHUT_WR), клиент все read() возвращают 0.

Как их различить?

Буду признателен, если вы мне поможете.

1 Ответ

0 голосов
/ 29 ноября 2018

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

Если возможно, каждый узел должен отправить протокол.-определенное прощальное сообщение, когда оно намеренно закрывает свою сторону соединения.Если одноранговый узел обнаруживает, что соединение было закрыто / потеряно и такое сообщение не было получено заранее, он может предположить, что другой одноранговый узел вышел из строя и действовать соответствующим образом (т. Е. Клиент может повторно подключиться с новым сокетом и т. Д.).

Когда процесс завершается, ОС закрывает все активные подключения, которые процесс еще не завершил.Но то, будет ли выживший одноранговый узел получать "изящное" уведомление о закрытии или "ненормальную" ошибку сокета, в значительной степени определяется реализацией соответствующими сетевыми стеками.Вот почему, если различие важно, не полагайтесь исключительно на тип обнаруженного закрытия соединения.Сделайте так, чтобы ваши коллеги открыто заявили о своем намерении закрыть соединение.

...