C++ 网络库 -- ASIO

Boost.ASIO 是利用当代C++的先进方法,跨平台,异步I/O模型的C++网络库。已被推荐进入TR2,这意味着它有成为C++标准库的可能。
本文经作者同意于本站刊登
Boost.Asio是利用当代C++的先进方法,跨平台,异步I/O模型的C++网络库.

1. 网络库:

VC2005注意
在 属性->C/C++->命令行 中加入
-DBOOST_REGEX_NO_LIB
来防止自动连接.

2. 同步Timer

本章介绍asio如何在定时器上进行阻塞等待( blocking wait).
实现,我们包含必要的头文件.
所有的asio类可以简单的通过 include "asio.hpp"来调用.
  1. #include <iostream>
  2. #include <boost/asio.hpp>
#include <iostream>
#include <boost/asio.hpp>
此外,这个示例用到了 timer,我们还要包含 Boost.Date_Time的头文件来控制时间.
  1. #include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
使用asio至少需要一个 boost::asio::io_service对象.该类提供了访问I/O的功能.我们首先在main函数中声明它.
  1. int main()
  2. {
  3. boost::asio::io_service io;
int main()
{
	boost::asio::io_service io;
下一步我们声明 boost::asio::deadline_timer对象.这个asio的核心类提供I/O的功能(这里更确切的说是定时功能),总是把一个 io_service对象作为他的第一个构造函数,而第二个构造函数的参数设定timer会在5秒后到时(expired).
  1. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
	boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
这个简单的示例中我们演示了定时器上的一个阻塞等待.就是说,调用 boost::asio::deadline_timer::wait()的在创建后5秒内(注意:不是等待开始后),timer到时之前不会返回任何值.
一个 deadline_timer只有两种状态: 到时, 未到时.
如果 boost::asio::deadline_timer::wait()在到时的timer对象上调用,会立即return.
  1. t.wait();
t.wait();
最后,我们输出理所当然的"Hello, world!"来演示timer到时了.
  1. std::cout << "Hello, world! ";
  2. return 0;
  3. }
	std::cout << "Hello, world!
";
	return 0;
}
完整的代码:
  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. int main()
  5. {
  6. boost::asio::io_service io;
  7. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
  8. t.wait();
  9. std::cout << "Hello, world! ";
  10. return 0;
  11. }
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
	boost::asio::io_service io;
	boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
	t.wait();
	std::cout << "Hello, world!
";
	return 0;
}

3. 异步Timer

  1. #include <iostream>
  2. #include <asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
#include <asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
asio的异步函数会在一个异步操作完成后被回调.这里我们定义了一个将被回调的函数.
  1. void print(const asio::error& /*e*/)
  2. {
  3. std::cout << "Hello, world! ";
  4. }
  5. int main()
  6. {
  7. asio::io_service io;
  8. asio::deadline_timer t(io, boost::posix_time::seconds(5));
void print(const asio::error& /*e*/)
{
	std::cout << "Hello, world!
";
}
int main()
{
	asio::io_service io;
	asio::deadline_timer t(io, boost::posix_time::seconds(5));
这里我们调用 asio::deadline_timer::async_wait()来异步等待
  1. t.async_wait(print);
	t.async_wait(print);
最后,我们必须调用 asio::io_service::run().
asio库只会调用那个正在运行的 asio::io_service::run()的回调函数.
如果 asio::io_service::run()不被调用,那么回调永远不会发生.
asio::io_service::run()会持续工作到点,这里就是timer到时,回调完成.
别忘了在调用 asio::io_service::run()之前设置好io_service的任务.比如,这里,如果我们忘记先调用 asio::deadline_timer::async_wait()asio::io_service::run()会在瞬间return.
  1. io.run();
  2. return 0;
  3. }
	io.run();
	return 0;
}
完整的代码:
  1. #include <iostream>
  2. #include <asio.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. void print(const asio::error& /*e*/)
  5. {
  6. std::cout << "Hello, world! ";
  7. }
  8. int main()
  9. {
  10. asio::io_service io;
  11. asio::deadline_timer t(io, boost::posix_time::seconds(5));
  12. t.async_wait(print);
  13. io.run();
  14. return 0;
  15. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值