IOCP CompletionKey для Boost :: Asio? - PullRequest
       24

IOCP CompletionKey для Boost :: Asio?

1 голос
/ 30 ноября 2011

Я создаю TCP-сервер, используя Boost::Asio. Я должен отслеживать время пакета для каждого клиента. Когда операция ввода-вывода завершена, я могу легко идентифицировать каждого клиента, используя ключи завершения, возвращаемые GetQueuedCompletionStatus. Я не могу найти способ сделать это с Boost::Asio.

Как я могу это реализовать или есть альтернативы?

1 Ответ

2 голосов
/ 01 декабря 2011

Я не уверен, правильно ли я понимаю ваш вопрос: что не так с сохранением всех связанных с клиентом состояний (сокетов, адресов и т. Д.) В классе, таком как класс сеанса, в примере asio async tcp server?Затем, например, вы можете запустить таймер при вызове операции async::write

boost::asio::async_write(socket_,
      boost::asio::buffer(data_, bytes_transferred),
      boost::bind(&session::handle_write, this,
        boost::asio::placeholders::error));

и остановить таймер в обработчике завершения записи handle_write, который будет вызываться asio после завершения записи.

void handle_write(const boost::system::error_code& error)

Кроме того, вы можете легко использовать boost :: bind для сохранения состояния.Например, скажем, если вы вызываете асинхронную операцию записи, вы укажете обработчик, который обычно будет иметь сигнатуру, подобную handle_write, с некоторыми дополнительными параметрами и привяжите дополнительный параметр к вызову.

Если это не отвечаетна ваш вопрос, добавьте дополнительное объяснение к вашему вопросу, чтобы кто-то мог лучше вам помочь.

...