boost.asio基础篇 小白入门注解

参考资料:https://blog.csdn.net/caoshangpa/article/details/79231740
一个基础的同步客户端

//使用asio的所有程序都需要至少有一个io_context对象。此类提供对I/O功能的访问
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.connect(ep);

一个简单的同步服务端

using boost::asio;
typedef boost::shared_ptr socket_ptr;
io_service service;
//指定监听的端口
ip::tcp::endpoint ep( ip::tcp::v4(), 2001)); 
//创建一个接收器,接受客户端的连接的对象
ip::tcp::acceptor acc(service, ep);
while ( true) {
//新建一个虚拟的socket
    socket_ptr sock(new ip::tcp::socket(service));
    //等待连接
    acc.accept(*sock);
    //连接后开启线程client_session处理事件
    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();//只要还有待处理的异步操作,servece.run()循环就会一直运行。操作完成后回调 connect_handler。
void connect_handler(const boost::system::error_code & ec) {
    // 如果ec表示“成功”我们就可以知道连接成功了
}

一个简单的异步服务器

using boost::asio;
typedef boost::shared_ptr socket_ptr;
io_service service;
ip::tcp::endpoint ep( ip::tcp::v4(), 2001)); // 监听端口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;
    // 从这里开始, 你可以从socket读取或者写入
    socket_ptr sock(new ip::tcp::socket(service));
    start_accept(sock);
}

,运行异步service.run()循环。当接收到客户端连接时,handle_accept被调用(async_accept的完成处理程序)。如果没有错误,这个socket就可以用来进行读写操作。

   在使用这个socket之后,会创建一个新的socket,然后再次调用start_accept(),它会添加另外一个“等待客户端连接”的异步操作,从而使service.run()循环一直保持忙碌状态。

你可能感兴趣的:(一个小白在工作中的笔记啊)