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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
   Web服務(wù)器為了支持https訪問(wèn),通常會(huì)使用第三方庫(kù)openssl實(shí)現(xiàn),而且為了高性能采用異步事件驅(qū)動(dòng)模型,因此連接套接字被設(shè)為非阻塞類(lèi)型,本文在nginx ssl模塊的基礎(chǔ)上,簡(jiǎn)化提取它的核心框架,使用面向?qū)ο蟮姆绞矫枋觯瑥奈帐帧⒆x寫(xiě)和關(guān)閉3個(gè)方面進(jìn)行了分析,由于這3個(gè)操作都是異步的,因此操作失敗后要調(diào)用SSL_get_error來(lái)獲取錯(cuò)誤碼,有如下4種情況。
   ● SSL_ERROR_WANT_READ:操作沒(méi)完成,需要在下一次讀事件中繼續(xù)
   ● SSL_ERROR_WANT_WRITE:操作沒(méi)完成,需要在下一次寫(xiě)事件中繼續(xù)
   ● SSL_ERROR_ZERO_RETURN:連接正常關(guān)閉
   ● 其它:連接出錯(cuò)
  
   下面的示例代碼使用了libevent實(shí)現(xiàn)IO事件驅(qū)動(dòng),connection表示普通連接類(lèi),假設(shè)已經(jīng)處理好了http數(shù)據(jù)的邏輯,實(shí)現(xiàn)在成員函數(shù)handle_read和handle_write內(nèi),虛函數(shù)recv、send和close分別調(diào)用系統(tǒng)的API recv、send和close;ssl_conn_t表示安全連接類(lèi),由于只是IO處理不同:收到數(shù)據(jù)后解密,發(fā)送數(shù)據(jù)前加密。解密后的操作和connection是一樣的,因此ssl_conn_t繼承connection,重寫(xiě)了recv、send和close,其中close調(diào)用了shutdown。

異步握手
   當(dāng)在SSL端口接受到連接時(shí),首先要進(jìn)行握手,握手成功后才能收發(fā)數(shù)據(jù),如果握手失敗而且返回前2種錯(cuò)誤碼,那么要在下一次操作中繼續(xù)握手。
 1void ssl_conn_t::empty_handler(short ev)
 2{
 3}

 4
 5void ssl_conn_t::handshake_handler(short ev)
 6{
 7    handshake();
 8}

 9
10void ssl_conn_t::handshake()
11{
12    int ret = do_handshake();    
13
14    switch(ret){
15        case OP_OK: 
16            read_handler_ = &connection::handle_read;
17            write_handler_ = &connection::handle_write;
18            handle_read(EV_READ);
19            break;
20                 
21    }

22}

23
24int ssl_conn_t::do_handshake()
25{
26    ssl_clear_error();
27
28    int ret = SSL_do_handshake(ssl_);
29    if(1==ret){
30        
31        return OP_OK;
32    }

33    
34    int sslerr = SSL_get_error(ssl_,ret), err;
35    switch(sslerr){
36        case SSL_ERROR_WANT_READ:
37            read_handler_ = (io_handler)&ssl_conn_t::handshake_handler;
38            write_handler_ = (io_handler)&ssl_conn_t::empty_handler;    
39            return OP_AGAIN;
40
41        case SSL_ERROR_WANT_WRITE:
42            read_handler_ = (io_handler)&ssl_conn_t::empty_handler;
43            write_handler_ = (io_handler)&ssl_conn_t::handshake_handler;    
44            return OP_AGAIN;
45         
46    }
                    
47}
    以上do_handshake是核心函數(shù),調(diào)用了SSL_do_handshake來(lái)實(shí)現(xiàn)握手,當(dāng)SSL_do_handshake失敗時(shí),如果返回SSL_ERROR_WANT_READ,就改變讀函數(shù)指針為handshake_handler,寫(xiě)函數(shù)指針為empty_handler;如果返回SSL_ERROR_WANT_WRITE,就改變讀函數(shù)指針為empty_handler,寫(xiě)函數(shù)指針為handshake_handler。handshake_handler實(shí)現(xiàn)在讀寫(xiě)事件中繼續(xù)處理握手,而empty_handler是個(gè)空函數(shù),什么也不做。
   
