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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(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.¢% 閱讀(1556) 評論(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;
}
?;?

測試?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ā)送的包長度不足
????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在线| 亚洲一区二区精品| 亚洲永久精品大片| 久久精品国产清高在天天线| 久久人人精品| 欧美日韩国产首页| 国产精品入口夜色视频大尺度 | 欧美不卡视频一区| 欧美激情区在线播放| 国产精品黄页免费高清在线观看| 国产精品日韩欧美一区| 国产亚洲人成a一在线v站| 亚洲第一在线综合网站| 亚洲先锋成人| 欧美高清一区| 亚洲午夜免费福利视频| 久久婷婷国产综合国色天香| 欧美日韩黄色大片| 韩国亚洲精品| 亚洲自拍电影| 老司机午夜精品视频| 亚洲另类视频| 久久久久高清| 国产精品美女久久| 亚洲经典在线| 小处雏高清一区二区三区| 久久精品在这里| 欧美精品国产精品| 亚洲欧美国内爽妇网| 久久美女性网| 国产精品男女猛烈高潮激情 | 亚洲精品综合精品自拍| 亚洲欧美在线播放| 亚洲国产精品一区二区www在线 | 欧美日韩亚洲精品内裤| 精品动漫3d一区二区三区| 亚洲一区二区三区激情| 欧美激情1区2区3区| 欧美一区二区高清在线观看| 欧美日韩久久精品| 亚洲精品一区二区三区樱花| 久久精品人人爽| 亚洲视频一区二区| 欧美日韩国产成人精品| 亚洲高清在线观看一区| 久久久久久69| 欧美一区视频在线| 国产精品久久久久久久午夜 | 六月婷婷久久| 今天的高清视频免费播放成人 | 在线免费日韩片| 久久精品一本| 欧美一二三区精品| 国产欧美日本| 久久精品亚洲乱码伦伦中文| 制服丝袜亚洲播放| 国产精品二区二区三区| 亚洲视频成人| 亚洲理伦电影| 欧美日韩一区二区三区| 中文在线资源观看网站视频免费不卡| 亚洲国产精品成人精品| 欧美福利一区| 一本一道久久综合狠狠老精东影业 | 一区视频在线播放| 麻豆av一区二区三区| 久久免费的精品国产v∧| 很黄很黄激情成人| 免费在线看成人av| 欧美jizzhd精品欧美巨大免费| 亚洲激情av| 亚洲精品在线观看免费| 国产精品va在线播放| 欧美一区二区三区在线播放| 午夜一级在线看亚洲| 一本大道久久a久久精二百| 亚洲人成毛片在线播放女女| 欧美区一区二| 欧美亚洲三区| 久久精品视频免费| 亚洲精品在线电影| 亚洲一区二区三区在线看 | 亚洲国产成人一区| 欧美午夜精品电影| 久久天堂精品| 欧美日韩精品系列| 久久激情一区| 欧美黄色免费网站| 久久精品成人欧美大片古装| 欧美va天堂va视频va在线| 午夜精品久久久久| 美女主播精品视频一二三四| 亚洲免费在线视频| 久久深夜福利| 午夜电影亚洲| 欧美激情国产日韩| 久久久久久穴| 欧美午夜精品久久久久久久| 久久中文在线| 国产精品人人爽人人做我的可爱 | 亚洲免费视频中文字幕| 亚洲国产欧美一区二区三区丁香婷| 99精品视频免费| 亚洲高清视频在线| 午夜一级在线看亚洲| 亚洲一区影音先锋| 亚洲欧美日韩精品久久奇米色影视| 一区二区三区日韩| 亚洲视频 欧洲视频| 亚洲精品国产无天堂网2021| 欧美日韩在线第一页| 麻豆久久精品| 国产精品国产三级国产普通话蜜臀 | 日韩一级不卡| 久久久久综合网| 香蕉亚洲视频| 欧美日韩精品免费观看| 男人的天堂亚洲| 国产一区香蕉久久| 亚洲欧美日韩专区| 午夜精品久久久久久久久 | 亚洲精品一区二区三区婷婷月| 性做久久久久久免费观看欧美| 一区二区三区.www| 亚洲国产精品成人精品| 久久精品免费看| 欧美一区二区在线播放| 欧美性片在线观看| 日韩一级精品视频在线观看| 亚洲精品日韩欧美| 欧美劲爆第一页| 亚洲人成欧美中文字幕| 亚洲人线精品午夜| 欧美黄色大片网站| 亚洲美女视频网| 亚洲欧美成人一区二区三区| 欧美日韩麻豆| 亚洲婷婷综合久久一本伊一区| 亚洲尤物在线| 国产欧美日韩一区| 久久精品91久久香蕉加勒比| 鲁大师影院一区二区三区| 亚洲第一黄网| 欧美成人中文| 亚洲视频图片小说| 久久久高清一区二区三区| 精品91在线| 欧美极品aⅴ影院| 亚洲视频你懂的| 久久偷窥视频| 亚洲乱码视频| 国产精品普通话对白| 久久精品成人欧美大片古装| 欧美freesex交免费视频| 亚洲美女在线看| 国产精品视频久久一区| 久久久久国产一区二区三区| 亚洲欧洲综合另类| 亚洲欧美日本日韩| 亚洲成色777777女色窝| 欧美视频一区二区三区| 久久国内精品自在自线400部| 欧美寡妇偷汉性猛交| 亚洲综合不卡| 亚洲国产一区在线| 国产精品资源在线观看| 久久久一二三| 亚洲网站视频| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩视频在线一区| 国产一区二区三区自拍| 欧美另类高清视频在线| 久久成人综合视频| 在线综合亚洲欧美在线视频| 玖玖玖国产精品| 午夜精品久久| 日韩视频二区| 1000部精品久久久久久久久| 欧美性一区二区| 欧美大学生性色视频| 欧美一区二区私人影院日本| 99综合电影在线视频| 亚洲福利久久| 久久性色av| 久久精品国产77777蜜臀| 亚洲桃色在线一区| 亚洲精品乱码久久久久久黑人| 国产精品蜜臀在线观看| 久久精品国产精品亚洲综合| 亚洲国产欧美国产综合一区| 蜜桃av综合| 亚洲一区二区三区四区视频 | 欧美精品在线观看一区二区| 欧美亚洲一区二区在线| 国产日韩欧美一区二区三区在线观看 |