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

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            測試網(wǎng)絡(luò)程序

            Posted on 2009-01-31 01:52 S.l.e!ep.¢% 閱讀(1377) 評論(0)  編輯 收藏 引用 所屬分類: test

            // ?網(wǎng)絡(luò)通信協(xié)議
            ////////////////////////////////////////////////////////////////////////////// //
            struct ?cmd
            {
            ????
            int ?nCmd;
            }
            ;

            #pragma?pack(
            1 )
            struct ?tagClientLogin
            {
            ????cmd??header;
            ????
            char ?username[ 20 ];
            ????
            char ?userpwd[ 20 ];
            }
            ;

            struct ?tagRepClientLogin
            {
            ????cmd??header;
            ????
            bool ?bLoginSuccess;
            }
            ;
            #pragma?pack(
            1 )

            #define ?NETWORK_CMD_LOGIN?1
            #define ?NETWORK_CMD_REP_LOGIN?2
            ////////////////////////////////////////////////////////////////////////////// //

            // ?接口定義
            ////////////////////////////////////////////////////////////////////////////// //
            class ?ClientObserver
            {
            public :
            ????ClientObserver()??
            {}
            ????
            ~ ClientObserver()? {}

            ????
            virtual ? void ?onRepLogin( bool ?bLoginSuccess)? = ? 0 ;
            }
            ;

            class ?INetWorkable
            {
            public :
            ????INetWorkable()?
            {}
            ????
            ~ INetWorkable()? {}

            ????
            // ?pvoid?:?欲發(fā)送的緩沖區(qū);?nSize?:?緩沖區(qū)的大小
            ???? virtual ? bool ?send( const ? void * ?pvoid,? int ?nSize)? = ? 0 ;

            ????
            // ?由網(wǎng)絡(luò)層調(diào)用,pvoid:?接收到的數(shù)據(jù)的緩沖區(qū),?nSize?:?緩沖區(qū)的大小;??返回已經(jīng)處理的數(shù)據(jù)長度
            ???? virtual ? int ?onreceive( const ? void * ?pvoid,? int ?nSize)? = ? 0 ;
            }
            ;

            class ?ILogable
            {
            public :
            ????ILogable()?
            {}
            ????
            ~ ILogable()? {}

            ????
            virtual ? void ?log( const ? char * ?plog)? = ? 0 ;
            }
            ;
            ////////////////////////////////////////////////////////////////////////////// //

            // ?業(yè)務(wù)邏輯類
            ////////////////////////////////////////////////////////////////////////////// //
            class ?Client?:? public ?INetWorkable
            {
            public :
            ????Client();
            ????
            virtual ? ~ Client();

            ????
            void ?registerObserver(ClientObserver * ?p)? {?m_pClientObserver? = ?p;?}
            ????
            void ?removeObserver()? {?m_pClientObserver? = ?NULL;?}

            ????
            void ?setLoger(ILogable * ?p)? {?m_plog? = ?p;?}
            ????
            void ?removeLoger()????????? {?m_plog? = ?NULL;?}

            ????
            bool ?SendLogin( const ? char * ?name,? const ? char * ?pwd)
            ????
            {
            ????????tagClientLogin?login;
            ????????memset(
            & login,? 0 ,? sizeof (login));
            ????????login.header.nCmd?
            = ?NETWORK_CMD_LOGIN;
            ????????strncpy(login.username,?name,?
            sizeof (login.username));????????
            ????????strncpy(login.userpwd,?pwd,?
            sizeof (login.userpwd));
            ????????
            return ?send( & login,? sizeof (login));
            ????}


            protected :
            ????
            virtual ? bool ?send( const ? void * ?pvoid,? int ?nSize)
            ????
            {
            ????????cout?
            << ? " Client?socket?send?size?=? " ? << ?nSize? << ?endl;
            ????????
            return ? true ;
            ????}

            ????
            ????
            virtual ? int ?onreceive( const ? void * ?pvoid,? int ?nSize)
            ????
            {
            ????????
            if ?(?nSize? < ? sizeof (cmd)?)
            ????????????
            return ? 0 ;
            ????????
            ????????cmd
            * ?pheader? = ?(cmd * )pvoid;
            ????????
            ????????
            if ?(?pheader -> nCmd? == ?NETWORK_CMD_REP_LOGIN?)
            ????????
            {
            ????????????
            if ?(?nSize? < ? sizeof (tagRepClientLogin)?)
            ????????????????
            return ? 0 ;
            ????????????
            ????????????tagRepClientLogin
            * ?ptagRepClientLogin? = ?(tagRepClientLogin * )pvoid;
            ????????????
            ????????????
            if ?(?m_pClientObserver? != ?NULL?)
            ????????????????m_pClientObserver
            -> onRepLogin(ptagRepClientLogin -> bLoginSuccess);
            ????????????
            ????????????
            return ? sizeof (tagRepClientLogin);????
            ????????}

            ????????
            ????????
            return ? 0 ;
            ????}


            private :
            ????ClientObserver
            * ?m_pClientObserver;
            ????ILogable
            * ???????m_plog;
            }
            ;

            下面是測試的代碼
            #include?"client.h"
            #include?
            <string.h>

            class?testClient?:?public?Client
            {
            public:
            ????testClient()??
            {}
            ????
            ~testClient()?{}

            ????
            virtual?bool?send(const?void*?pvoid,?int?nSize)
            ????
            {
            ????????memcpy(m_buf,?pvoid,?nSize);
            ????????
            return?true;
            ????}


            ????
            int?NetWorkReceive(const?void*?pvoid,?int?nSize)
            ????
            {
            ????????
            return?onreceive(pvoid,?nSize);
            ????}


            ????
            bool?cmpMemory(const?void*?pvoid,?int?nSize)
            ????
            {
            ????????
            return?(?0?==?memcmp(m_buf,?pvoid,?nSize)?);
            ????}

            ????
            private:
            ????
            char?m_buf[1024];
            }
            ;

            int?main()
            {
            ????testClient?test;
            ????test.SendLogin(
            "test_username",?"test_pwd");

            ????tagClientLogin?clientlogin;
            ????memset(
            &clientlogin,?0,?sizeof(clientlogin));
            ????clientlogin.header.nCmd?
            =?NETWORK_CMD_LOGIN;
            ????strcpy(clientlogin.username,?
            "test_username");
            ????strcpy(clientlogin.userpwd,??
            "test_pwd");
            ????
            if(?!test.cmpMemory(&clientlogin,?sizeof(clientlogin))?)
            ????????cout?
            <<?"test?failed"?<<?endl;
            ????
            ????
            char?szBuf[1024]??=?{0};

            ????
            //?摸擬服務(wù)器發(fā)送的包長度不足
            ????if(?0?!=?test.NetWorkReceive(szBuf,?sizeof(tagRepClientLogin)?-?10)?)
            ????????cout?
            <<?"test?failed"?<<?endl;

            ????
            //?摸擬服務(wù)器發(fā)送的包內(nèi)容非法
            ????if(?0?!=?test.NetWorkReceive(szBuf,?sizeof(tagRepClientLogin))?)
            ????????cout?
            <<?"test?failed"?<<?endl;

            ????tagRepClientLogin?repLogin;
            ????repLogin.header.nCmd?
            =?NETWORK_CMD_REP_LOGIN;
            ????memcpy(szBuf,?
            &repLogin,?sizeof(repLogin));

            ????
            //?摸擬服務(wù)器發(fā)送了正確的包
            ????if(?sizeof(tagRepClientLogin)?!=?test.NetWorkReceive(szBuf,?sizeof(tagRepClientLogin))?)
            ????????cout?
            <<?"test?failed"?<<?endl;
            ????
            ????
            return?0;
            }
            久久久久久A亚洲欧洲AV冫| 久久久久久综合网天天| 97久久天天综合色天天综合色hd| 久久精品国产网红主播| 99久久精品费精品国产| 欧美精品乱码99久久蜜桃| 97久久超碰成人精品网站| 欧美亚洲日本久久精品| 国产三级久久久精品麻豆三级| 精品久久久久久久久久中文字幕 | 久久久亚洲欧洲日产国码是AV| 五月丁香综合激情六月久久| 精品久久综合1区2区3区激情| 亚洲精品tv久久久久久久久 | 久久精品人人做人人爽97| 久久人人爽人人爽人人片AV东京热 | 久久天天躁狠狠躁夜夜96流白浆| 精品乱码久久久久久夜夜嗨| 亚洲精品无码久久一线| 久久久久综合国产欧美一区二区 | 久久久久亚洲AV无码专区桃色| 人妻无码久久一区二区三区免费| 青春久久| 久久午夜福利电影| 久久精品无码av| 99久久精品免费| 欧美久久精品一级c片片| 久久综合给合久久狠狠狠97色 | 99精品久久久久久久婷婷| 久久超碰97人人做人人爱| 亚洲国产精品无码久久一区二区| 亚洲伊人久久综合影院| 亚洲乱码日产精品a级毛片久久| 亚洲乱亚洲乱淫久久| A级毛片无码久久精品免费| 国产精品18久久久久久vr | 午夜不卡久久精品无码免费| 99精品国产99久久久久久97| 亚洲中文字幕无码久久2020| 久久精品亚洲中文字幕无码麻豆| 久久夜色精品国产噜噜噜亚洲AV|