У меня есть сокет сервера окна и сокет клиента Linux. Клиент подключается к серверу и отправляет сообщение. После этого сервер вызовет внешний исполняемый файл. Проблема в том, что когда сервер недоступен, клиент блокирует тайм-аут при подключении, но я не хочу этого. Я надеюсь, что если соединение не установлено, клиентский сокет будет сразу же закрыт.
Кто-нибудь может дать мне совет?
Предупреждение: псевдокод вперед.
Вы можете сделать это. Но это не так просто, как вы могли бы надеяться.
Вам нужно использовать 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, прежде чем он закроет сокет. ^^
Других решений пока нет …