C ++ Могу ли я сделать разъем подключения boost :: asio без таймера?

У меня есть сокет сервера окна и сокет клиента Linux. Клиент подключается к серверу и отправляет сообщение. После этого сервер вызовет внешний исполняемый файл. Проблема в том, что когда сервер недоступен, клиент блокирует тайм-аут при подключении, но я не хочу этого. Я надеюсь, что если соединение не установлено, клиентский сокет будет сразу же закрыт.

Кто-нибудь может дать мне совет?

0

Решение

Предупреждение: псевдокод вперед.

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

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

Ум розетка не будет закрыта от этого. В идеале вы закроете его в обработчике async_connect всякий раз, когда переданный код ошибки указывает на отрицательный результат. Например, если он был отменен, обработчик будет вызван с OPERATION_ABORTED как error_code.

Конечно, если вы проверите только для этого, вы могли бы также close() сокет в обработчике таймеров после cancel(), Но это оставит вас с открытой розеткой всякий раз, когда async_connect не удалось по какой-то другой причине.

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

Не забудьте отменить deadline_timer в обработчике async_connect() и чтобы убедиться, что обработчик таймеров не был вызван с OPERATION_ABORTED, прежде чем он закроет сокет. ^^

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector