<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學習的點點滴滴。

    c_socket.io_server筆記之長輪詢超時(timeout)處理

    不吐不快

    當你習慣了現有WEB服務器,諸如nginx、apache,JAVA應用服務器Tomcat等,你就不能不注意HTTP請求的響應超時時間,需要小心,尤其是反向代理時。當你可以自由控制請求timeout超時時,那是怎樣一個快意。
    在libev中使用timeout,沒有像java那樣封裝的完善,一切都很原始,但確實鋒利多了。

    長輪詢

    一般長輪詢需要定義超時時間,一旦超時,服務器端會主動斷開連接。無論是xhr形式的長輪詢,還是jsonp長輪詢,在服務器端處理沒有多大差別,輸出數據有異。

    輸出頭部

    一般優先輸出頭部,告訴瀏覽器,需要保持長連接,當然,這需要瀏覽器支持http 1.1協議,并且明確的注明當前連接為一直保持著:keep-alive:

    char heaer_str[200= "";
    strcat(heaer_str, 
    "HTTP/1.1 200 OK\r\n");
    strcat(heaer_str, 
    "Content-Type: text/plain; charset=UTF-8\r\n");
    strcat(heaer_str, 
    "Connection: keep-alive\r\n");
    strcat(heaer_str, 
    "\r\n");
    write_msg(client, heaer_str);

    定時器啟動,等待

    連接什么時候關閉,需要在代碼中手動控制,除非瀏覽器端在發出請求等待響應期間出現異常,無故斷開了連接。設服務器端設定好連接持續時間為30秒,那么就應該啟動一個定時器,除非所使用的語言層面提供了內置支持。

    client->timeout.data = client;
    ev_timer_init(
    &client->timeout, timeout_cb, 30.00); //30s
    ev_timer_start(loop, &client->timeout);

    定時器start之后,觸發的函數timeout_cb:

     1     static void timeout_cb(EV_P_ struct ev_timer *timer, int revents) {
     2         if (EV_ERROR & revents) {
     3             fprintf(stderr, "error event in timer_beat\n");
     4             return ;
     5         }
     6     
     7         if (timer == NULL) {
     8             fprintf(stderr, "the timer is NULL now !\n");
     9             return;
    10         }
    11     
    12         client_t *client = timer->data;
    13     
    14         if (client == NULL) {
    15             fprintf(stderr, "Timeout the client is NULL !\n");
    16             return;
    17         }
    18     
    19         write_msg(client, HTML_RESPONSE_ECHO);
    20         free_res(loop, client);
    21     }

    可以看到,定時器觸發之后,本例中將輸出一串預先定義好的文字,然后關閉連接。
    如何關閉觸發器,則很簡單:


        ev_timer *timer = &client->timeout;
        
    if (timer != NULL && (timer->data != NULL)) {
            ev_timer_stop(loop, timer);
        }

    編譯運行

    編譯一下:

    gcc longpolling.c -o longpolling ../include/libev.a ../include/http-parser/http_parser.o -lm

    運行它:

    ./long_polling

    然后測試:

    curl -i http://192.168.190.150:9000/long_polling

    可以先看到頭部:

    HTTP/1.1 200 OK Content-Type: text/plain; charset=UTF-8 Connection: keep-alive

    等到30秒后輸出具體的文字內容:

    The timeout(30s) had passed, you are welcome ~!

    小結

    所演示的長輪詢,沒有什么難度,HTTP 1.1頭部輸出,定時器啟動,然后等待輸出。
    libev內含的timer組件簡單易用,控制方便,但不算是最佳實踐,官方文檔給出了若干種最佳實踐方式。具體可參閱:
    http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#codeevtimercoderelativeandopti

    完整代碼

    posted on 2013-03-27 08:57 nieyong 閱讀(4147) 評論(0)  編輯  收藏 所屬分類: socket.io

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

    <2013年3月>
    242526272812
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一二三四在线观看免费高清中文在线观看 | 久久青草免费91观看| mm1313亚洲精品国产| 国产精品亚洲二区在线| 波多野结衣久久高清免费| 亚洲国产欧洲综合997久久| 成年人免费观看视频网站| 亚洲精品乱码久久久久蜜桃 | 18禁成人网站免费观看| 久久久久亚洲AV片无码下载蜜桃| 久久免费精品一区二区| 亚洲成年人在线观看| 久久精品人成免费| 久久亚洲日韩看片无码| 永久免费视频网站在线观看| 亚洲高清无在码在线电影不卡| 30岁的女人韩剧免费观看| 亚洲一区二区三区四区视频 | 曰批全过程免费视频播放网站| 亚洲精品白色在线发布| 手机看黄av免费网址| 亚洲人成网站免费播放| 又粗又硬又黄又爽的免费视频 | 一级女性全黄久久生活片免费| 亚洲综合色区在线观看| 免费的全黄一级录像带| 亚洲噜噜噜噜噜影院在线播放| 扒开双腿猛进入爽爽免费视频| 亚洲AV无码一区二区三区电影| 免费h黄肉动漫在线观看| 国产精品免费大片一区二区| 亚洲AV综合色区无码一区 | 最近最新中文字幕完整版免费高清| 亚洲乱码日产精品一二三| 免费h黄肉动漫在线观看| 日本免费高清视频| 在线精品亚洲一区二区| 久久精品夜色噜噜亚洲A∨| 最近2019中文字幕免费直播| 亚洲区日韩精品中文字幕| 久久久久亚洲精品天堂久久久久久 |