c ++ boost asio timeout для блокировки соединения - PullRequest
4 голосов
/ 18 августа 2010

У меня есть клиент C ++ boost, который блокирует соединение и обрабатывает сообщение, как только получает ответ.Я сталкиваюсь со странной проблемой.

tcp::resolver::query query(tcp::v6(), this->host, port,tcp::resolver::query::v4_mapped);
iterator = resolver.resolve(query);
socket = new tcp::socket(io_service);
socket->connect(*iterator);

Я попытался подключиться к машине, которая не была доступна с помощью ping6 (но была включена поддержка IPV6).Тем не менее, я не получил никакой ошибки при попытке решить запрос в строке 2.В результате этого при попытке подключения требуется слишком много времени, прежде чем выдать ошибку.Мои вопросы: -

1) Можно ли установить тайм-аут на блокировку подключения от asio?Я не могу переключиться в асинхронный режим работы.

2) Почему я не получаю сообщение об ошибке при разрешении недоступного хоста?

Любой совет будет очень полезным

Ответы [ 2 ]

1 голос
/ 19 августа 2010

Тайм-ауты - неподходящее место для синхронных методов, в отслеживателе билетов asio есть длинное обсуждение .

Я не могу переключиться в асинхронный режим работа.

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

0 голосов
/ 28 декабря 2012

Когда был задан этот вопрос, я полагаю, что у ASIO не было ни одного примера того, как выполнить то, что нужно OP, то есть тайм-аут операции блокировки, такой как операция сокета блокировки. Сейчас существуют примеры, чтобы показать вам, как именно это сделать. пример кажется длинным, но это потому, что он ХОРОШО прокомментирован. В нем показано, как использовать ioservice в режиме «одного выстрела».

Я думаю, что пример - отличное решение. Другие решения здесь нарушают мобильность и не используют ioservice. если переносимость не важна, а ioservice, как представляется, требует значительных затрат, то НЕ следует использовать ASIO. Несмотря ни на что, у вас будет создан ioservice (от него зависит почти вся функциональность ASIO, даже синхронизирующие сокеты), так что воспользуйтесь этим.

Пример таймаута ASIO при блокировке вызова

Документация ASIO была обновлена, так что ознакомьтесь с новыми примерами того, как преодолеть некоторые из имеющихся у ASIO «ошибок».

...