boost 1.59之 boost::asio::ssl (5)

下面是boost官方给出的ssl服务端例子: 
首先,声明了一个流类型的socekt 用来作为socket对象:
  1: typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;

接下来是session类:

  1: class session
  2: {
  3: public:
  4:   session(boost::asio::io_service& io_service,
  5:       boost::asio::ssl::context& context)
  6:     : socket_(io_service, context)
  7:   {
  8:   }
  9:
 10:   ssl_socket::lowest_layer_type& socket()
 11:   {
 12:     return socket_.lowest_layer();
 13:   }
 14:
 15:   void start()
 16:   {
 17:     socket_.async_handshake(boost::asio::ssl::stream_base::server,
 18:         boost::bind(&session::handle_handshake, this,
 19:           boost::asio::placeholders::error));
 20:   }
 21:
 22:   void handle_handshake(const boost::system::error_code& error)
 23:   {
 24:     if (!error)
 25:     {
 26:       socket_.async_read_some(boost::asio::buffer(data_, max_length),
 27:           boost::bind(&session::handle_read, this,
 28:             boost::asio::placeholders::error,
 29:             boost::asio::placeholders::bytes_transferred));
 30:     }
 31:     else
 32:     {
 33:       delete this;
 34:     }
 35:   }
 36:
 37:   void handle_read(const boost::system::error_code& error,
 38:       size_t bytes_transferred)
 39:   {
 40:     if (!error)
 41:     {
 42:       boost::asio::async_write(socket_,
 43:           boost::asio::buffer(data_, bytes_transferred),
 44:           boost::bind(&session::handle_write, this,
 45:             boost::asio::placeholders::error));
 46:     }
 47:     else
 48:     {
 49:       delete this;
 50:     }
 51:   }
 52:
 53:   void handle_write(const boost::system::error_code& error)
 54:   {
 55:     if (!error)
 56:     {
 57:       socket_.async_read_some(boost::asio::buffer(data_, max_length),
 58:           boost::bind(&session::handle_read, this,
 59:             boost::asio::placeholders::error,
 60:             boost::asio::placeholders::bytes_transferred));
 61:     }
 62:     else
 63:     {
 64:       delete this;
 65:     }
 66:   }
 67:
 68: private:
 69:   ssl_socket socket_;
 70:   enum { max_length = 1024 };
 71:   char data_[max_length];
 72: };

session类 ,主要的功能就是通信,做一些数据处理的操作。session类声明了3个私有的变量,一个socket,一个枚举的长度值max_length,一个data_作为缓冲区。

session类,提供了2个成员函数,3个回调函数,2个成员函数,第一个socket()的功能是获取一个底层的ssl_socket,第二个start函数的作用是进行通信。

在start()函数中,使用ssl_socket 进行handshake操作,进行数据交互,其回调函数hand_handshake回调成功,则执行读操作,后续是一样的过程;

session类最重要的还是数据的操作,ssl_socket提供了socket加密,此处可忽略数据的加密。

下面是server类:

  1: class server
  2: {
  3: public:
  4:   server(boost::asio::io_service& io_service, unsigned short port)
  5:     : io_service_(io_service),
  6:       acceptor_(io_service,
  7:           boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)),
  8:       context_(boost::asio::ssl::context::sslv23)
  9:   {
 10:     context_.set_options(                                                           //设置了context的选项
 11:         boost::asio::ssl::context::default_workarounds
 12:         | boost::asio::ssl::context::no_sslv2
 13:         | boost::asio::ssl::context::single_dh_use);
 14:     context_.set_password_callback(boost::bind(&server::get_password, this));       //设置回调函数,获取密码
 15:     context_.use_certificate_chain_file("server.pem");
 16:     context_.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
 17:     context_.use_tmp_dh_file("dh512.pem");
 18:
 19:     start_accept();
 20:   }
 21:
 22:   std::string get_password() const                                                //context的回调函数,用于获取密码
 23:   {
 24:     return "test";
 25:   }
 26:
 27:   void start_accept()                                                              //start_accept 执行连接客户端操作
 28:   {
 29:     session* new_session = new session(io_service_, context_);
 30:     acceptor_.async_accept(new_session->socket(),
 31:         boost::bind(&server::handle_accept, this, new_session,
 32:           boost::asio::placeholders::error));
 33:   }
 34:
 35:   void handle_accept(session* new_session,                                          //执行回调函数
 36:       const boost::system::error_code& error)
 37:   {
 38:     if (!error)
 39:     {
 40:       new_session->start();
 41:     }
 42:     else
 43:     {
 44:       delete new_session;
 45:     }
 46:
 47:     start_accept();
 48:   }
 49:
 50: private:
 51:   boost::asio::io_service& io_service_;
 52:   boost::asio::ip::tcp::acceptor acceptor_;
 53:   boost::asio::ssl::context context_;
 54: };

 

 

