• <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ò)程序 2

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

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

            //??網(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?;
            };
            */


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

            class?INetWorkRecvable
            {
            public?:
            ????INetWorkRecvable()??
            {}?
            ????
            ~INetWorkRecvable()?{}?
            ????
            ????
            //??由網(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ù)邏輯類(lèi)?
            //??Client?現(xiàn)在只需要繼承?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?改成了?"組合"?的方式后,每次調(diào)用?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;
            }
            ?;?

            測(cè)試?yán)?br />
            #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};
            ????
            ????
            //?摸擬服務(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;
            }
            99久久国产综合精品网成人影院| 狠狠色综合久久久久尤物| 色综合久久88色综合天天 | 亚洲国产成人久久精品影视| 久久久国产精品亚洲一区| 99久久精品国产一区二区| 久久91精品国产91| 亚洲国产日韩欧美久久| 污污内射久久一区二区欧美日韩| 狠狠人妻久久久久久综合蜜桃| 色综合久久天天综合| 97久久精品人人澡人人爽| 国产一级持黄大片99久久| 久久精品麻豆日日躁夜夜躁| 久久精品日日躁夜夜躁欧美| 狠狠色婷婷久久综合频道日韩| 国产精品久久久久蜜芽| 香蕉久久永久视频| 欧美成人免费观看久久| 久久天天躁狠狠躁夜夜avapp | 久久久国产精华液| 波多野结衣久久| 囯产极品美女高潮无套久久久| 狠狠色婷婷久久一区二区| 亚洲AV无码久久精品色欲| 久久综合综合久久综合| 久久精品九九亚洲精品| 久久精品国产69国产精品亚洲| 久久综合丝袜日本网| 国产精品欧美久久久久天天影视| 久久久国产精品| 久久久久久久久久久精品尤物 | 青青草原综合久久大伊人| 久久久精品国产免大香伊| 国产精品无码久久综合| 久久亚洲国产精品一区二区| 久久精品国产福利国产琪琪| 久久人妻少妇嫩草AV无码蜜桃| 久久婷婷午色综合夜啪| 久久久婷婷五月亚洲97号色 | 久久精品欧美日韩精品|