《Boost.Asio C++ Network Programming》

libtorrent使用了Boost.Asio

支持
network
com serial ports
files

实现同步/异步输入输出
read(stream, buffer)
async_read(stream, buffer)
write(stream, buffer)
async_write(stream, buffer)

TCP UDP IMCP
可以根据自己的需要扩展使其支持自己的协议

如果使用同步模式,因为是阻塞模式,所以服务器客户端往往使用多线程

编程前尽早决定使用同步还是异步模式
异步模式调试更困难

  • 同步多线程
  • 异步单线程

例:同步客户端

using boost::asio;
io_service service;
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1", 2001);
ip::tcp::socket(service);
sock.connect(ep);

Boost.Asio uses io_service to talk to the operating system’s input/output services.

同步服务器

using boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
io_service service;
ip::tcp::endpoint ep(ip::tcp::v4(), 2001)); // listen on 2001
ip::tcp::acceptor acc(service, ep);
while (true)
{socket_ptr sock(new ip::tcp::socket(service));acc.accept(*sockt);boost::thread(boost::bind(client_session, sock);
}
void client_session(socket_ptr sock)
{while (true){char data[512];size_t len = sock->read_some(buffer(data));if (len > 0)write(*sock, buffer("ok", 2));}
}

异步客户端

using boost::asio;
io_service service;
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1", 2001);
ip::tcp::socket sock(service);
sock.async_connect(ep, connect_handler);
service.run();void connect_handler(const boost::system::error_code& ec)
{// here we known we connected successfully// if ec indicates success
}// service.run() 直到所有异步操作完成才退出

异步服务器

using boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
io_service service;
ip::tcp::endpoint ep(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, ep);
socket_ptr sock(new ip::tcp::socket(service));
start_accept(sock);
service.run();void start_accept(socket_ptr sock)
{acc.async_accept(*sock, boost::bind(handle_accept, sock, _1));
}void handle_accept(socket_ptr sock, const boost::system::error_code& err)
{if (err) return;// at this point, you can read/write to the socketsocket_ptr sock(new ip::tcp::socket(service));start_accept(sock);
}

异常处理

using boost::asio;
ip::tcp::endpoint ep;
ip::tcp::socket sock(service);
// 抛出异常 boost::system::system_error
try
{sock.connect(ep);
} catch (boost::system::system_error& e)
{ std::cout << e.code() << std::endl; }
boost::system::error_code err;
// 返回错误代码
sock.connect(ep, err);
if (err)std::cout << err << std::endl;

异步模式始终返回错误代码,异步函数不会抛出异常。

char data[512];
boost::system::error_code error;
size_t length = sock.read_some(buffer(data), error);
if (error == error::eof)return; // Connection closed
boost/asio/error.hpp

io_service 是线程安全的。
多个线程可以调用io_service::run()
回调函数会在任意一个调用run()的线程中执行。

socket类不是线程安全的
应该避免一个线程读另一个线程写同一个socket

utility 用在多个线程中是没有意义的,所以不是线程安全的。
Most of them are meant to just be used for a short time, then
go out of scope.

除了网络之外:
信号

void signal_handler(const boost::system::error_code & err, int signal)
{
// log this, and terminate application
}
boost::asio::signal_set sig(service, SIGINT, SIGTERM);
sig.async_wait(signal_handler);

串口

Using Boost.Asio, you can easily connect to a serial port. The port name is COM7 on
Windows, or /dev/ttyS0 on POSIX platforms:
io_service service;
serial_port sp(service, "COM7");
serial_port::baud_rate rate(9600);
sp.set_option(rate);

其他详见Boost.Asio C++ Network Programming.pdf 14页

计时器

sock.async_read_some(buffer(data, 512));
deadline_timer t(service, boost::posix_time::milliseconds(100));
t.async_wait(&deadline_handler);
service.run();

同步计时器和sleep等价

boost::this_thread::sleep(500);
// -or-
deadline_timer t(service, boost::posix_time::milliseconds(500));
t.wait();

以下代码没有意义,多个service实例运行在同一个线程中
因为service_[1].run()需要等待service_[0].run()完成。

for ( int i = 0; i < 2; ++i)service_[i].run();

1.
线程1 s.run() 所有回调函数的调用在该线程中是同步的
2.
线程1 s.run() 所有回调函数会被分配到多个线程异步执行
线程2 s.run()
3.
线程1 s1.run()
线程2 s2.run()

使run()函数始终运行的方法

  1. 在回调函数中执行新的异步操作
  2. The other way is to simulate some work for it,
    by using the following code snippet:
    typedef boost::shared_ptr work_ptr;
    work_ptr dummy_work(new io_service::work(service_));
    The preceding code will make sure that service_.run()never stops unless you
    either use service_.stop() or dummy_work.reset(0); // destroy dummy_work.
// service.post()io_service::strand strand_one(service);
service.post(strand_one.wrap(boost::bind(func, i)));

service.dispatch()
如果当前进程调用了run(),dispatch()将等待,直达任务被执行完毕。
post()是立即返回

boost::function

boost::thread_group threads;
threads.create_thread(func1);
threads.create_thread(func2);
threads.join_all();

Boost.Asio 笔记相关推荐

  1. boost::asio 笔记

    enable_shared_from_this 这个宏的介绍 http://stackoverflow.com/questions/712279/what-is-the-usefulness-of-e ...

  2. boost::asio的C/S结构笔记

    简介 这篇笔记主要记录了boost::asio的socket编程中知识点, 更多的是说明一些坑- 为了简化描述, 这里仅仅针对同步编程时进行描写, 异步编程同理类比即可. 这里仅仅是客户端向服务器发射 ...

  3. Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法

    asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...

  4. boost asio io_service学习笔记

    转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...

  5. Boost asio学习笔记之二—— 网络编程

    boost库中的网络编程的例子比较复杂,不太好理解,所以,从网上找了一个简单点的例子.网址如下:http://blog.chinaunix.net/u3/93184/showart_1846119.h ...

  6. boost.asio mysql_boost asio学习笔记

    1: 发现一个很诡异的问题: #include #include #include #include using namespace std; void print(const boost::syst ...

  7. boost::asio中的C/S同步实例源码

    近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...

  8. Boost asio 定时器

    Boost asio入门学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载.文章中有连接失效或是技术谬误的地方,请与我联系. https://blog.csdn.net/luchengtao ...

  9. Boost.Asio取消异步操作

    在异步编程中, 如果某些条件不满足, 或者用户想强制取消某些IO操作, 此时也需要终止启动的异步操作. 下面给出一个常用的方法. #include <boost/asio.hpp> #in ...

最新文章

  1. 任正非:明年至少招聘 8000 名应届生,华为人才将分为三类
  2. css如何设置图转30度,使用CSS实现左右30度的摆钟
  3. CCF-CSP 201612-2 工资计算(C++满分代码)
  4. 解决“The type initializer for'Oracle.DataAccess.Client.OracleConnection' threw an exception ”异常...
  5. mysql 修改root用户密码
  6. checksum table 【转】
  7. yaf(5) smarty
  8. iOS开发之CALayer
  9. sender分析之创建请求
  10. Java 实例 - 测试两个字符串区域是否相等
  11. latex图片_Latex使用图片、文献、模板——自定义与路径指定
  12. python21天打卡day3
  13. 20170829,记我第一次电面
  14. Atitit. 异常的使用总结最佳实践java .net php Vo8f
  15. 把路由器配置成DHCP服务器,并确保路由功能。
  16. 编译原理(第3版)第1章引论课后题答案
  17. 解决VM虚拟机鼠标闪烁的问题
  18. 增持风行网 百视通在下一盘很大的棋
  19. 转变为灰度图像的算法优化及马赛克实现代码
  20. 2020Google开发者大会总结

热门文章

  1. Vocabulary Tree 词汇树算法
  2. mysql和stata_501 stata如何连接MySQL
  3. GDI+ 中发生一般性错误。
  4. 携程第四代架构探秘之运维基础架构升级
  5. Linux驱动设备号
  6. linux合并优盘分区工具,mhddfs虚拟存储工具:Linux分区合并利器
  7. 微信小程序java后端搭建
  8. maya拼图随机打乱工具插件
  9. 招聘会求贤也蛮拼的 老总的大奔开出来接面试者
  10. 3d打印,机器人,计算机,终于驯服3D打印机器人Leapfrog Creatr HS成为我的好伙伴