• <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.¢%

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

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

            Posted on 2009-01-31 01:52 S.l.e!ep.¢% 閱讀(1382) 評(píng)論(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ù)長(zhǎng)度
            ???? 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;
            }
            ;

            下面是測(cè)試的代碼
            #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ā)送的包長(zhǎng)度不足
            ????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;
            }
            2019久久久高清456| 国产精品久久久亚洲| 午夜肉伦伦影院久久精品免费看国产一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产精品久久久久久久人人看| 思思久久精品在热线热| 91久久精品电影| 伊人久久大香线蕉AV色婷婷色 | 人人狠狠综合久久88成人| 精品免费tv久久久久久久| 久久成人国产精品一区二区| 亚洲国产精品无码久久久蜜芽| 国内精品久久久久久麻豆| 久久精品中文字幕一区| 国产精品久久久久乳精品爆 | 国产三级观看久久| 精品久久久久久无码专区不卡| 色诱久久av| 国产日韩久久久精品影院首页 | 成人资源影音先锋久久资源网| 一本大道久久东京热无码AV| 国内精品久久久久久久coent | 亚洲色欲久久久久综合网 | 久久香蕉综合色一综合色88| 久久久久久亚洲精品成人 | 久久精品国产秦先生| 无码AV波多野结衣久久| 欧美精品国产综合久久| 亚洲乱码日产精品a级毛片久久| 久久久久国产亚洲AV麻豆| 国产精久久一区二区三区| 7国产欧美日韩综合天堂中文久久久久| 久久精品国产亚洲av麻豆小说| 久久久亚洲AV波多野结衣| 久久久久久综合网天天| 人妻精品久久无码区| 久久久久久亚洲AV无码专区| 久久se精品一区二区| 国产精品18久久久久久vr | 亚洲国产日韩综合久久精品| 久久青青草视频|