青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-163  評(píng)論-223  文章-30  trackbacks-0
情景分析
   現(xiàn)已存在一個(gè)可用穩(wěn)定的異步客戶(hù)端類(lèi)http_client_base,該類(lèi)基于boost asio實(shí)現(xiàn)了連接服務(wù)器,發(fā)送請(qǐng)求,獲取響應(yīng)和解析http數(shù)據(jù)等操作,該類(lèi)的大致實(shí)現(xiàn)框架如下
  1class http_client_base
  2{
  3public:
  4    http_client_base(boost::asio::io_service& io_service)
  5        :resolver_(io_service),socket_(io_service)
  6    
  7    }

  8    
  9    void async_connect(const std::string& address,const std::string& port)
 10    {    
 11        boost::asio::ip::tcp::resolver::query query(address, port);
 12        resolver_.async_resolve(query,boost::bind(&http_client::handle_resolve, this,
 13        asio::placeholders::error,asio::placeholders::iterator));
 14    }

 15    
 16    void async_write(const void* data,size_t size,bool in_place=false)
 17    {
 18        if(!in_place){
 19            //do something
 20            asio::async_write(socket_,request_,
 21                            boost::bind(&http_client::handle_write,this,boost::asio::placeholders::error));
 22        }
else
 23            asio::async_write(socket_,asio::buffer(data,size),
 24                            boost::bind(&http_client::handle_write,this,boost::asio::placeholders::error));
 25    }

 26    
 27private:
 28        
 29    void handle_connect(const boost::system::error_code& e)
 30    {
 31        if(!e)
 32            onConnect();
 33        else
 34            onIoError(e);
 35    }

 36
 37    void handle_write(const boost::system::error_code& e)
 38    {
 39        if(!e)
 40            onWrite();
 41        else
 42            onIoError(e);
 43    }

 44    
 45protected:
 46    virtual void onConnect(){}
 47    virtual void onWrite(){}
 48    virtual void onIoError(const boost::system::error_code& e){}
 49
 50private:
 51    boost::asio::ip::tcp::socket socket_;
 52    boost::asio::ip::tcp::resolver resolver_;
 53    boost::asio::streambuf request_, response_;
 54}
;
   顯而易見(jiàn),http_client_base使用tcp::socket作為底層實(shí)現(xiàn),所以數(shù)據(jù)是非ssl傳輸?shù)摹,F(xiàn)因需求變更,為了數(shù)據(jù)安全要求使用ssl傳輸。但boost asio中的ssl::stream類(lèi)接口和tcp::socket有所不同。其實(shí)在非ssl和ssl間,不同的只是讀寫(xiě)數(shù)據(jù)的方法,而數(shù)據(jù)處理邏輯不變,因此為了重用http_client_base的機(jī)制框架和對(duì)http數(shù)據(jù)的解析,那么怎么使http_client_base不作大的改動(dòng)就支持ssl呢?通過(guò)研究asio源碼發(fā)現(xiàn),async_xxx系列自由函數(shù)內(nèi)部要求讀寫(xiě)流實(shí)現(xiàn)read_some、async_read_some、write_some和async_write_some4個(gè)短讀寫(xiě)方法。由于tcp::socket已實(shí)現(xiàn)短讀寫(xiě)而且ssl::stream是tcp::socket的上層,因此只要設(shè)計(jì)一個(gè)抽象的基類(lèi)流,使之支持read_some、async_some_read、write_some和async_write_some即可,而實(shí)現(xiàn)使用dynamic_cast轉(zhuǎn)到兄弟基類(lèi)tcp::socket或ssl::stream,再調(diào)用它們對(duì)應(yīng)的同名短讀寫(xiě)方法;另外還需要給出獲取最底層socket的接口,以支持async_connect和connect方法。因此針對(duì)這一設(shè)計(jì)實(shí)現(xiàn),則要求派生類(lèi)必須同時(shí)從抽象基類(lèi)和其兄弟基類(lèi)tcp::socket或ssl::stream繼承。

