asio学习笔记6
来源:互联网 发布:方维众筹系统源码 编辑:程序博客网 时间:2024/05/12 03:52
Sat
asio学习笔记6
这篇笔记其实就是说了下asio怎么配合智能指针来使用,灰常的简单,还是直接上代码,也是吧asio的异步的echo server代码修改了下:
#include <cstdlib>#include <iostream>#include <boost/bind.hpp>#include <boost/asio.hpp>#include <boost/smart_ptr.hpp>using boost::asio::ip::tcp;class session : public boost::enable_shared_from_this<session>{public: typedef boost::shared_ptr<session> session_ptr; static session_ptr get_new_session(boost::asio::io_service& io_service) { return session_ptr(new session(io_service)); } tcp::socket& socket() { return socket_; } ~session() { std::cout << "析构" << std::endl; } void start() { socket_.async_read_some(boost::asio::buffer(data_, max_length), boost::bind(&session::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }private: session(boost::asio::io_service& io_service) : socket_(io_service) { } void handle_read(const boost::system::error_code& error, size_t bytes_transferred) { if (!error) { boost::asio::async_write(socket_, boost::asio::buffer(data_, bytes_transferred), boost::bind(&session::handle_write, shared_from_this(), boost::asio::placeholders::error)); } } void handle_write(const boost::system::error_code& error) { if (!error) { socket_.async_read_some(boost::asio::buffer(data_, max_length), boost::bind(&session::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length];};class server{public: server(boost::asio::io_service& io_service, short port) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) { start_accept(); }private: void start_accept() { session::session_ptr new_session = session::get_new_session(io_service_); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); } void handle_accept(session::session_ptr new_session, const boost::system::error_code& error) { if (!error) { new_session->start(); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_;};int main(int argc, char* argv[]){ try { if (argc != 2) { std::cerr << "Usage: async_tcp_echo_server <port>\n"; return 1; } boost::asio::io_service io_service; using namespace std; // For atoi. server s(io_service, atoi(argv[1])); io_service.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0;}
代码很简单,一个server类,里面循环accept新的客户端的连接,收到之后创建一个新的session类,session类中循环async_read 、async_write,与asio原示例不同之处仅仅是把里面所有的delete this去掉了。因为使用了shared_ptr和enable_shared_from_this,只要async_read 、async_write的循环没有终止,则必定会有某个bind持有一个session的shared_ptr,保存在bind返回的function里面,只要我们在这个function结束之前再次发起一个异步任务并把session的shared_ptr给bind上去,这个指针的引用计数就不会变为0,也就不会析构;如果出错,我们就不再继续发起任务,等函数结束时,引用计数就会自动变为0,shared_ptr会自动帮你delete掉这个对象。
另外这里吧session的构造函数设置成私有的并且用了一个静态函数进行构建,是为了防止有人直接在栈上实例化了session类,这样做没啥意义,也可以减少new的出现(虽然我不知道减少new出现有啥好处)。
暂时就先写到这了,下次写下asio里面比较怪异的一个东西coroutine。
Sat
asio学习笔记6
这篇笔记其实就是说了下asio怎么配合智能指针来使用,灰常的简单,还是直接上代码,也是吧asio的异步的echo server代码修改了下:
#include <cstdlib>#include <iostream>#include <boost/bind.hpp>#include <boost/asio.hpp>#include <boost/smart_ptr.hpp>using boost::asio::ip::tcp;class session : public boost::enable_shared_from_this<session>{public: typedef boost::shared_ptr<session> session_ptr; static session_ptr get_new_session(boost::asio::io_service& io_service) { return session_ptr(new session(io_service)); } tcp::socket& socket() { return socket_; } ~session() { std::cout << "析构" << std::endl; } void start() { socket_.async_read_some(boost::asio::buffer(data_, max_length), boost::bind(&session::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }private: session(boost::asio::io_service& io_service) : socket_(io_service) { } void handle_read(const boost::system::error_code& error, size_t bytes_transferred) { if (!error) { boost::asio::async_write(socket_, boost::asio::buffer(data_, bytes_transferred), boost::bind(&session::handle_write, shared_from_this(), boost::asio::placeholders::error)); } } void handle_write(const boost::system::error_code& error) { if (!error) { socket_.async_read_some(boost::asio::buffer(data_, max_length), boost::bind(&session::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length];};class server{public: server(boost::asio::io_service& io_service, short port) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) { start_accept(); }private: void start_accept() { session::session_ptr new_session = session::get_new_session(io_service_); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error)); } void handle_accept(session::session_ptr new_session, const boost::system::error_code& error) { if (!error) { new_session->start(); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_;};int main(int argc, char* argv[]){ try { if (argc != 2) { std::cerr << "Usage: async_tcp_echo_server <port>\n"; return 1; } boost::asio::io_service io_service; using namespace std; // For atoi. server s(io_service, atoi(argv[1])); io_service.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0;}
代码很简单,一个server类,里面循环accept新的客户端的连接,收到之后创建一个新的session类,session类中循环async_read 、async_write,与asio原示例不同之处仅仅是把里面所有的delete this去掉了。因为使用了shared_ptr和enable_shared_from_this,只要async_read 、async_write的循环没有终止,则必定会有某个bind持有一个session的shared_ptr,保存在bind返回的function里面,只要我们在这个function结束之前再次发起一个异步任务并把session的shared_ptr给bind上去,这个指针的引用计数就不会变为0,也就不会析构;如果出错,我们就不再继续发起任务,等函数结束时,引用计数就会自动变为0,shared_ptr会自动帮你delete掉这个对象。
另外这里吧session的构造函数设置成私有的并且用了一个静态函数进行构建,是为了防止有人直接在栈上实例化了session类,这样做没啥意义,也可以减少new的出现(虽然我不知道减少new出现有啥好处)。
暂时就先写到这了,下次写下asio里面比较怪异的一个东西coroutine。
- asio学习笔记6
- ASIO库学习笔记
- asio学习笔记7
- asio学习笔记1
- asio学习笔记2
- asio学习笔记2
- asio学习笔记3
- asio学习笔记4
- asio学习笔记5
- Boost::asio 学习笔记
- asio的学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost.asio 学习笔记04——asio的体系结构
- java实现生产者消费者问题 三中实现方式
- 2014年10月25日深圳彩讯科技和北京宇信易诚的笔试记录
- 【FreeMarker】【程序开发】模板加载,模板缓存
- win7 64 VC++ ado方式连接access 连接字符串
- In app purchase收集
- asio学习笔记6
- 《0基础学Andorid编程》第三章
- 【Android界面实现】View Animation 使用介绍
- jdbc操作mysql数据库
- Java开发工程师必备精品资料(115个)
- 微信企业号根据错误码返回错误信息类封装
- HDU 3853 LOOPS 概率dp(水
- 谨记call/cc的含义
- matlab之原始处理图像几何变换