Что происходит с открытым сокетом asio tcp, когда служба останавливается и перезапускается?

Укороченная версия: Если у меня есть открытый tcp-сокет, работающий в ioserive, что произойдет, если я остановлю службу? Должны ли данные продолжать стоять в очереди в сокете tcp (при условии, что сервер продолжает отправлять данные и не было разрыва соединения)? Если да, могу ли я получить эти данные путем сброса и перезапуска ioserive?

Длинная версия: Я пытаюсь установить блокирующий интерфейс вокруг моего API сокета на основе asio.

Пользователь изначально подключается с помощью API, который открывает сокет для сервера.

Для каждого последующего вызова API ioservice сбрасывается и запускается, затем данные отправляются на сервер с использованием сокета tcp с boost :: asio :: write и ожидания ответа. Ответ от сервера обрабатывается с использованием async_read_until. Когда ответ получен, вызывается обработчик, ioservice останавливается, и исходный вызов API блокирования возвращается к клиенту с данными с сервера. Это работает нормально для команд типа запрос-ответ. В итоге:

  • Вызов блокировки API
  • ioservice сбрасывает и запускает
  • пакет tcp отправлен на сервер
  • сервер отвечает
  • обработчик вызван
  • иосервис остановлен
  • Вызов API завершен, и данные переданы пользователю

Другая команда представляет собой запрос-ответ, который запускает широковещательную рассылку с сервера, который обновляет внутренний кэш на стороне клиента. Идея состоит в том, что пользователь обращается к этому кешу с помощью другой функции API после первоначальной попытки обновить его с помощью процесса запуска и остановки ioservice, аналогичного описанному выше. Однако перед этой попыткой код проверяет, доступны ли какие-либо данные в сокете, используя одну из следующих опций:

  bool is_data_available() {
//boost::asio::socket_base::bytes_readable command(true);
//socket_->io_control(command);
//return command.get() > 0;
return socket_->available() > 0;
}

Нет никаких данных, даже если сервер зарегистрирован как отправивший данные.

Итак, резюме для трансляции:

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

1

Решение

Задача ещё не решена.

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

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

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