框架實(shí)現(xiàn)
   基類(lèi)模板  
 1template<typename T>
 2class boost_socket_base
 3{
 4public:
 5    typedef boost::asio::ssl::stream<T> ssl_socket_base_t;
 6    typedef T socket_base_t;
 7
 8protected:
 9    boost_socket_base()
10        :tb_(boost::indeterminate)
11    { }
12
13public:
14    virtual ~boost_socket_base()
15    { }
16
17    ssl_socket_base_t* get_ssl_socket()
18    {
19        if(tb_){
20            BOOST_ASSERT(ss_);        
21            return ss_;
22        }
else if(!tb_)
23            return NULL;
24        else{
25            if(ss_=dynamic_cast<ssl_socket_base_t*>(this))
26                tb_ = true;
27            return ss_;
28        }
 
29    }

30
31    socket_base_t* get_socket()
32    {
33        if(!tb_){
34            BOOST_ASSERT(s_);        
35            return s_;
36        }
else if(tb_)
37            return NULL;
38        else{
39            if(s_=dynamic_cast<socket_base_t*>(this))
40                tb_ = false;
41            return s_;
42        }

43    }

44        
45    typename T::lowest_layer_type& lowest_layer()
46    {
47        ssl_socket_base_t* p = get_ssl_socket();
48        return p ? p->lowest_layer() : get_socket()->lowest_layer();
49    }

50    
51    template <typename MutableBufferSequence>
52    std::size_t read_some(const MutableBufferSequence& buffers,boost::system::error_code& ec)
53    {
54        ssl_socket_base_t* p = get_ssl_socket();
55        return p ? p->read_some(buffers) : get_socket()->read_some(buffers,ec);
56    }

57
58    template <typename MutableBufferSequence>
59    std::size_t read_some(const MutableBufferSequence& buffers)
60    {
61        //與上面相同,但不帶ec
62    }

63    
64    template <typename MutableBufferSequence, typename ReadHandler>
65    void async_read_some(const MutableBufferSequence& buffers,BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
66    {
67        ssl_socket_base_t* p = get_ssl_socket();
68        return p ? p->async_read_some(buffers,handler) : get_socket()->async_read_some(buffers,handler);
69    }

70
71    template <typename ConstBufferSequence>
72    std::size_t write_some(const ConstBufferSequence& buffers,boost::system::error_code& ec)
73    {
74        ssl_socket_base_t* p = get_ssl_socket();
75        return p ? p->write_some(buffers,ec) : get_socket()->write_some(buffers,ec);
76    }

77    
78    template <typename ConstBufferSequence>
79    std::size_t write_some(const ConstBufferSequence& buffers)
80    {
81        //與上面相同,但不帶ec
82    }

83    
84    template <typename MutableBufferSequence, typename ReadHandler>
85    void async_write_some(const MutableBufferSequence& buffers,BOOST_ASIO_MOVE_ARG(ReadHandler) handler)
86    {    
87        ssl_socket_base_t* p = get_ssl_socket();
88        return p ? p->async_write_some(buffers,handler) : get_socket()->async_write_some(buffers,handler);
89    }

90
91private:
92    boost::tribool tb_;
93    union {
94        ssl_socket_base_t* ss_;
95        socket_base_t* s_;
96    }
;
97}
;
  考慮到dynamic_cast轉(zhuǎn)換的性能開(kāi)銷(xiāo),因此增加了三態(tài)邏輯變量tb_和union指針,tb_表示當(dāng)前this實(shí)際指向的對(duì)象類(lèi)型,初始化為indeterminate,true表示ssl socket對(duì)象,使用ss_;false表示普通socket對(duì)象,使用s_。這樣一來(lái),當(dāng)且僅當(dāng)tb_為indeterminate時(shí)才dynamic_cast。由于這點(diǎn)優(yōu)化僅對(duì)基類(lèi)指針操作有效,而對(duì)派生對(duì)象實(shí)無(wú)必要,所以tb_和union指針設(shè)為私有的;而且基類(lèi)指針可以指向不同的子類(lèi)對(duì)象,所以增加了reset方法重設(shè)tb_為indeterminate狀態(tài),保證行為的正確性。

   子類(lèi)模板 
 1template<typename T> 
 2class boost_ssl_socket : public boost_socket_base<T>
 3                       , public boost::asio::ssl::stream<T>
 4{
 5public:
 6    typedef boost::asio::ssl::stream<T> base2;
 7    
 8    boost_ssl_socket(boost::asio::io_service& io_service,boost::asio::ssl::context& ctx)
 9        :base2(io_service,ctx)
10    { }
11}
;
12
13template<typename T>
14class boost_socket : public boost_socket_base<T>
15                   , public T
16{
17public:
18    typedef T base2;
19    
20    boost_socket(boost::asio::io_service& io_service)
21        :base2(io_service)
22    { }
23}
;
  boost_ssl_socket為ssl套接字類(lèi)模板,boost_socket為普通套接字類(lèi)模板,使用多重繼承,第1基類(lèi)為boost_socket_base<T>,第2基類(lèi)分別為asio:ssl:stream<T>和T。

應(yīng)用改進(jìn)
   使用上面ssl socket框架后,只須5個(gè)地方稍作改動(dòng)即可。
   1)成員變量:由原來(lái)的boost::asio::ip::tcp改為boost_socket_base<boost_tcp_socket>*類(lèi)型。
1typedef boost::asio::ip::tcp::socket boost_tcp_socket;
2boost_socket_base<boost_tcp_socket>* socket_;

   2)構(gòu)造函數(shù):增加boost::asio::ssl::context* ctx參數(shù),默認(rèn)為NULL,表示不使用ssl。
