Boost::Asio 的 IOCP CompletionKey?

Posted

技术标签:

【中文标题】Boost::Asio 的 IOCP CompletionKey?【英文标题】:IOCP CompletionKey for Boost::Asio? 【发布时间】:2011-11-30 00:11:08 【问题描述】:

我正在使用Boost::Asio 创建一个 TCP 服务器。我必须跟踪每个客户端的数据包时间。当一个 IO 操作完成时,我可以使用GetQueuedCompletionStatus 返回的完成键轻松识别每个客户端。我找不到使用Boost::Asio 的方法。

我怎样才能实现这个或有任何替代方案?

【问题讨论】:

【参考方案1】:

我不确定我是否正确理解了您的问题: 将所有与客户端相关的状态(套接字、地址等)存储在诸如asio async tcp server example 中的会话类之类的类中有什么问题?然后,例如,您可以在调用 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 的签名的处理程序并带有一些附加参数,并将附加参数绑定到调用。

如果这不能回答您的问题,请为您的问题添加一些进一步的解释,以便有人可以更好地帮助您。

【讨论】:

以上是关于Boost::Asio 的 IOCP CompletionKey?的主要内容,如果未能解决你的问题,请参考以下文章

Boost Asio async_send 产生哔声

boost:asio网络库初学之echo服务器客户端实现

boost:asio网络库初学之echo服务器客户端实现

使用C++ boost从零构建一个异步文件IO系统

使用 boost::asio::async_wait_until 和 boost::asio::streambuf

boost asio 学习 boost::asio 网络封装