【问题标题】:Scheduling a task in Boost while continuing current work在继续当前工作的同时在 Boost 中安排任务
【发布时间】:2011-06-08 09:39:58
【问题描述】:

我编写了一个 TCP/IP 程序,其中客户端使用普通(非 Boost)套接字 API;即服务器绑定和监听,客户端连接。服务器使用 pthread 一次处理多个客户端。

程序使用 OpenSSL 在客户端和服务器之间交换会话密钥。

后来,我注意到我需要定期执行“re-key”:会话建立后,我必须安排一个 re-key 任务,其中客户端和服务器就新的会话密钥达成一致.

一种选择是为每个客户端创建一个新线程:新线程将休眠一段时间,然后唤醒并启动重新密钥。这个选项相当昂贵,因为每个客户端都需要多线程。

另一个选择是使用 Boost Asio。我很遗憾我没有意识到这个有价值的图书馆的存在;否则,我会使用 Boost 的线程和 Boost 的套接字来编写程序。

无论如何,我想以最小的变化来完成这项工作。起初,我误解了阿西奥。使用Boost's Timer 2 的例子,我写了这样的东西:

void rekey(const boost::system::error_code& /*e*/)
{
  // do rekey
}

...

void main()
{
//connect to server

// schedule re-key
boost::asio::io_service io;    
boost::asio::deadline_timer t(io, boost::posix_time::minutes(30));
t.async_wait(rekey);    
io.run();

// the rest of job (i.e. sending and receiving messages in a while() loop.)
}

这显然是错误的,因为 Boost 在 io.run() 处阻塞。我的第一感觉是 async_wait 的异步特性可以解决问题,但显然我误解了 Asio 模型。

我有两个解决方案:

  1. 生成一个进行发送和接收的函数(使用普通的socket API),并将该函数加入io对象的队列中,使io.run()按预期工作。
  2. 使用 Boost 的异步套接字 API 重写套接字函数。

有没有更好的解决方案?无论如何,您能帮我弄清楚如何实施最佳解决方案吗?

【问题讨论】:

    标签: scheduling boost-asio


    【解决方案1】:

    通常,io_service::run()(或导致事件发生的其他函数,例如 io_service::poll()io_servive::run_one()io_service::poll_one())将在它们自己的线程中运行。

    我是 boost::asio 库的大力支持者,因为一旦您习惯了使用它进行编码,它就会是一个非常优雅且功能强大的库。但是,如果您已经编写了大部分应用程序(并且正在运行),我不建议您重写它只是为了利用 boost::asio,尤其是当您只需要某种类型的异步计时器时。

    由于您声明每个客户端都有自己的线程,我建议您使用某种类型的哨兵,您定期检查该线程以指示何时需要重新输入密钥。

    【讨论】:

    • 如何定期检查哨兵? (例如,如果我想每 30 分钟重新输入一次。)
    • 如果您的客户端线程使用非阻塞套接字操作,只需在客户端线程的入口点设置一个简单的计时器(GetTickCount() 或 clock() 或 time())并定期检查以查看如果当前时间(对 GetTickCount() 或 clock() 或 time() 的另一个调用)已超过您预期的重新键入时间。但是,如果您的客户端正在使用阻塞 io 操作,那么这将变得更加困难。在这种情况下,您可以添加一个辅助“计时”线程来管理。
    【解决方案2】:

    使用重写套接字函数 Boost 的异步套接字 API。

    这可能并不像看起来那样艰巨。 documentation 包含从 BSD 套接字 API 到 Boost.Asio 的良好映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2015-01-12
      • 2023-03-19
      • 2012-12-13
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多