異步讀寫(xiě)
   對(duì)于讀操作失敗,如果返回SSL_ERROR_WANT_WRITE,那么說(shuō)明要在下一次寫(xiě)事件中繼續(xù)讀數(shù)據(jù),因此要改變寫(xiě)函數(shù)指針,使其讀數(shù)據(jù),當(dāng)讀成功后,要還原寫(xiě)函數(shù)針,并激發(fā)一次寫(xiě)事件;對(duì)于寫(xiě)操作失敗,如果返回SSL_ERROR_WANT_READ,那么說(shuō)明要在下一次讀事件中繼續(xù)寫(xiě)數(shù)據(jù),因此要改變讀函數(shù)指針,使其寫(xiě)數(shù)據(jù),當(dāng)寫(xiě)成功后,要還原讀函數(shù)指針,并激發(fā)一次讀事件。如果不還原讀或?qū)懞瘮?shù)指針,那么會(huì)發(fā)生寫(xiě)或讀混亂;還原后,要激發(fā)一次讀或?qū)懯录@是為了延續(xù)IO事件的進(jìn)行,防止讀寫(xiě)?zhàn)I死。
 1ssize_t ssl_conn_t::recv(void *buf,size_t len)
 2{
 3    ssl_clear_error();
 4
 5    int ret = SSL_read(ssl_,buf,len);
 6    if(ret>0){
 7        if(old_write_handler_){
 8            write_handler_ = old_write_handler_;
 9            old_write_handler_ = NULL;
10            active_event(false);
11        }

12        return ret;
13    }

14
15    int sslerr = SSL_get_error(ssl_,ret), err;
16    switch(sslerr){
17        case SSL_ERROR_WANT_READ:
18            return OP_AGAIN;
19
20        case SSL_ERROR_WANT_WRITE:
21            if(NULL==old_write_handler_){
22                old_write_handler_ = write_handler_;
23                write_handler_ = (io_handler)&ssl_conn_t::write_handler;
24            }

25            return OP_AGAIN;
26           
27    }

28}

29
30void ssl_conn_t::write_handler(short ev)
31{
32    (this->*read_handler_)(EV_WRITE);
33}

34
35ssize_t ssl_conn_t::send(const void *buf,size_t len)
36{
37    ssl_clear_error();
38
39    int ret = SSL_write(ssl_,buf,len);
40    if(ret>0){
41        if(old_read_handler_){
42            read_handler_ = old_read_handler_;
43            old_read_handler_ = NULL;
44            active_event(true);
45        }

46        return ret;
47    }

48
49    int sslerr = SSL_get_error(ssl_,ret), err;
50    switch(sslerr){
51        case SSL_ERROR_WANT_WRITE:
52            return OP_AGAIN;
53
54        case SSL_ERROR_WANT_READ:
55            if(NULL==old_read_handler_){
56                old_read_handler_ = read_handler_;
57                read_handler_ = (io_handler)&ssl_conn_t::read_handler;
58            }

59            return OP_AGAIN;
60        
61    }

62}

63
64void ssl_conn_t::read_handler(short ev)
65{
66    (this->*write_handler_)(EV_READ);
67}
    以上recv調(diào)用SSL_read,如果失敗并且返回SSL_ERROR_WANT_WRITE,就保存老的寫(xiě)函數(shù)指針,改變寫(xiě)函數(shù)指針為write_handler,write_handler實(shí)現(xiàn)在寫(xiě)事件中繼續(xù)讀數(shù)據(jù);send調(diào)用SSL_write,如果失敗并且返回SSL_ERROR_WANT_READ,就保存老的讀函數(shù)指針,改變讀函數(shù)指針為read_handler,read_handler實(shí)現(xiàn)在讀事件中繼續(xù)寫(xiě)數(shù)據(jù)。

