• <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>

            那誰的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            lighttpd1.4.18代碼分析(七)--狀態(tài)機(jī)(1)CON_STATE_REQUEST_START狀態(tài)

            本節(jié)開始分析lighttpd中處理連接的狀態(tài)機(jī),也就是connections.c文件中的connection_state_machine函數(shù).我們將沿著上一節(jié)中給出的狀態(tài)機(jī)示意圖一步一步往下走,以圖把這個(gè)過程分析清楚.這也是目前為止唯一一個(gè)詳細(xì)進(jìn)行分析的函數(shù),希望這樣可以更加突出這個(gè)函數(shù)的重要性.

            一)CON_STATE_REQUEST_START狀態(tài)
            這個(gè)狀態(tài)出現(xiàn)在剛剛通過accept函數(shù)接收一個(gè)新的連接時(shí),此時(shí)需要保存一些數(shù)據(jù):
                    case CON_STATE_REQUEST_START: /* transient, 開始接收請(qǐng)求 */
                        
            if (srv->srvconf.log_state_handling) {
                            log_error_write(srv, __FILE__, __LINE__, 
            "sds",
                                    
            "state for fd", con->fd, connection_get_state(con->state));
                        }

                        
            // 保存時(shí)間
                        con->request_start = srv->cur_ts;
                        con
            ->read_idle_ts = srv->cur_ts;

                        
            // 該連接的請(qǐng)求次數(shù)
                        con->request_count++;
                        
            // 每次循環(huán)處理的請(qǐng)求次數(shù)
                        con->loops_per_request = 0;

                        
            // 狀態(tài)改為可讀, 也就是可以接收數(shù)據(jù)
                        connection_set_state(srv, con, CON_STATE_READ);

                        
            /* patch con->conf.is_ssl if the connection is a ssl-socket already */

            #ifdef USE_OPENSSL
                        con
            ->conf.is_ssl = srv_sock->is_ssl;
            #endif

                        
            break;
            需要注意的是這里將connetion中的兩個(gè)字段保存為當(dāng)前時(shí)間,request_start和read_idle_ts, 前者存放的是接收連接的時(shí)間, 后者用于超時(shí)判斷, 在第5節(jié)講解lighttpd中如何處理超時(shí)的時(shí)候提到過,lighttpd設(shè)置了一個(gè)每一秒一次的定時(shí)器, 每次定時(shí)器到時(shí)就依次輪詢所有的連接, 判斷是否超時(shí), 而判斷的依據(jù)就是拿當(dāng)前的時(shí)間 - connection的read_idle_ts字段, 看看是否超時(shí):
             // 如果當(dāng)前時(shí)間與read_idle_ts之差大于max_read_idle, 超時(shí)
                                        if (srv->cur_ts - con->read_idle_ts > con->conf.max_read_idle) {
                                            
            /* time - out */

                                            connection_set_state(srv, con, CON_STATE_ERROR);
                                            changed 
            = 1;
                                        }

            這些該保存的數(shù)據(jù)都保存完畢之后, 狀態(tài)機(jī)進(jìn)入下一個(gè)狀態(tài),CON_STATE_READ, 也就是開始接收數(shù)據(jù), 這是下一節(jié)要講解的內(nèi)容了.


            posted on 2008-09-22 15:10 那誰 閱讀(2938) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程 、服務(wù)器設(shè)計(jì) 、Linux/Unixlighttpd

            婷婷久久久亚洲欧洲日产国码AV| 久久久久久久综合日本亚洲 | 国产成人精品综合久久久久| 色婷婷综合久久久久中文字幕| 久久久久亚洲av成人网人人软件| 无码AV中文字幕久久专区| 国产日产久久高清欧美一区| 欧美精品一区二区久久| 久久亚洲精品国产精品| 久久WWW免费人成—看片| 亚洲欧美成人综合久久久| 久久99国产一区二区三区| 浪潮AV色综合久久天堂| 久久综合九色综合欧美就去吻| 色综合久久中文字幕无码| 久久综合一区二区无码| 国产精品久久毛片完整版| 国产aⅴ激情无码久久| 久久成人18免费网站| .精品久久久麻豆国产精品| 亚洲国产日韩欧美久久| 亚洲午夜精品久久久久久人妖| 久久天天躁狠狠躁夜夜96流白浆| 久久精品无码专区免费| 国产成人久久精品二区三区| 青草国产精品久久久久久| 久久天天躁夜夜躁狠狠躁2022| 香港aa三级久久三级| 久久国产乱子伦精品免费强| 久久久久久久久无码精品亚洲日韩| 日本WV一本一道久久香蕉| 久久精品国产福利国产琪琪| 成人久久久观看免费毛片| 狠狠色综合网站久久久久久久高清| 欧美麻豆久久久久久中文| 欧美久久一级内射wwwwww.| 久久影院亚洲一区| 欧美亚洲国产精品久久| 久久人做人爽一区二区三区| 亚洲中文字幕无码久久精品1| 狠狠色丁香久久婷婷综合|