青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

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

測試網(wǎng)絡(luò)程序 2

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

#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ù)長度?
????virtual?int?onreceive(?const???void?*??pvoid,??int??nSize)?=?0?;
};
*/


//?將原先的?INetWorkable?接口拆分成兩個類
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ù)長度?
????virtual?int?onreceive(?const???void?*??pvoid,??int??nSize)?=?0?;
}
;

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

//??業(yè)務(wù)邏輯類?
//??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;
}
?;?

測試例子
#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ā)送的包長度不足
????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;
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品一二一区| 国产在线拍揄自揄视频不卡99| 欧美一区二区免费| 免费欧美高清视频| 国语精品中文字幕| 欧美在线视频日韩| 亚洲一区在线直播| 国产精品你懂的在线| 亚洲视频欧美在线| 亚洲自拍三区| 中文在线一区| 欧美日韩性视频在线| 日韩亚洲精品视频| 在线成人h网| 久久婷婷色综合| 久久九九免费| 亚洲国产成人精品久久久国产成人一区| 欧美视频一区| 亚洲一区二区精品| 亚洲一区图片| 韩国自拍一区| 欧美激情精品久久久久久黑人| 免费观看亚洲视频大全| 亚洲国产日韩综合一区| 亚洲国产精品va在线看黑人动漫 | 亚洲国产高清在线| 欧美激情综合在线| 亚洲视频图片小说| 亚洲欧美bt| 精品二区视频| 亚洲精品乱码久久久久久日本蜜臀| 欧美久久在线| 欧美一级电影久久| 久久精品国产亚洲一区二区| 亚洲韩国日本中文字幕| 亚洲精品中文在线| 国产免费观看久久黄| 久久躁日日躁aaaaxxxx| 欧美成人一品| 午夜精品久久久久久久| 久久精品国产精品亚洲综合| 91久久精品美女高潮| 一本色道久久综合亚洲精品高清| 国产日韩欧美一区二区| 欧美黄色小视频| 国产精品久久久久久模特 | 欧美电影免费观看高清| 欧美日韩一区三区| 另类亚洲自拍| 欧美日韩国内| 久久一区二区三区超碰国产精品| 欧美国产日韩xxxxx| 欧美一区二区三区四区高清| 裸体一区二区三区| 亚洲欧美一区二区三区久久| 久久久免费av| 欧美一区二区在线视频| 欧美精选午夜久久久乱码6080| 性欧美超级视频| 欧美xxx在线观看| 久久久免费精品视频| 欧美日韩亚洲天堂| 欧美成人精品在线| 国产美女诱惑一区二区| 日韩午夜黄色| 91久久精品国产| 欧美在线一二三区| 亚洲欧美日韩国产综合| 麻豆精品精华液| 久久尤物视频| 国产日韩欧美在线视频观看| 99国产精品久久久久久久| 亚洲国产一区二区三区a毛片| 午夜在线观看免费一区| 亚洲资源av| 欧美日韩视频一区二区三区| 欧美国产一区二区| 伊人色综合久久天天| 欧美一区二区黄| 久久精品国产一区二区电影| 亚洲一区二区三区在线| 欧美精品 国产精品| 亚洲美女av电影| 欧美三级电影精品| 亚洲经典一区| 亚洲精品免费在线观看| 久久婷婷麻豆| 欧美成人视屏| 亚洲国产婷婷香蕉久久久久久| 久久se精品一区精品二区| 久久av一区二区| 国产欧美精品日韩区二区麻豆天美| 一区二区三区欧美视频| 亚洲一区尤物| 国产精品日本一区二区| 在线亚洲一区二区| 亚洲欧美日本国产有色| 国产精品美女久久久久av超清| 99riav久久精品riav| 亚洲性视频h| 国产精品久久久久久久久久免费看| 日韩视频国产视频| 亚洲免费伊人电影在线观看av| 欧美日韩在线不卡| 中国av一区| 欧美中文在线免费| 精品动漫3d一区二区三区免费版 | 欧美激情在线播放| 亚洲国产精品久久久久| 亚洲国产影院| 欧美日产一区二区三区在线观看| 亚洲精品乱码久久久久久按摩观| 一区二区日本视频| 国产精品毛片va一区二区三区| 香蕉免费一区二区三区在线观看| 快播亚洲色图| 亚洲精品美女| 国产精品日韩一区二区| 久久精品国产一区二区三区免费看| 久久影视精品| 日韩视频在线观看国产| 国产精品手机在线| 蜜臀久久99精品久久久久久9| 欧美韩日高清| 亚洲欧美日韩精品| 亚洲国产成人精品久久| 欧美日韩久久精品| 久久不射电影网| 亚洲精品在线观| 久久久久久婷| 亚洲夜间福利| 亚洲高清视频在线| 国产精品老牛| 欧美激情视频在线播放| 欧美亚洲一区二区在线| 亚洲精品视频免费观看| 久久美女性网| 亚洲免费一在线| 日韩午夜电影av| 影音先锋欧美精品| 国产精品私拍pans大尺度在线| 美女日韩在线中文字幕| 欧美亚洲系列| 亚洲视频免费观看| 91久久中文| 国产精品另类一区| 国产精品高潮粉嫩av| 亚洲午夜羞羞片| 欧美成人四级电影| 午夜亚洲福利在线老司机| 亚洲欧洲在线视频| 国产一区二区三区网站| 欧美日韩亚洲一区二区三区四区 | 久久精品亚洲一区二区三区浴池| 亚洲精品日韩在线观看| 老司机免费视频久久| 欧美亚洲一区在线| 亚洲视频日本| 艳女tv在线观看国产一区| 在线观看日韩av先锋影音电影院| 国产精品免费在线| 欧美婷婷六月丁香综合色| 欧美激情aⅴ一区二区三区 | 1000精品久久久久久久久| 国产区日韩欧美| 国产精品久久久久久久久久久久 | 午夜一区不卡| 亚洲欧美成人一区二区三区| 一区二区三区蜜桃网| 亚洲精品资源| 91久久国产综合久久91精品网站| 久热精品视频在线免费观看| 久久精品人人做人人综合| 欧美伊人久久大香线蕉综合69| 亚洲欧美日韩直播| 亚洲伊人网站| 欧美亚洲视频在线观看| 性欧美8khd高清极品| 欧美一区2区三区4区公司二百| 午夜精品成人在线| 欧美亚洲视频| 久久视频一区二区| 免费久久99精品国产| 乱码第一页成人| 欧美成人蜜桃| 亚洲国产精品久久91精品| 亚洲精品乱码久久久久久蜜桃91 | 久久国产精品黑丝| 久久人人爽人人爽爽久久| 久久综合久久综合这里只有精品| 久久精品一区二区三区四区 | 欧美成人一区二免费视频软件| 欧美黄色aaaa| 国产精品豆花视频| 国产视频观看一区| 亚洲第一黄网| 在线午夜精品| 欧美中在线观看| 欧美国产91| 一区二区三区精密机械公司|