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

            woomsg

            在路上

            gloox代碼分析1 - connect模塊

            主要分析gloox的connect模塊,涉及的文件:
            connectionbase.h
            connectiondatahander.h
            connectionhandler.h
            connectiontcpbase.h (connectiontcpbase.cpp)
            connectiontcpclient.h (connectiontcpclient.cpp)
            connectiontcpserver.h (connectiontcpserver.cpp)

            1. ConnectionBase抽象連接類,表示一個socket連接。
            3個數據成員:
            server和ip - 需要連接到的目標地址和端口(在ConnectionTcpServer是要綁定的本地地址)
            connectionState - 連接的當前狀態(tài) (一個三種狀態(tài)disconnected | connecting | connected)
            connectionDataHandler - 處理三類ConnectionBase中的三類事件 ( 數據接收 | 連接建立 | 連接斷開 )
            5個主要方法:
            connect - 建立一個socket連接
            disconnect - 斷開一個socket連接
            send - 發(fā)送數據,該方法直到要發(fā)送的數據全部發(fā)送完畢才返回
            recv( int timeout ) - 接收數據,接收到數據或者timeout返回
            receive - 把connection設置成"接收模式",也就是循環(huán)的調用recv接收數據,直到連接斷開該方法返回,
                           該方法保證這個連接可以循環(huán)的接收數據.

            注意: recv和receive的區(qū)別。


            2. ConnectionDataHandler處理繼承自ConnectionBase的對象的事件
            handlerReceivedData - 接收到數據
            handlerConnect - 一個原始的套接字連接建立
            handlerDisconnect - 一個原始的套接字連接斷開

            3. ConnectionTcpBase一個基本的TCP連接,繼承自ConnectionBase
            數據成員
            bool cancel - 表示連接是否應該斷開,默認為true. (true表示連接斷開)
                                 函數disconnect也就是僅僅設置cancel為true.
                                 在函數receive循環(huán)接收數據的邏輯中會檢測cancel,如果為true,則表示連接斷開,則返回,退出"接收模式"
            int bufSize - buf的大小,默認是1024
            char* buf - 緩沖區(qū),大小事bufSize + 1 (在ConnectionTcpBase中并沒有用到這個緩沖區(qū),供上層使用E.g. ConnectionTcpClient的recv來接收數據)

            實現的主要方法:
            send - 發(fā)送數據
            receive - "循環(huán)"接收數據
            dataAvailable( int timeout ) - 一個私有方法,作用是測試socket上目前是否有數據可讀,如果有返回true. 可以供recv調用. 避免了阻塞的調用原始套接字方法::receive或者::accept.

            4. ConnectionTcpClient實現一個基本的TCP連接,繼承自ConnectionTcpBase
            實現的主要方法
            connect - 連接到目標地址,如果成功,則調用handler->handlerConnect,失敗則調用handler->handlerDisconnect
            recv - 接收數據,如果接收到數據,馬上調用handler->handlerReceiveData,接收發(fā)生錯誤,表示連接斷開,調用handler->handlerDisconnect

            5. ConnectionHandler一個抽象類,用來接收一個客戶端連接的請求,該類用于ConnectionTcpServer
            只有一個接口:
            handleIncomingConnection( ConnectionBase *connect ) - &connect表示新建立的連接請求,哪原始的socket做類比相當于accept返回的socket.

            注意: 區(qū)別于ConnectionDataHandler用于處理一個特定連接的中的事件(數據到來,連接斷開,連接建立),ConnectionListener用于XMPP Stream.

            6. ConnectionTcpServer,實質上就是一個偵聽socket,同原始的socket做類比就是一個調用了bind/listen之后處于偵聽狀態(tài)的socket.
            主要數據成員:
            connectionHandler - 接收新到來的連接,接收到之后調用handlerIncomingConnection
            主要方法:
            connect - 建立套接字,綁定到本地地址,偵聽bind/listen
            recv - 調用accept接收一個socket連接,如果成功,則用accpet返回的socket創(chuàng)建一個ConnectionTCPClient,調用handlerIncomingConnection來處理新進的連接.

            總結:
            ConnectionTcpServer和ConnectionTcpClient的區(qū)別:
            connect (client) - 連接到服務器,使connection處于可以接收數據的狀態(tài)
            connect(server) - 綁定到本地地址,偵聽,使connection處于可以接收新連接的狀態(tài)(accept)

            recv(client) - 接收數據,調用connectionDataHandler->handlerReceivedData
            recv(server) - 接收新連接,調用connectionHandler->handlerIncomingConnection

            receive(Client) - 接收數據狀態(tài),循環(huán)接收數據,調用disconnect時退出
            receive(Server) - 接收連接狀態(tài),循環(huán)接收連接,調用disconnect時退出.

            所以ConnectionTcpClient有發(fā)送數據和循環(huán)接收數據的能力,ConnectionTcpServer有偵聽客戶端連接的能力。當有特定的事件發(fā)生的時候,會自動觸發(fā)相關的handler來進行處理,如數據到來,連接建立\斷開,新連接到來等等。

            問題:
            這種設計模式使receive處于一個無限的while循環(huán),不斷的調用select+accpet或者select+receive,是否利于send之類的方法在同一個socket上發(fā)送數據?
                                                     

            posted on 2008-10-17 21:20 ysong.lee 閱讀(1666) 評論(0)  編輯 收藏 引用

            国产福利电影一区二区三区久久久久成人精品综合 | 日韩av无码久久精品免费| 亚洲伊人久久成综合人影院 | 99久久成人18免费网站| 91超碰碰碰碰久久久久久综合| Xx性欧美肥妇精品久久久久久 | 国产国产成人精品久久| 欧美日韩中文字幕久久伊人| 2021国内精品久久久久久影院| 国产美女亚洲精品久久久综合| 国产韩国精品一区二区三区久久| 欧洲性大片xxxxx久久久| 久久国产精品99精品国产| 久久精品国产亚洲AV不卡| 97久久婷婷五月综合色d啪蜜芽 | 久久精品国产亚洲5555| 久久亚洲精精品中文字幕| 色99久久久久高潮综合影院| 1000部精品久久久久久久久| 久久久国产精华液| 久久久久久极精品久久久| 国产韩国精品一区二区三区久久| 亚洲精品无码成人片久久| 亚洲欧美日韩久久精品| 狠狠色综合网站久久久久久久| 久久久噜噜噜久久熟女AA片| 婷婷久久综合九色综合九七| 久久青草国产精品一区| 久久丫精品国产亚洲av不卡| 久久99精品国产麻豆宅宅| 伊人伊成久久人综合网777| 99久久国产综合精品五月天喷水| 久久亚洲美女精品国产精品| 欧洲成人午夜精品无码区久久| 2020久久精品亚洲热综合一本| 久久久久亚洲?V成人无码| 国产成人精品久久亚洲高清不卡| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久青青草原亚洲av无码app| 亚洲AV日韩精品久久久久久| 精品熟女少妇AV免费久久|