• <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.¢% 閱讀(1554) 評論(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;
            }
            亚洲国产日韩综合久久精品| 久久亚洲精精品中文字幕| 91精品国产91久久久久久| 日本精品久久久久中文字幕8 | 午夜精品久久久久久久| 国产精品久久久久9999高清| 思思久久99热免费精品6| 麻豆一区二区99久久久久| 精品久久久久久无码人妻蜜桃| 精品多毛少妇人妻AV免费久久| 国产精自产拍久久久久久蜜| 97久久国产综合精品女不卡| www亚洲欲色成人久久精品| 伊人久久大香线蕉综合Av | 亚洲国产精品久久久久| 亚洲va久久久噜噜噜久久| 久久久久久毛片免费看| 国产精品对白刺激久久久| 久久人人爽人人爽人人片AV不| 久久精品免费网站网| 天天爽天天爽天天片a久久网| 久久综合九色综合网站| 久久精品国产久精国产一老狼| 99国产精品久久久久久久成人热| 久久精品国产亚洲AV蜜臀色欲 | AV无码久久久久不卡蜜桃| 久久婷婷国产剧情内射白浆 | 久久久一本精品99久久精品88| 精品国产乱码久久久久久浪潮| 国内精品久久久久久不卡影院 | 国产成人久久激情91| 狠狠色婷婷久久一区二区三区| 欧美噜噜久久久XXX| 色狠狠久久AV五月综合| 人妻无码αv中文字幕久久| 久久久国产乱子伦精品作者| 久久久精品人妻一区二区三区四| 日产精品99久久久久久| 99精品久久久久中文字幕| 国产激情久久久久影院老熟女免费| 久久国产精品成人免费 |