銆銆鏈嶅姟鍣ㄧ殑寮傚父澶勭悊鍖呮嫭鐨勫唴瀹歸潪甯稿箍娉涳紝鏈枃浠呭氨鍦ㄧ綉緇滃皝鍖呮柟闈㈠嚭鐜扮殑寮傚父浣滀竴璁ㄨ錛屽笇鏈涜兘瀵規(guī)浠庝簨鐩稿叧宸ヤ綔鐨勬湅鍙嬫湁鎵甯姪銆?/p>
鍏充簬緗戠粶灝佸寘鏂歸潰鐨勫紓甯革紝鎬諱綋鏉ヨ錛屽彲浠ュ垎涓轟袱澶х被錛氫竴鏄皝鍖呮牸寮忓嚭鐜板紓甯革紱浜屾槸灝佸寘鍐呭錛堝嵆灝佸寘鏁版嵁錛夊嚭鐜板紓甯搞傚湪灝佸寘鏍煎紡鐨勫紓甯稿鐞嗘柟闈紝鎴戜滑鍦ㄦ渶 搴曠鐨勭綉緇滄暟鎹寘鎺ユ敹妯″潡渚垮彲浠ュ姞浠ュ鐞嗐傝屽浜庡皝鍖呮暟鎹唴瀹瑰嚭鐜扮殑寮傚父錛屽彧鏈変緷闈犳父鎴忔湰韜殑閫昏緫鍘誨姞浠ュ垽瀹氬拰媯(gè)楠屻傛父鎴忛昏緫鏂歸潰鐨勫紓甯稿鐞嗭紝鏄殢姣忎釜娓? 鎴忕殑涓嶅悓鑰屼笉鍚岀殑錛屾墍浠ワ紝鏈枃闅忓悗鐨勫唴瀹瑰皢閲嶇偣闃愯堪鍦ㄧ綉緇滄暟鎹寘鎺ユ敹妯″潡涓殑寮傚父澶勭悊銆?/p>
銆銆涓烘柟渚夸互涓嬬殑璁ㄨ錛屽厛鏄庣‘涓や釜姒傚康錛堣繖涓や釜姒傚康鏄負(fù)浜?jiǎn)鍙櫂q版柟闈紝絎旇呰嚜琛屽彇鐨勶紝騫舵棤鏍囧噯鍙█錛夛細(xì)
銆銆1銆侀昏緫鍖咃細(xì)鎸囩殑鏄湪搴旂敤灞傛彁浜ょ殑鏁版嵁鍖咃紝涓涓畬鏁寸殑閫昏緫鍖呭彲浠ヨ〃紺轟竴涓‘鍒囩殑閫昏緫鎰忎箟銆傛瘮濡傜櫥褰曞寘錛屽畠閲岄潰灝卞彲浠ュ惈鏈夌敤鎴峰悕瀛楁鍜屽瘑鐮佸瓧孌點(diǎn)傚敖綆″畠鐪嬩笂鍘諱篃鏄竴孌電紦鍐插尯鏁版嵁錛屼絾榪欎釜緙撳啿鍖洪噷鐨勫悇涓尯闂存槸浠h〃涓瀹氱殑閫昏緫鎰忎箟鐨勩?br>銆銆2銆佺墿鐞嗗寘錛氭寚鐨勬槸浣跨敤recv(recvfrom)鎴杦sarecv(wsarecvfrom)浠庣綉緇滃簳灞傛帴鏀跺埌鐨勬暟鎹寘錛岃繖鏍鋒敹鍒扮殑涓涓暟鎹寘錛岃兘涓嶈兘琛ㄧず涓涓畬鏁寸殑閫昏緫鎰忎箟錛岃鍙栧喅浜庡畠鏄氳繃UDP綾葷殑“鏁版嵁鎶ュ崗璁?#8221;鍙戠殑鍖呰繕鏄氳繃TCP綾葷殑“嫻佸崗璁?#8221;鍙戠殑鍖呫?/p>
鎴戜滑鐭ラ亾錛孴CP鏄祦鍗忚錛?#8220;嫻佸崗璁?#8221;涓?#8220;鏁版嵁鎶ュ崗璁?#8221;鐨勪笉鍚岀偣鍦ㄤ簬錛?#8220;鏁版嵁鎶ュ崗璁?#8221;涓殑涓涓綉緇滃寘鏈韓灝辨槸涓涓畬鏁寸殑閫昏緫鍖咃紝涔熷氨鏄錛屽湪搴旂敤灞備嬌鐢? sendto鍙戦佷簡(jiǎn)涓涓昏緫鍖呬箣鍚庯紝鍦ㄦ帴鏀剁閫氳繃recvfrom鎺ユ敹鍒扮殑灝辨槸鍒氭墠浣跨敤sendto鍙戦佺殑閭d釜閫昏緫鍖咃紝榪欎釜鍖呬笉浼?xì)琚垎寮鍙戦侊紝涔熶笉浼?xì)涓庡? 瀹冪殑鍖呮斁鍦ㄤ竴璧峰彂閫併備絾瀵逛簬TCP鑰岃█錛孴CP浼?xì)鏍规嵁缃懢l滅姸鍐靛拰neagle綆楁硶錛屾垨鑰呭皢涓涓昏緫鍖呭崟鐙彂閫侊紝鎴栬呭皢涓涓昏緫鍖呭垎鎴愯嫢騫叉鍙戦侊紝鎴栬呬細(xì)灝? 鑻ュ共涓昏緫鍖呭悎鍦ㄤ竴璧峰彂閫佸嚭鍘匯傛鍥犱負(fù)TCP鍦ㄩ昏緫鍖呭鐞嗘柟闈㈢殑榪欑綺樺悎鎬э紝瑕佹眰鎴戜滑鍦ㄤ綔鍩轟簬TCP鐨勫簲鐢ㄦ椂錛屼竴鑸兘瑕佺紪鍐欑浉搴旂殑鎷煎寘銆佽В鍖呬唬鐮併?/p>
銆銆鍥犳錛屽熀浜嶵CP鐨勪笂灞傚簲鐢紝涓鑸兘瑕佸畾涔夎嚜宸辯殑鍖呮牸寮忋俆CP鐨勫皝鍖呭畾涔変腑錛岄櫎浜?jiǎn)鍏蜂綋鐨勬暟鎹唴瀹规墍浠h〃鐨勯昏緫鎰忎箟涔嬪錛岀涓姝ュ氨鏄紜畾浠ヤ綍縐嶆柟寮忚〃紺哄綋鍓嶅寘鐨勫紑濮嬪拰緇撴潫銆傞氬父鎯呭喌涓嬶紝琛ㄧず涓涓猅CP閫昏緫鍖呯殑寮濮嬪拰緇撴潫鏈変袱縐嶆柟寮忥細(xì)
銆銆1銆佷互鐗規(guī)畩鐨勫紑濮嬪拰緇撴潫鏍囧織琛ㄧず錛屾瘮濡侳F00琛ㄧず寮濮嬶紝00FF琛ㄧず緇撴潫銆?br>銆銆2銆佺洿鎺ヤ互鍖呴暱搴︽潵琛ㄧず銆傛瘮濡傚彲浠ョ敤絎竴涓瓧鑺傝〃紺哄寘鎬婚暱搴︼紝濡傛灉瑙夊緱榪欐牱鐨勮瘽鍖呮瘮杈冨皬錛屼篃鍙互鐢ㄤ袱涓瓧鑺傝〃紺哄寘闀垮害銆?/p>
銆銆涓嬮潰灝嗚緇欏嚭鐨勪唬鐮佹槸浠ョ2縐嶆柟寮忓畾涔夌殑鏁版嵁鍖咃紝鍖呴暱搴︿互姣忎釜灝佸寘鐨勫墠涓や釜瀛楄妭琛ㄧず銆傛垜灝嗙粨鍚堢潃浠g爜緇欏嚭鐩稿叧鐨勮В閲婂拰璇存槑銆?/p>
銆銆鍑芥暟涓敤鍒扮殑鍙橀噺璇存槑錛?/p>
銆銆CLIENT_BUFFER_SIZE錛氱紦鍐插尯鐨勯暱搴︼紝瀹氫箟涓猴細(xì)Const int CLIENT_BUFFER_SIZE=4096銆?br>銆銆m_ClientDataBuf錛氭暟鎹暣鐞嗙紦鍐插尯錛屾瘡嬈℃敹鍒扮殑鏁版嵁錛岄兘浼?xì)鍏堣澶嶅埗鍒皹q欎釜緙撳啿鍖虹殑鏈熬錛岀劧鍚庣敱涓嬮潰鐨勬暣鐞嗗嚱鏁板榪欎釜緙撳啿鍖鴻繘琛屾暣鐞嗐傚畠鐨勫畾涔夋槸錛歝har m_ClientDataBuf[2* CLIENT_BUFFER_SIZE]銆?br>銆銆m_DataBufByteCount錛氭暟鎹暣鐞嗙紦鍐插尯涓綋鍓嶅墿浣欑殑鏈暣鐞嗗瓧鑺傛暟銆?br>銆銆GetPacketLen(const char*)錛氬嚱鏁幫紝鍙互鏍規(guī)嵁浼犲叆鐨勭紦鍐插尯棣栧潃鎸夌収搴旂敤灞傚崗璁彇鍑哄綋鍓嶉昏緫鍖呯殑闀垮害銆?br>銆銆GetGamePacket(const char*, int)錛氬嚱鏁幫紝鍙互鏍規(guī)嵁浼犲叆鐨勭紦鍐插尯鐢熸垚鐩稿簲鐨勬父鎴忛昏緫鏁版嵁鍖呫?br>銆銆AddToExeList(PBaseGamePacket)錛氬嚱鏁幫紝灝嗘寚瀹氱殑娓告垙閫昏緫鏁版嵁鍖呭姞鍏ュ緟澶勭悊鐨勬父鎴忛昏緫鏁版嵁鍖呴槦鍒椾腑錛岀瓑寰呴昏緫澶勭悊綰跨▼瀵瑰叾榪涜澶勭悊銆?br>銆銆DATA_POS錛氭寚鐨勬槸闄や簡(jiǎn)鍖呴暱搴︺佸寘綾誨瀷絳夎繖浜涙爣蹇楀瀷瀛楁涔嬪錛岀湡姝g殑鏁版嵁鍖呭唴瀹圭殑璧峰浣嶇疆銆?/p>
Bool SplitFun(const char* pData,const int &len)
{
PBaseGamePacket pGamePacket=NULL;
__int64 startPos=0, prePos=0, i=0;
int packetLen=0;
銆//鍏堝皢鏈鏀跺埌鐨勬暟鎹鍒跺埌鏁寸悊緙撳啿鍖哄熬閮?br> startPos = m_DataBufByteCount;
memcpy( m_ClientDataBuf+startPos, pData, len );
m_DataBufByteCount += len;
//褰撴暣鐞嗙紦鍐插尯鍐呯殑瀛楄妭鏁板皯浜嶥ATA_POS瀛楄妭鏃訛紝鍙栦笉鍒伴暱搴︿俊鎭垯閫鍑?br>銆//娉ㄦ剰錛氶鍑烘椂騫朵笉緗甿_DataBufByteCount涓?
if (m_DataBufByteCount < DATA_POS+1)
return false;
//鏍規(guī)嵁姝e父閫昏緫錛屼笅闈㈢殑鎯呭喌涓嶅彲鑳藉嚭鐜幫紝涓虹ǔ濡ヨ搗瑙侊紝榪樻槸鍔犱笂
if (m_DataBufByteCount > 2*CLIENT_BUFFER_SIZE)
{
//璁劇疆m_DataBufByteCount涓?錛屾剰鍛崇潃涓㈠純緙撳啿鍖轟腑鐨勭幇鏈夋暟鎹?br> m_DataBufByteCount = 0;
銆銆//鍙互鑰冭檻寮鏀鵑敊璇牸寮忔暟鎹寘鐨勫鐞嗘帴鍙o紝澶勭悊閫昏緫浜ょ粰涓婂眰
銆銆//OnPacketError()
return false;
}
//榪樺師璧峰鎸囬拡
startPos = 0;
//鍙湁褰搈_ClientDataBuf涓殑瀛楄妭涓暟澶т簬鏈灝忓寘闀垮害鏃舵墠鑳芥墽琛屾璇彞
packetLen = GetPacketLen( pIOCPClient->m_ClientDataBuf );
//褰撻昏緫灞傜殑鍖呴暱搴︿笉鍚堟硶鏃訛紝鍒欑洿鎺ヤ涪寮冭鍖?br> if ((packetLen < DATA_POS+1) || (packetLen > 2*CLIENT_BUFFER_SIZE))
{
m_DataBufByteCount = 0;
銆銆//OnPacketError()
return false;
}
//淇濈暀鏁寸悊緙撳啿鍖虹殑鏈熬鎸囬拡
__int64 oldlen = m_DataBufByteCount;
while ((packetLen <= m_DataBufByteCount) && (m_DataBufByteCount>0))
{
//璋冪敤鎷煎寘閫昏緫錛岃幏鍙栬緙撳啿鍖烘暟鎹搴旂殑鏁版嵁鍖?br> pGamePacket = GetGamePacket(m_ClientDataBuf+startPos, packetLen);
if (pGamePacket!=NULL)
{
//灝嗘暟鎹寘鍔犲叆鎵ц闃熷垪
AddToExeList(pGamePacket);
}
pGamePacket = NULL;
銆銆//鏁寸悊緙撳啿鍖虹殑鍓╀綑瀛楄妭鏁板拰鏂伴昏緫鍖呯殑璧峰浣嶇疆榪涜璋冩暣
m_DataBufByteCount -= packetLen;
startPos += packetLen;
//孌嬬暀緙撳啿鍖虹殑瀛楄妭鏁板皯浜庝竴涓甯稿寘澶у皬鏃訛紝鍙悜鍓嶅鍒惰鍖呴殢鍚庨鍑?br> if (m_DataBufByteCount < DATA_POS+1)
{
for(i=startPos; i<startPos+m_DataBufByteCount; ++i)
m_ClientDataBuf[i-startPos] = m_ClientDataBuf[i];
return true;
}
packetLen = GetPacketLen(m_ClientDataBuf + startPos );
//褰撻昏緫灞傜殑鍖呴暱搴︿笉鍚堟硶鏃訛紝涓㈠純璇ュ寘鍙?qiáng)缂撳啿鍖轰互鍚庣殑鍖?br> if ((packetLen<DATA_POS+1) || (packetLen>2*CLIENT_BUFFER_SIZE))
{
m_DataBufByteCount = 0;
銆銆//OnPacketError()
return false;
}
if (startPos+packetLen>=oldlen)
{
for(i=startPos; i<startPos+m_DataBufByteCount; ++i)
m_ClientDataBuf[i-startPos] = m_ClientDataBuf[i];
return true;
}
}//鍙栨墍鏈夊畬鏁寸殑鍖?/p>
return true;
}
銆銆浠ヤ笂渚挎槸鏁版嵁鎺ユ敹妯″潡鐨勫鐞嗗嚱鏁幫紝涓嬮潰鏄嚑鐐圭畝瑕佽鏄庯細(xì)
銆銆1銆佺敤浜庢嫾鍖呮暣鐞嗙殑緙撳啿鍖?m_ClientDataBuf)搴旇姣攔ecv涓寚瀹氱殑鎺ユ敹緙撳啿鍖?pData)闀垮害(CLIENT_BUFFER_SIZE)瑕佸ぇ錛岄氬父鍓嶈呮槸鍚庤呯殑2鍊?2*CLIENT_BUFFER_SIZE)鎴栨洿澶с?br>
銆銆2銆佷負(fù)閬垮厤鍥犱負(fù)鍓╀綑鏁版嵁鍓嶇Щ鑰屽鑷寸殑棰濆寮閿錛屽緩璁甿_ClientDataBuf浣跨敤鐜艦緙撳啿鍖哄疄鐜般?br>
3銆佷負(fù)浜?jiǎn)閬垮厤鍑虹幇鏃犳硶鎷艰鐨勫寘锛屾垜浠U﹀畾姣忔鍙戦佺殑閫昏緫鍖咃紝鍏跺崟涓昏緫鍖呮渶澶ч暱搴︿笉鍙互瓚呰繃CLIENT_BUFFER_SIZE鐨?鍊嶃傚洜涓烘垜浠殑鏁?
鐞嗙紦鍐插尯鍙湁2*CLIENT_BUFFER_SIZE榪欎箞闀匡紝鏇撮暱鐨勬暟鎹紝鎴戜滑灝嗘棤娉曟暣鐞嗐傝繖灝辮姹傚湪鍗忚鐨勮璁′笂浠ュ強(qiáng)鏈緇堢殑鍙戦佸嚱鏁扮殑澶勭悊涓婅鍔犱笂榪?
鏍風(fēng)殑寮傚父澶勭悊鏈哄埗銆?/p>
銆銆4銆佸浜庢暟鎹寘榪囩煭鎴栬繃闀跨殑鍖咃紝鎴戜滑閫氬父鐨勬儏鍐墊槸緗甿_DataBufByteCount涓?錛屽嵆鑸嶅純褰撳墠
鍖呯殑澶勭悊銆傚鏋滄澶勪笉璁劇疆m_DataBufByteCount涓?涔熷彲錛屼絾璇ュ鎴風(fēng)鍙鍙戜簡(jiǎn)涓嬈℃牸寮忛敊璇殑鍖咃紝鍒欏叾鍚庣戶鍙戣繃鏉ョ殑鍖呭垯涔熷皢榪炲甫鐫浜х敓鏍煎紡
閿欒錛屽鏋滆緗甿_DataBufByteCount涓?錛屽垯鍙互姣旇緝濂界殑閬垮厤鍚庣戶鐨勫寘鍙楁鍖呯殑鏍煎紡閿欒褰卞搷銆傛洿濂界殑浣滄硶鏄紝鍦ㄦ澶勫紑鏀句竴涓皝鍖呮牸寮忓紓甯?
鐨勫鐞嗘帴鍙?OnPacketError)錛岀敱涓婂眰閫昏緫鍐沖畾瀵硅繖縐嶅紓甯稿浣曞緗傛瘮濡備笂灞傞昏緫鍙互瀵瑰皝鍖呮牸寮忔柟闈㈠嚭鐜扮殑寮傚父榪涜璁℃暟錛屽鏋滈敊璇殑嬈℃暟瓚呰繃
涓瀹氱殑鍊鹼紝鍒欏彲浠ユ柇寮璇ュ鎴風(fēng)鐨勮繛鎺ャ?/p>
5銆佸緩璁笉瑕佸湪recv鎴杦sarecv鐨勫嚱鏁板悗錛屽氨绱ф帴鐫浣滀互涓婄殑澶勭悊銆傚綋recv鏀跺埌涓孌墊暟
鎹悗錛岀敓鎴愪竴涓粨鏋勪綋鎴栧璞?瀹冧富瑕佸惈鏈塪ata鍜宭en涓や釜鍐呭錛屽墠鑰呮槸鏁版嵁緙撳啿鍖猴紝鍚庤呮槸鏁版嵁闀垮害)錛屽皢榪欐牱鐨勪竴涓粨鏋勪綋鎴栧璞℃斁鍒頒竴涓槦鍒椾腑鐢卞悗闈?
鐨勭嚎紼嬪鍏朵嬌鐢⊿plitFun鍑芥暟榪涜鏁寸悊銆傝繖鏍鳳紝鍙互鏈澶ч檺搴﹀湴鎻愰珮緗戠粶鏁版嵁鐨勬帴鏀墮熷害錛屼笉鑷沖洜涓烘暟鎹暣鐞嗙殑鍘熷洜鑰屽湪姝ゅ嫻垂鏃墮棿銆?img src ="http://www.tkk7.com/kuxiaoku/aggbug/109154.html" width = "1" height = "1" />