【发布时间】: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 模型。
我有两个解决方案:
- 生成一个进行发送和接收的函数(使用普通的socket API),并将该函数加入
io对象的队列中,使io.run()按预期工作。 - 使用 Boost 的异步套接字 API 重写套接字函数。
有没有更好的解决方案?无论如何,您能帮我弄清楚如何实施最佳解决方案吗?
【问题讨论】:
标签: scheduling boost-asio