boost async_write: в случае сбоя, как отследить, что не было отправлено, и уведомить клиента / пользователя, что не удалось?

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

Надлежащие документы говорят:

Эта функция используется для асинхронной записи определенного числа
байты данных в поток. Вызов функции всегда возвращает
немедленно. Асинхронная операция будет продолжаться до тех пор, пока один из
выполняются следующие условия:

  • Все данные в предоставленных буферах были записаны. То есть переданные байты равны сумме размеров буфера.
  • Произошла ошибка.

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

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

Есть ли способ передать в метод асинхронного обработчика ссылку на буфер / сообщение, которое было отправлено? Или лучше подходить к тому, чтобы поддерживать какой-то контейнер записываемых сообщений, а затем выдавать его после завершения асинхронной записи?

0

Решение

если вы посмотрите на асинхронные примеры в повышение :: ASIO (или C ++ 11 версия) документация, например клиент чата, Вы можете видеть, что есть три записывать методы. Сначала используется контейнер:

typedef std::deque<chat_message> chat_message_queue;
...
chat_message_queue write_msgs_;

если ты пишешь сообщение звонишь chat_client::write(message) который асинхронно вызывает chat_client::do_write который зовет chat_client::handle_write после отправки готов. только функция-член handle_write выталкивает сообщение из очереди, поэтому вы можете видеть, что сообщение все еще доступно, даже если произошла ошибка.

Или лучше подходить к тому, чтобы поддерживать какой-то контейнер записываемых сообщений, а затем выдавать его после завершения асинхронной записи?

чтобы ответить на ваши вопросы, я бы предпочел использовать фонтанчик и выдавать его, если сообщение было отправлено, или использовать его, чтобы распечатать ошибку.


редактировать:

в версии c ++ 11 chat_client::handle_write отсутствует, это сделано в do_write метод с использованием лямбда-функции, но это все то же поведение.

1

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

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

По вопросам рекламы [email protected]