总结:

        总的来说,通过ssl的服务端程序,和没有使用ssl的服务端程序的流程是一样的,都是 获取客户端连接->连接成功->执行session通信。

那么,不一样的地方,就是在server类中,需要根据需求设置context 的选项实现加密;boost官方给的例子很简单,实现了一个小小的加密socket的服务端程序,

剩下的功能就需要我们根据自己的需求实现拓展。

 

 

 

 

 

 

 

东西很简单,如果你有疑问,欢迎评论。。。。有则改之无则加勉!!!

时间: 2024-08-23 11:19:03

boost 1.59之 boost::asio::ssl (5)的相关文章

Ubuntu 15.04 clang++ 3.6 编译boost 1.59/1.55

Ubuntu 15.04已经可以直接通过apt-get insall 安装clang 3.6, 并且预装的gcc版本是4.9.2.这些安装过程在这里介绍. 首先下载boost源码 [plain] view plain copy print? wget -O boost.1.59.tar.bz2 http://sourceforge.net/projects/boost/files/latest/download?source=files 解压 [plain] view plain copy pr

Ubuntu 15.04 clang++ 4.6 编译boost 1.59

Ubuntu 15.04已经可以直接通过apt-get insall 安装clang 3.6, 并且预装的gcc版本是4.9.2.这些安装过程在这里介绍. 首先下载boost源码 wget -O boost.1.59.tar.bz2 http://sourceforge.net/projects/boost/files/latest/download?source=files 解压 tar jxvf ./boost.1.59.tar.bz2 指定clang工具,生成编译脚本 ./bootstra

[转帖]CENTOS6.6下mysql5.7.11带boost和不带boost的源码安装

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn https://www.cnblogs.com/galengao/p/5755788.html 高手的blog Mysql5.7版本更新后有很多变化,比如json等,连安装都有变化,他安装必须要BOOST库,不过mysql的官网源码有带boost库的源码和不带boost库的源码两种,因此有两种安装方式,其实都是一样的,仅仅是不带boost库源码的需要单独安装boos

BOOST中read_some和 boost::asio::error::eof(2)错误

当socket读写完成调用回调函数时候一定要检查 是不是有EOF错误,如果有那么好了,另一方已经断开连接了别无选择,你也断开把. for (;;) { boost::array < char, 128 > buf; boost::system::error_code error; size_t len = socket.read_some(boost::asio::buffer(buf), boost::asio::assign_error(error)); //当服务器关闭连接时,boost

PCL库配置出现的问题(WIN10+VS2013)

边看电影边配终于配好了,中间出现了一些问题,在网上很难搜到,可能每个人都碰到的不同.摸索了一会终于都解决了,记录在这里,免得又碰到. PCL是什么东西就不在此介绍了. 主要是参考这篇博客做得,不过我后来碰到了一些问题,这篇博客并没有碰到,可能是版本原因吧 http://blog.csdn.net/aptx704610875/article/details/49947049 准备工作: 编译PCL前首先要编译几个PCL依赖的第三方库,主要是下面几个: 1.Boost 1.59.0 Boost有两种

stream opencv mat (webcam)frame throught tcp by boost asio

客户端: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

boost asio 翻译(一)

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/ 编译环境 boost1.59  vs2015 A guide to getting started with boost::asioboost asio 学习指南 boost::asio是一个使用现代C++方法为开发者提供异步模型的跨平台的c++网络和 底层IO库.目前已经拥有大量用户并成为boost库的一部分 在开始之

Boost.Asio技术文档

Christopher Kohlhoff Copyright ? 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

boost::asio译文

Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完