Как проверить, закрыт ли сокет в Boost.Asio?
-
03-07-2019 - |
Вопрос
Как проще всего проверить, закрыта ли розетка на удаленной стороне соединения? socket :: is_open ()
возвращает true, даже если он закрыт на удаленной стороне (я использую boost :: asio :: ip :: tcp :: socket
) . р>
Я мог бы попытаться прочитать из потока и посмотреть, удастся ли это, но мне пришлось бы изменить логику моей программы, чтобы она работала таким образом (я не хочу, чтобы данные извлекались из потока в точке чека).
Решение
Если одноранговое соединение было чисто закрыто, вы должны получить EOF во время чтения. Иначе я обычно пингуюсь, чтобы выяснить, действительно ли соединение живо.
Другие советы
Просто проверьте наличие ошибки boost :: asio :: error :: eof
в обработчике async_receive
. Это означает, что соединение было закрыто. Это единственный правильный способ сделать это.
Доступна ли функция ускоренного просмотра? В большинстве реализаций сокетов есть способ читать данные, не удаляя их из очереди, поэтому вы можете прочитать их позже. Казалось бы, это удовлетворяет вашим требованиям. Р>
После быстрого просмотра документов asio я не смог найти именно то, что ожидал, но это не значит, что его там нет. Р>
Я бы предложил этот для начинающих.
Я думаю, что, как правило, когда вы открываете сокет, вы должны начать читать его немедленно и никогда не прекращать. Таким образом, вы можете настроить свой сервер или клиент для поддержки синхронных и асинхронных протоколов. В тот момент, когда клиент закрывает соединение, момент чтения сообщит вам об этом. Р>
Использование error_code позволяет проверить условие, подключен клиент или нет. Если соединение установлено успешно, error_code error.value () вернет 0, иначе вернет другое значение. Вы также можете проверить сообщение () из кода ошибки.