• <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),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            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.¢% 閱讀(1382) 評論(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;
            }
            久久精品亚洲男人的天堂| 蜜桃麻豆WWW久久囤产精品| 久久久久久免费一区二区三区| 久久精品国产99国产电影网| 久久精品国产第一区二区| 欧美一区二区久久精品| 久久精品国产91久久综合麻豆自制 | 久久久久久伊人高潮影院| 99久久成人国产精品免费| 亚洲国产精品综合久久网络| 潮喷大喷水系列无码久久精品 | 97久久精品无码一区二区天美| 久久久WWW成人| 51久久夜色精品国产| 久久中文骚妇内射| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 综合人妻久久一区二区精品| 国产香蕉97碰碰久久人人| 久久久噜噜噜久久中文福利| 亚洲国产精品成人AV无码久久综合影院 | 久久99国产综合精品女同| 无码八A片人妻少妇久久| 久久久99精品成人片中文字幕| 国产一区二区三区久久| 精品综合久久久久久97超人| 久久天堂AV综合合色蜜桃网| 久久久久亚洲av成人网人人软件| 大香网伊人久久综合网2020| 嫩草影院久久99| 一本一道久久精品综合| 久久99国产精一区二区三区| 国产一级做a爰片久久毛片| 91精品国产乱码久久久久久| 欧美一区二区三区久久综合 | 久久久女人与动物群交毛片| 亚洲人成伊人成综合网久久久 | 精品国产乱码久久久久久人妻| 少妇熟女久久综合网色欲| 久久久久久精品免费看SSS| 久久精品一区二区三区AV| 久久精品国产亚洲AV麻豆网站|