1http_client_base(boost::asio::io_service& io_service,boost::asio::ssl::context* ctx=NULL)
2    :resolver_(io_service)
3{
4        if(ctx)
5            socket_ = new boost_ssl_socket<boost_tcp_socket>(io_service,*ctx);
6        else
7            socket_ = new boost_socket<boost_tcp_socket>(io_service);
8}

   3)握手處理:與非ssl不同的是,在連接后需要進(jìn)行握手,握手成功后才回調(diào)onConnect。
 1void handle_connect(const boost::system::error_code& e)
 2{
 3    if(!e){
 4        boost_socket_base<boost_tcp_socket>::ssl_socket_base_t* p = socket_->get_ssl_socket();
 5        if(p)
 6            p->async_handshake(boost::asio::ssl::stream_base::client,boost::bind(&http_client::handle_handshake,
 7                           this,boost::asio::placeholders::error));
 8        else
 9            onConnect();
10    }
else
11        onIoError(e);
12}

13void handle_handshake(const boost::system::error_code& e)
14{
15    if(!e)
16        onConnect();
17    else
18        onIoError(e);
19}

   4)異步連接:由于async_connect只接受boost::basic_socket類(lèi)即最底層的socket作為參數(shù),因此需要調(diào)用lowest_layer。
1void handle_resolve(const boost::system::error_code& e,boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
2{
3    if (!e)
4        boost::asio::async_connect(socket_->lowest_layer(), endpoint_iterator,boost::bind(&http_client::handle_connect,this,boost::asio::placeholders::error));
5    else
6        onIoError(e);
7}

   5)async_xxx調(diào)用
:將參數(shù)socket_改為*socket_,例如下。
 1void async_write(const void* data,size_t size,bool in_place=false)
 2{
 3    if(!in_place){
 4        //do something
 5        boost::asio::async_write(*socket_,request_,boost::bind(&http_client::handle_write,this,boost::asio::placeholders::error));
 6    }
else
 7        boost::asio::async_write(*socket_,asio::buffer(data,size),boost::bind(&http_client::handle_write,this,boost::asio::placeholders::error));
 8}

 9void handle_write(const boost::system::error_code& e)
10{
11    if(!e)
12        boost::asio::async_read_until(*socket_, response_, "\r\n\r\n",
13                    boost::bind(&http_client::handle_read_header,this,boost::asio::placeholders::error,asio::placeholders::bytes_transferred));
14    else
15        onIoError(e);
16}
posted on 2013-03-20 20:47 春秋十二月 閱讀(12363) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): Opensrc

評(píng)論:
# re: 基于boost asio實(shí)現(xiàn)的支持ssl的通用socket框架 2013-03-21 11:47 | wem
學(xué)習(xí)了  回復(fù)  更多評(píng)論
  
