Вопрос

Как проще всего проверить, закрыта ли розетка на удаленной стороне соединения? socket :: is_open () возвращает true, даже если он закрыт на удаленной стороне (я использую boost :: asio :: ip :: tcp :: socket ) .

Я мог бы попытаться прочитать из потока и посмотреть, удастся ли это, но мне пришлось бы изменить логику моей программы, чтобы она работала таким образом (я не хочу, чтобы данные извлекались из потока в точке чека).

Это было полезно?

Решение

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

Другие советы

Просто проверьте наличие ошибки boost :: asio :: error :: eof в обработчике async_receive . Это означает, что соединение было закрыто. Это единственный правильный способ сделать это.

Доступна ли функция ускоренного просмотра? В большинстве реализаций сокетов есть способ читать данные, не удаляя их из очереди, поэтому вы можете прочитать их позже. Казалось бы, это удовлетворяет вашим требованиям.

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

Я бы предложил этот для начинающих.

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

Использование error_code позволяет проверить условие, подключен клиент или нет. Если соединение установлено успешно, error_code error.value () вернет 0, иначе вернет другое значение. Вы также можете проверить сообщение () из кода ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top