異步關(guān)閉
   當(dāng)握手或讀寫(xiě)因連接關(guān)閉或出錯(cuò)而失敗時(shí),就要關(guān)閉連接了,如果失敗并且返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,那么要在下一次讀或?qū)懯录欣^續(xù)關(guān)閉。在這里,為了收到對(duì)方發(fā)送的協(xié)議退出包而完全退出,等待30秒再關(guān)閉,如果超時(shí)就直接關(guān)閉。
 1void ssl_conn_t::shutdown(bool is_timeout/*=false*/)
 2{
 3    if (do_shutdown(is_timeout) != OP_AGAIN)
 4        delete this;
 5}

 6
 7int ssl_conn_t::do_shutdown(bool is_timeout)
 8{
 9    int  ret,mode;
10
11    if(is_timeout){
12        mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN;
13        SSL_set_quiet_shutdown(ssl_,1);
14    }
else{
15        
16    }

17    SSL_set_shutdown(ssl_,mode);
18
19    ssl_clear_error();
20
21    ret = SSL_shutdown(ssl_);
22    if(1==ret)
23        return OP_OK;
24
25    int sslerr = SSL_get_error(ssl_,ret), err;
26    switch(sslerr){
27        
28        case SSL_ERROR_WANT_READ:
29        case SSL_ERROR_WANT_WRITE:
30            read_handler_ = (io_handler)&ssl_conn_t::shutdown_handler;
31            write_handler_ = (io_handler)&ssl_conn_t::shutdown_handler;
32
33            if(SSL_ERROR_WANT_READ==sslerr){
34                struct timeval tv;
35                tv.tv_sec = 30,tv.tv_usec = 0;
36                add_event(true,tv);
37            }

38            return OP_AGAIN;
39        
40    }

41}

42
43void ssl_conn_t::shutdown_handler(short ev)
44{
45    shutdown(ev&EV_TIMEOUT);
46}
    以上do_shutdown是核心函數(shù),調(diào)用SSL_shutdown實(shí)現(xiàn),如果失敗并且返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,就改變讀寫(xiě)函數(shù)指針為shutdown_handler,shutdown_handler實(shí)現(xiàn)在讀寫(xiě)事件中繼續(xù)關(guān)閉處理。
