Как проверить, закрыт ли сокет в Boost.Asio? - PullRequest
6 голосов
/ 04 мая 2009

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

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

Ответы [ 5 ]

10 голосов
/ 19 сентября 2012

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

7 голосов
/ 04 мая 2009

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

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

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

6 голосов
/ 04 мая 2009

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

2 голосов
/ 10 мая 2009

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

0 голосов
/ 24 мая 2009

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

...