• <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.¢% 閱讀(1549) 評論(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;
            }
            久久久中文字幕日本| 久久婷婷五月综合97色一本一本| 久久人爽人人爽人人片AV| 欧美噜噜久久久XXX| 亚洲午夜久久久精品影院| 亚洲AV伊人久久青青草原| 精品久久久无码人妻中文字幕| 国内精品伊人久久久久av一坑| 四虎国产精品免费久久5151| 欧美午夜A∨大片久久| 久久国产精品77777| 久久久久久久久久免免费精品 | A狠狠久久蜜臀婷色中文网| 国内精品久久久久国产盗摄| 精品一二三区久久aaa片| 国产2021久久精品| 久久国产热精品波多野结衣AV| 国产香蕉97碰碰久久人人| 久久香综合精品久久伊人| 久久久综合香蕉尹人综合网| 精品综合久久久久久97超人 | 久久精品国产精品亚洲人人 | 亚洲日韩中文无码久久| 9999国产精品欧美久久久久久| 国产aⅴ激情无码久久| 久久无码一区二区三区少妇 | 深夜久久AAAAA级毛片免费看| 国产成人精品久久一区二区三区| 亚洲精品97久久中文字幕无码 | 久久久久亚洲精品天堂久久久久久| 色欲综合久久中文字幕网| 人妻无码αv中文字幕久久琪琪布| 久久精品成人免费看| 69久久夜色精品国产69| 久久精品中文字幕无码绿巨人| 国产69精品久久久久久人妻精品| 久久久久九国产精品| 精品无码久久久久久久久久| 7国产欧美日韩综合天堂中文久久久久| 亚洲色大成网站www久久九| 亚洲色欲久久久综合网|