# re: 基于boost asio實(shí)現(xiàn)的支持ssl的通用socket框架 2013-06-08 09:36 |
最近才看過(guò)boost的asio ,現(xiàn)在能看懂點(diǎn)這篇博客了。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品欧美日韩| 欧美三级视频在线| 欧美日韩亚洲一区二区| 国产精品视频午夜| 国内精品伊人久久久久av影院| 亚洲电影免费观看高清完整版在线 | 欧美在线免费一级片| 猛男gaygay欧美视频| 亚洲精品四区| 欧美在线视频免费观看| 欧美黄污视频| 国产一区二区三区日韩| 日韩视频在线观看免费| 欧美在线播放一区二区| 欧美黄色精品| 性欧美videos另类喷潮| 欧美激情1区2区| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美日本在线看| 国产日本欧美一区二区| 亚洲美女免费精品视频在线观看| 欧美一区二区啪啪| 亚洲片区在线| 久久精品国产亚洲aⅴ| 欧美日韩国产综合一区二区| 国产亚洲欧美日韩在线一区| 99视频+国产日韩欧美| 久久久精品国产免费观看同学| 亚洲精品欧美精品| 久久精品国产在热久久| 欧美特黄一级| 亚洲精品欧美| 久久综合久久综合久久综合| 亚洲一级一区| 欧美人在线视频| 亚洲高清精品中出| 久久久不卡网国产精品一区| 亚洲精品字幕| 欧美成在线视频| 狠狠色丁香婷婷综合| 午夜视频在线观看一区二区三区 | 久久综合福利| 国产精品久久久久久久久久久久| 最新日韩在线| 免费欧美在线视频| 欧美一区二区三区婷婷月色| 欧美日韩激情网| 亚洲三级视频| 欧美激情第三页| 午夜精品一区二区在线观看| 国产精品久久久久久av福利软件 | 免费不卡在线观看av| 精品999久久久| 久久精品国产99精品国产亚洲性色| 亚洲视频第一页| 欧美视频在线一区| 一区二区三区欧美视频| 亚洲精品123区| 欧美成人福利视频| 国产综合色一区二区三区| 久久久久高清| 亚洲欧美综合精品久久成人 | 国产丝袜美腿一区二区三区| 欧美中文字幕第一页| 亚洲欧美久久久| 国产农村妇女精品一区二区 | 久久经典综合| 国产视频在线观看一区二区三区| 欧美亚洲一区二区在线| 亚洲综合99| 国产色爱av资源综合区| 久久激情综合网| 欧美在线观看视频一区二区| 国产欧美不卡| 久久精品二区| 久久久久国产精品一区| 亚洲成人中文| 欧美高清视频www夜色资源网| 麻豆亚洲精品| 日韩写真视频在线观看| 亚洲精品视频在线观看网站| 欧美肉体xxxx裸体137大胆| 亚洲综合色噜噜狠狠| 亚洲欧美国产va在线影院| 国产亚洲二区| 免费成人你懂的| 免费黄网站欧美| 一区二区高清| 一区二区欧美视频| 国产精品一区二区三区观看| 久久av免费一区| 久久久蜜桃精品| 亚洲免费观看在线视频| 一区二区三区精品在线| 国产欧美日韩亚洲| 欧美.www| 欧美日韩在线精品一区二区三区| 午夜在线成人av| 久久久久青草大香线综合精品| 亚洲激情精品| 亚洲香蕉网站| 国产亚洲欧美另类一区二区三区| 欧美va日韩va| 欧美日韩一区国产| 久久久久久999| 欧美大片在线观看一区| 亚洲自拍偷拍视频| 久久久久国产一区二区三区| 亚洲老板91色精品久久| 在线亚洲国产精品网站| 激情成人综合| 欧美福利精品| 国产精品福利久久久| 美女视频网站黄色亚洲| 欧美日韩国产系列| 久久久青草青青国产亚洲免观| 久久婷婷国产综合精品青草| 亚洲一二三区在线| 久久人人爽人人爽爽久久| 亚洲视频日本| 另类天堂av| 午夜伦理片一区| 欧美电影免费观看高清| 欧美在线免费一级片| 麻豆精品一区二区综合av| 羞羞视频在线观看欧美| 老鸭窝91久久精品色噜噜导演| 亚洲男人的天堂在线aⅴ视频| 久久天堂成人| 欧美在线观看一区二区| 欧美久久久久| 久久天天综合| 国产精品人人做人人爽人人添| 欧美激情影院| 国产日产欧美a一级在线| 亚洲激情在线播放| 一区二区三区在线免费观看| 一区二区三区国产在线| 亚洲人成网站影音先锋播放| 亚洲综合999| 夜夜嗨av一区二区三区四区| 久久久久久久网| 午夜久久久久久久久久一区二区| 欧美电影美腿模特1979在线看| 久久久一区二区| 国产精品v亚洲精品v日韩精品| 欧美成人一区二区三区片免费| 国产日韩精品视频一区| 99国内精品久久| 亚洲人屁股眼子交8| 久久国产一区二区三区| 欧美呦呦网站| 国产精品欧美精品| 日韩午夜av| 日韩亚洲精品视频| 欧美ed2k| 欧美大尺度在线| 国内在线观看一区二区三区| 亚洲综合色婷婷| 亚洲婷婷在线| 欧美日韩综合精品| 亚洲精品视频在线观看免费| 亚洲欧洲精品天堂一级| 久久综合久色欧美综合狠狠| 久久人体大胆视频| 国产一区二区三区最好精华液| 亚洲一区在线免费观看| 亚洲欧美日韩国产综合在线| 欧美日韩亚洲网| 99伊人成综合| 亚洲网友自拍| 欧美午夜三级| 亚洲天堂黄色| 午夜精品久久久久久| 国产精品久久久久久久久久久久久 | 久久精品久久综合| 国产日本欧美视频| 欧美与欧洲交xxxx免费观看 | 久久婷婷人人澡人人喊人人爽| 国产精品综合色区在线观看| 亚洲午夜高清视频| 午夜精品视频在线| 国产精品无码永久免费888| 亚洲影院高清在线| 欧美一区2区三区4区公司二百| 国产乱人伦精品一区二区| 亚洲欧美在线免费观看| 久久精品亚洲一区二区三区浴池| 国产一区亚洲一区| 久久久亚洲成人| 亚洲第一区在线观看| 一本大道av伊人久久综合| 欧美日韩视频第一区| 亚洲网站视频| 久久精品首页| 亚洲国产精品黑人久久久| 免费在线欧美黄色| 91久久精品国产| 亚洲一区二区三区在线观看视频| 国产精品一香蕉国产线看观看 |