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

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

            測試網絡程序 2

            Posted on 2009-02-01 23:09 S.l.e!ep.¢% 閱讀(1547) 評論(0)  編輯 收藏 引用 所屬分類: test
            修改了 INetwordable 接口, 將網絡程序中的“網絡通信”抽離出來,方便寫單元測試

            #include?<windows.h>
            #include?
            <iostream>
            using?namespace?std;

            //??網絡通信協議?
            //////////////////////////////////////////////////////////////////////////////?//?
            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?:?欲發送的緩沖區;?nSize?:?緩沖區的大小?
            ????virtual?bool??send(?const???void?*??pvoid,??int??nSize)?=?0?;
            ????
            ????//??由網絡層調用,pvoid:?接收到的數據的緩沖區,?nSize?:?緩沖區的大小;??返回已經處理的數據長度?
            ????virtual?int?onreceive(?const???void?*??pvoid,??int??nSize)?=?0?;
            };
            */


            //?將原先的?INetWorkable?接口拆分成兩個類
            class?INetWorkSendable
            {
            public?:
            ????INetWorkSendable()??
            {}?
            ????
            ~INetWorkSendable()?{}?
            ????
            ????
            //??pvoid?:?欲發送的緩沖區;?nSize?:?緩沖區的大小?
            ????virtual?bool??send(?const???void?*??pvoid,??int??nSize)?=?0?;
            }
            ;

            class?INetWorkRecvable
            {
            public?:
            ????INetWorkRecvable()??
            {}?
            ????
            ~INetWorkRecvable()?{}?
            ????
            ????
            //??由網絡層調用,pvoid:?接收到的數據的緩沖區,?nSize?:?緩沖區的大小;??返回已經處理的數據長度?
            ????virtual?int?onreceive(?const???void?*??pvoid,??int??nSize)?=?0?;
            }
            ;

            class?ILogable
            {
            public?:
            ????ILogable()???
            {}?
            ????
            ~?ILogable()???{}?
            ????
            ????
            virtual?void?log(const?char*?plog)?=?0;
            }
            ;
            ////////////////////////////////////////////////////////////////////////////////?

            //??業務邏輯類?
            //??Client?現在只需要繼承?INetWorkRecvable?即可
            ////////////////////////////////////////////////////////////////////////////////?
            class??Client?:?public?INetWorkRecvable
            {
            public?:
            ????Client()
            ????
            {
            ????????m_pClientObserver?
            =?NULL;
            ????????m_plog?
            =?NULL;
            ????????m_pSendable?
            =?NULL;
            ????}


            ????
            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;?}?
            ????
            ????
            void??setSendable(INetWorkSendable*?p)?{?m_pSendable?=?p;?}
            ????
            void??removeSendable(INetWorkSendable*?p)?{?m_pSendable?=?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));

            ????????
            //?Sendable?改成了?"組合"?的方式后,每次調用?Send?都要判斷,?讓我很不爽
            ????????if(?m_pSendable?!=?NULL?)
            ????????
            {
            ????????????
            return?m_pSendable->send(&login,??sizeof?(login));
            ????????}

            ????????
            else
            ????????
            {
            ????????????
            return?false;
            ????????}

            ????}
            ?
            ????
            protected?:????
            ????
            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;
            ????INetWorkSendable
            *?m_pSendable;
            }
            ?;?

            測試例子
            #include?"client.h"
            #include?
            <string.h>

            class?testClient?:?public?Client,?INetWorkSendable
            {
            public:
            ????testClient()??
            {?memset(m_buf,?0,?sizeof(m_buf));?}
            ????
            ~testClient()?{}
            ????????
            ????
            int?NetWorkReceive(const?void*?pvoid,?int?nSize)
            ????
            {
            ????????
            return?onreceive(pvoid,?nSize);
            ????}


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

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

            ????
            ????
            void?copyMemory(const?void*?pvoid,?int?nSize)
            ????
            {
            ????????memcpy(m_buf,?pvoid,?nSize);
            ????}


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

            int?main()
            {
            ????testClient?test;
            ????test.setSendable((INetWorkSendable
            *)&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};
            ????
            ????
            //?摸擬服務器發送的包長度不足
            ????if(?0?!=?test.NetWorkReceive(szBuf,?sizeof(tagRepClientLogin)?-?10)?)
            ????????cout?
            <<?"test?failed"?<<?endl;
            ????
            ????
            //?摸擬服務器發送的包內容非法
            ????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));
            ????
            ????
            //?摸擬服務器發送了正確的包
            ????if(?sizeof(tagRepClientLogin)?!=?test.NetWorkReceive(szBuf,?sizeof(tagRepClientLogin))?)
            ????????cout?
            <<?"test?failed"?<<?endl;
            ????
            ????
            return?0;
            }
            欧美久久精品一级c片片| 久久免费看黄a级毛片| 亚洲人成伊人成综合网久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲精品午夜国产VA久久成人| 99精品久久久久久久婷婷| 久久99精品久久只有精品 | 91视频国产91久久久| 久久综合综合久久综合| 色偷偷久久一区二区三区| 亚洲国产另类久久久精品黑人| 97久久国产露脸精品国产| 看久久久久久a级毛片| 色婷婷久久综合中文久久蜜桃av| 久久久无码精品亚洲日韩京东传媒| 亚洲精品99久久久久中文字幕| 亚洲精品无码久久不卡| 久久受www免费人成_看片中文| 少妇人妻综合久久中文字幕| 麻豆成人久久精品二区三区免费| 久久er热视频在这里精品| 国产一区二区精品久久岳| 久久久久久噜噜精品免费直播| 欧洲性大片xxxxx久久久| 亚洲人成伊人成综合网久久久| 久久精品一区二区三区不卡| 国产精品99久久不卡| 久久亚洲精品国产精品婷婷| 国产精品久久久久jk制服| 欧美久久综合九色综合| 久久99精品久久久久久久不卡| 久久91精品国产91久久户| 热久久视久久精品18| 久久伊人精品青青草原高清| 伊人久久大香线蕉无码麻豆| 久久精品九九亚洲精品天堂| 中文精品99久久国产| 国产成人精品久久综合| 韩国免费A级毛片久久| 色综合久久久久综合99| 72种姿势欧美久久久久大黄蕉|