posted on 2014-04-11 17:26 春秋十二月 閱讀(14042) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Network
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美电影打屁股sp| 亚洲黄色一区二区三区| 国产欧美日韩视频一区二区| 欧美日韩一区二区三区在线| 欧美日韩mp4| 国产精品一二三| 国产一区二区日韩精品欧美精品| 亚洲黄色在线观看| 亚洲国产精品成人va在线观看| 欧美亚洲在线视频| 亚洲欧美日韩精品在线| 欧美资源在线| 欧美大片免费观看| 日韩视频一区| 午夜在线播放视频欧美| 久久综合九色99| 欧美日韩视频在线一区二区观看视频 | 欧美伦理91i| 国产精品婷婷午夜在线观看| 韩日精品在线| 一区二区三区高清视频在线观看| 欧美亚洲在线视频| 亚洲国产成人av| 销魂美女一区二区三区视频在线| 狼狼综合久久久久综合网| 欧美日精品一区视频| 国外成人网址| 亚洲你懂的在线视频| 麻豆视频一区二区| 亚洲无玛一区| 欧美女人交a| 亚洲国产精彩中文乱码av在线播放| 一本大道av伊人久久综合| 久久久噜噜噜久久久| 一区二区91| 欧美电影打屁股sp| 伊人久久久大香线蕉综合直播| 亚洲一区激情| 亚洲国产女人aaa毛片在线| 欧美一区二区三区免费看 | 亚洲一线二线三线久久久| 蜜臀久久久99精品久久久久久| 国产精品无码永久免费888| 亚洲精品乱码久久久久久| 久久在线视频在线| 亚洲在线观看免费视频| 欧美亚洲第一区| 一本一道久久综合狠狠老精东影业| 久久久久久欧美| 亚洲欧美日韩国产中文| 欧美午夜视频在线| 亚洲一区二区三区视频播放| 亚洲经典在线| 欧美日韩免费视频| 亚洲午夜激情网页| 在线播放一区| 伊人成人在线| 蜜桃久久av| 久久精品国内一区二区三区| 国产欧美欧美| 久久久久久久久久久一区| 欧美一区二区| 一区在线播放| 免费高清在线视频一区·| 久久久久久高潮国产精品视| 国产专区精品视频| 久久久亚洲国产天美传媒修理工| 欧美亚洲一区在线| 影音先锋中文字幕一区二区| 老司机一区二区| 欧美本精品男人aⅴ天堂| 亚洲精品国产无天堂网2021| 亚洲片在线资源| 国产精品v欧美精品v日韩精品| 亚洲欧美日韩国产综合在线| 亚洲网站在线| 极品少妇一区二区三区| 欧美激情精品久久久久久免费印度| 牛夜精品久久久久久久99黑人| 亚洲人在线视频| 亚洲毛片在线观看.| 国产精品久久久久aaaa九色| 欧美专区日韩视频| 嫩草影视亚洲| 亚洲砖区区免费| 久久电影一区| 亚洲免费观看高清完整版在线观看熊 | 欧美激情视频一区二区三区在线播放 | 免费亚洲电影在线| 正在播放亚洲一区| 欧美在线观看一区| 99re亚洲国产精品| 欧美专区日韩专区| 亚洲欧美日韩在线一区| 久久这里有精品视频| 中文在线资源观看网站视频免费不卡 | 夜夜嗨av一区二区三区中文字幕| 亚洲伦理精品| 国产日韩免费| 欧美日韩精品高清| 久久激五月天综合精品| 91久久精品www人人做人人爽| 亚洲天堂av综合网| 国产精品稀缺呦系列在线| 欧美在线视频免费| 怡红院精品视频在线观看极品| 国产网站欧美日韩免费精品在线观看 | 欧美在线视频播放| 亚洲精品一区二区三区樱花| 亚洲欧美日韩人成在线播放| 亚洲伦理在线| 久久免费视频网| 欧美综合激情网| 国产精品国产| 99成人免费视频| 日韩视频永久免费| 久久久久久久精| 久久狠狠亚洲综合| 国产精品久久久久久久app| 欧美激情精品久久久久久黑人| 国产美女扒开尿口久久久| 99精品欧美一区| 99精品欧美| 欧美电影免费观看| 蜜臀av在线播放一区二区三区| 国产精品―色哟哟| 亚洲天堂偷拍| 亚洲亚洲精品在线观看 | 亚洲欧洲一级| 亚洲日本激情| 欧美激情bt| 亚洲精品一区二| 夜夜嗨av一区二区三区免费区| 久久资源av| 欧美黄色aaaa| 亚洲久久成人| 欧美日韩精品一本二本三本| 亚洲国产精品视频一区| 亚洲精品网址在线观看| 欧美激情视频免费观看| 亚洲欧洲在线视频| 一本在线高清不卡dvd| 欧美α欧美αv大片| 一区二区三区在线视频播放| 欧美顶级艳妇交换群宴| 在线播放亚洲一区| 可以免费看不卡的av网站| 美女日韩欧美| 亚洲国产天堂久久国产91| 老色鬼精品视频在线观看播放| 欧美11—12娇小xxxx| 亚洲精品日产精品乱码不卡| 欧美高清不卡在线| 99精品国产在热久久| 欧美一区二区精品| 精品91在线| 欧美精品日本| 亚洲一区二区在线免费观看视频| 久久av一区二区三区漫画| 在线精品一区| 欧美午夜宅男影院在线观看| 亚洲在线免费| 欧美激情欧美激情在线五月| 日韩一级精品| 国产一区二区三区高清| 欧美va天堂在线| 亚洲一区二区三区精品在线| 久热re这里精品视频在线6| 日韩一级片网址| 国内成+人亚洲| 欧美另类videos死尸| 亚洲欧美中日韩| 亚洲国语精品自产拍在线观看| 亚洲欧美激情诱惑| 亚洲第一福利视频| 国产精品素人视频| 欧美~级网站不卡| 性欧美超级视频| 亚洲精品一级| 欧美国产日韩a欧美在线观看| 午夜精品久久久久久久99水蜜桃| 亚洲国产成人av在线| 国产精品久久久久久久久久久久久久 | 欧美在线不卡| 99www免费人成精品| 麻豆av一区二区三区久久| 亚洲欧美久久久| 99国产麻豆精品| 亚洲国产一区二区三区青草影视| 国产毛片一区二区| 欧美肉体xxxx裸体137大胆| 久久视频一区二区| 午夜精品一区二区在线观看| 日韩午夜三级在线| 亚洲第一黄色| 久久夜色精品| 久久久国产精品亚洲一区| 亚洲影视在线播放| 亚洲精品一区二区三区在线观看| 国内精品久久久久影院优|