锘??xml version="1.0" encoding="utf-8" standalone="yes"?> MMO涓殑鑱婂ぉ鏈嶅姟涓昏鍔熻兘灝辨槸鍋氬鎴風涔嬮棿鐨勮亰澶╁唴瀹硅漿鍙戙備絾鏄亰澶╃殑褰㈠紡鏈夊緢澶氾紝渚嬪縐佽亰銆佸悓鍦烘櫙鑱娿侀槦浼嶅唴鑱娿佸伐浼氬唴鑱娿佸叏鏈嶅姟鍣ㄨ亰銆佺敋鑷充復 鏃剁粍寤烘埧闂磋亰銆傝繖浜涢昏緫鍔熻兘鍏跺疄閮芥槸鍙互鍋氬湪閫昏緫鏈嶅姟鍣ㄤ笂鐨勶紝鏈澶氭敼鏀逛笘鐣屾湇鍔″櫒錛屼絾鏄繖鏍峰畬鎴愬姛鑳界殑璇濓紝涓嶅厤灝嗚亰澶╂湰韜殑閫昏緫涓庢父鎴忛昏緫鍏寵仈璧鋒潵銆傛垜浠?甯屾湜鍋氬緱鏇翠笂涓灞傦紝灝嗚亰澶╂湇鍔℃湰韜劚紱誨紑鏉ャ備絾鏄嫭绔嬭亰澶╂湇鍔¤繕涓嶅錛屽洜涓哄氨綆楃嫭绔嬪嚭鏉ヤ簡錛屼篃鏈夊彲鑳藉湪瀹炵幇涓婁笌鍏蜂綋鐨勬父鎴忛昏緫鐩稿叧鑱斻傛墍浠ワ紝鎴戜滑鍋氫簡榪涗竴 姝ョ殑鎶借薄錛屾兂瀹炵幇涓涓洿涓洪氱敤鐨勮亰澶╂湇鍔″櫒銆?/p>
鑱婂ぉ榪欎釜榪囩▼錛屾垜浠皢鍏舵娊璞′負瀹炰綋(entity)涓庡疄浣撻棿鐨勫璇濄傝繖涓疄浣撴蹇靛叾瀹炲緢瀹芥硾銆備換浣曞彲鎺ユ敹鑱婂ぉ娑堟伅鐨勯兘綆楀仛瀹炰綋錛屼緥濡傚崟涓帺瀹躲佷竴涓?鍦烘櫙銆佷竴涓槦浼嶃佷竴涓埧闂淬佷竴涓伐浼氥佺敋鑷蟲暣涓湇鍔″櫒銆傝繖涓濇兂鍏跺疄灝辨槸鏀寔鏁翠釜鑱婂ぉ鏈嶅姟鍣ㄨ璁$殑鏈鏍規湰鎬濇兂銆傛渶寮濮嬶紝鎴戝皢鑱婂ぉ鏈嶅姟鍣ㄥ垎涓轟釜浣撳拰緇勪袱涓 蹇碉紝鍏跺疄榪欎釜鎶借薄紼嬪害閮藉お浣庯紝騫朵笖浼氬鑷村疄鐜頒笂鐨勫鏉傘傜浉鍙嶏紝灝嗘暣涓郴緇熷畬鍏ㄤ嬌鐢ㄥ疄浣撹繖涓蹇墊潵緇勮錛屽氨綆鍗曞緢澶氥傚綋鐒訛紝瀹炰綋鏄湁寰堝縐嶇被鐨勶紝鍦ㄥ鐞嗘帴鏀?鑱婂ぉ娑堟伅榪欎釜鍔ㄤ綔鏃訛紝鍏跺鐞嗘柟寮忓氨涓嶅悓銆備緥濡傚崟涓帺瀹跺疄浣撲粎鍋氭秷鎭殑鍙戦侊紝鍦烘櫙瀹炰綋鍒欐槸灝嗘秷鎭彂緇欏満鏅唴鐨勬墍鏈夌帺瀹訛紝闃熶紞瀹炰綋灝辨槸灝嗘秷鎭彂緇欓槦浼嶅唴鐨勬墍鏈?鐜╁銆備粠榪欎竴鐐規潵鐪嬶紝鎴戜滑鐨勫疄浣撶綾誨叾瀹炲茍涓嶅錛屽洜涓哄満鏅侀槦浼嶈繖浜涳紝閮芥槸緇勫疄浣?group entity)銆傜敤C++鏉ユ弿榪幫細 瀹為檯涓婏紝闄や簡杞彂鑱婂ぉ鍐呭澶?Entity::Send)錛屽疄浣撹繕鏈夊緢澶氬叾浠栬涓猴紝渚嬪鏈璧風爜鐨勶紝鍒涘緩緇勫疄浣擄紝寰緇勫疄浣撻噷娣誨姞鎴愬憳絳夈傚湪璁捐涓婏紝緇?瀹炰綋鐨勫垱寤虹敱閫昏緫鏈嶅姟鍣ㄦ垨鑰呭叾浠栨湇鍔″櫒鏉ュ畬鎴愶紝鐩墠娓告垙瀹㈡埛绔槸娌℃湁鍒涘緩緇勫疄浣撶殑鏉冮檺鐨勶紙瀹炵幇涓婃垜浠繕涓哄疄浣撴坊鍔犱簡鏉冮檺楠岃瘉鏈哄埗錛夈傚湪緗戠粶鎷撴墤涓婏紝鑱婂ぉ鏈?鍔″櫒濮嬬粓鏄綔涓烘湇鍔″櫒瑙掕壊錛岃屽畠鐨勫鎴風鍒欏寘鎷父鎴忓鎴風銆侀昏緫鏈嶅姟鍣ㄣ佺敋鑷沖叾浠栨湇鍔″櫒錛岃繖鏍瘋亰澶╂湇鍔″櫒鍦ㄦ彁渚涗簡鍥哄畾鐨勫崗璁悗錛屽畠灝辨槸瀹屽叏鐙珛鐨勶紝涓嶄緷璧?浠諱綍鍏朵粬緇勪歡錛?/p>
(CS: Chat Server, GC: Game Client, GS: Game Server) 鍩轟簬姝わ紝鎴戜滑鎵╁厖浜咵ntity鐨勭被浣撶郴錛?/p>
鑱婂ぉ鏈嶅姟鍣ㄧ殑鏍稿績瀹炵幇錛屽叾瀹炲氨鏄拡瀵逛互涓婂疄浣撳仛鎿嶄綔銆傚洜姝わ紝鑱婂ぉ鏈嶅姟鍣ㄧ殑娑堟伅鍗忚鏂歸潰錛屼篃涓昏鏄拡瀵硅繖浜涘疄浣撶殑鎿嶄綔錛屽寘鎷細 鍒涘緩 瀹炰綋鐨勫垱寤哄緢綆鍗曪紝涓嶅悓鐨勫疄浣撳叾鍒涘緩鎵闇鐨勫弬鏁伴兘涓嶄竴鏍楓備緥濡傚鎴風瀹炰綋鍒涘緩鏃墮渶瑕佷紶鍏ヤ竴涓昏緫鏈嶅姟鍣ㄥ疄浣撶殑ID錛岀粍瀹炰綋鐨勫垱寤哄彲浠ユ惡甯︾粍鎴愬憳瀹炰綋鍒楄〃銆?涓轟簡澶勭悊鏉冮檺鍜屽畨鍏ㄩ棶棰橈紝鍦ㄥ叿浣撳疄鐜頒笂錛岄昏緫鏈嶅姟鍣ㄥ疄浣撶殑鍒涘緩鏄敱鑱婂ぉ鏈嶅姟鍣ㄦ湰鍦扮殑閰嶇疆鍐沖畾錛屽嵆鑱婂ぉ鏈嶅姟鍣ㄥ惎鍔ㄥ垯鏍規嵁閰嶇疆鍒涘緩濂介昏緫鏈嶅姟鍣ㄥ疄浣擄紱瀹㈡埛绔疄 浣撴槸褰撹鑹茶繘鍏ラ昏緫鏈嶅姟鍣ㄥ悗錛岀敱鏈嶅姟鍣ㄥ垱寤猴紝瀹㈡埛绔棤娉曞垱寤哄疄浣撱?/p>
鍒犻櫎 瀹炰綋鐨勫垹闄や負浜嗗鐞嗘柟渚匡紝綰﹀畾鍒犻櫎璇鋒眰蹇呴』鐢卞疄浣撶殑鍒涘緩鑰呭彂璧楓傚洜涓轟粠閫昏緫涓婂皢錛屾煇涓ā鍧楀鏋滃彲浠ュ垱寤轟竴涓疄浣擄紝閭d箞鍏跺繀鐒剁煡閬撲粈涔堟椂鍊欒鍒犻櫎榪欎釜瀹炰綋銆?/p>
淇敼 淇敼鎸囩殑鏄慨鏀瑰疄浣撳唴閮ㄥ疄鐜扮殑涓浜涘睘鎬э紝渚嬪緇勫疄浣撲慨鏀瑰叾緇勬垚鍛樸傝繖涓搷浣滄槸闈炲父閲嶈鐨勩傚浜?code>SockEntity鑰?璦錛屼慨鏀規剰鍛崇潃淇敼鍏惰繛鎺ョ姸鎬侊紝渚嬪褰撻昏緫鏈嶅姟鍣ㄥ湪鑱婂ぉ鏈嶅姟鍣ㄤ笂鍒涘緩浜嗗鎴風瀹炰綋鍚庯紝瀹為檯涓婃鏃跺鎴風騫舵病鏈夊湪緗戠粶鏂歸潰榪炴帴鑱婂ぉ鏈嶅姟鍣紝姝ゆ椂榪欎釜 鏁翠釜緋葷粺瀹炵幇涓嬫潵錛屽疄闄呬笂鏄潪甯哥畝鍗曠殑錛屼唬鐮侀噺涔熷緢灝戙傚綋鐒惰繕鏈夊緢澶氱粏鑺傞棶棰橈紝渚嬪鑱婂ぉ淇℃伅涓惡甯︾墿鍝佷俊鎭紝榪欐秹鍙婂埌寮傛棰勫鐞嗚亰澶╁唴瀹癸紝榪欓噷灝變笉 鏂逛究緇嗚浜嗐?/p>
鍘熸枃鍦板潃錛?http://codemacro.com/2012/08/29/mmo-chat-server/璁捐瀹炵幇
瀹炰綋璁捐
public:
// send text to this entity
virtual bool Send(Entity *sender, const std::string &text) = 0;
protected:
GUID m_id;
int m_type;
};
class SockEntity : pubilc Entity {
public:
virtual bool Send(Entity *sender, const std::string &text) {
// find the map socket and send text to the socket
long socket = FindSocket(this);
Message msg(MSG_CS2E_SENDTEXT);
msg.Add(sender->ID());
msg.Add(text);
msg.SendToSocket(socket);
return true;
}
};
class GroupEntity : public Entity {
public:
virtual bool Send(Entity *sender, const std::string &text) {
for (std::list<Entity*>::const_iterator it = m_mems.begin(); it != m_mems.end(); ++it) {
(*it)->Send(sender, text);
}
return true;
}
private:
std::list<Entity*> m_mems;
};
SockEntity鐢ㄤ簬琛ㄧず鐗╃悊涓婅亰澶╂湇鍔″櫒鐨勫鎴風錛屼緥濡傛父鎴忓鎴風銆?/p>
緗戠粶鎷撴墤
/ | \
/ | \
/ | \
GC GC GS
private:
GUID m_gsEntity; // 鏍囩ず璇ュ鎴風瀹炰綋浣嶄簬鍝釜閫昏緫鏈嶅姟鍣ㄥ疄浣撲笂
};
class GSEntity : public SockEntity {
};娑堟伅鍗忚
Entity瀹?闄呬笂鏄笉鍙敤鐨勶紝鍥犱負瀹冩棤娉曠敤浜庡彂閫佹秷鎭傝繖涓椂鍊欐垜浠爣蹇楄瀹炰綋鐨勭姸鎬佷負闈炶繛鎺ョ姸鎬併傚綋瀹㈡埛绔富鍔ㄨ繛鎺ヤ笂鑱婂ぉ鏈嶅姟鍣ㄥ悗錛屽鎴風灝變富鍔ㄥ彂璧蜂慨鏀硅嚜宸卞搴旂殑 瀹㈡埛绔疄浣撹姹傦紝璇ヨ姹傚皢鑷繁鐨勭姸鎬佷慨鏀逛負榪炴帴鐘舵併傚綋瀹㈡埛绔叧闂椂錛岃亰澶╂湇鍔″櫒緗戠粶灞傛帴鏀跺埌榪炴帴鏂紑閫氱煡錛岃閫氱煡鑲畾鏄棭浜庨昏緫鏈嶅姟鍣ㄥ彂鏉ョ殑鍒犻櫎瀹炰綋閫?鐭ョ殑錛屾鏃跺皢璇ュ鎴風瀹炰綋鐘舵佷慨鏀逛負鏂紑鐘舵侊紝騫跺湪鎺ユ敹鍒伴昏緫鏈嶅姟鍣ㄥ垹闄ゅ疄浣撻氱煡鏃跺皢鍏剁湡姝e垹闄ゃ傝繖閲屽睍紺虹殑榪欑鐘舵佷慨鏀圭瓥鐣ワ紝瀹為檯涓婂湪鏁翠釜緋葷粺涓槸闈炲父 閲嶈鐨勩傚畠鐢ㄤ簬鎸囧緗戠粶榪炴帴鍜屼笂灞傞昏緫涔嬮棿鐨勫叧緋伙紝鍥犱負鏁翠釜鑱婂ぉ緋葷粺涓紝鍚勪釜榪涚▼鐨勭姸鎬佹槸涓嶅彲棰勬枡鐨勶紙闅忔椂鍙兘瀹曟帀錛夛紝褰撴煇涓繘紼嬪挨鍏舵槸閫昏緫鏈嶅姟鍣ㄥ畷鎺?鍚庯紝鑱婂ぉ鏈嶅姟鍣ㄦ槸寰椾笉鍒頒換浣曟甯擱昏緫閫氱煡鐨勶紝瀹冨彧鑳藉緱鍒扮綉緇滆繛鎺ョ殑閫氱煡銆?/p>
鎬葷粨
written by Kevin Lynx posted at http://codemacro.com
涓婁竴綃囪皥浜嗕竴浜涘叧閿妧鏈殑瀹炵幇鏂規銆傛湰綃囨弿榪頒竴浜涢亣鍒扮殑闂銆?/p>
鍦ㄧ瓥鍒掑埗浣滃畬浜嗗嚑涓亴涓氬悗錛堜富瑕佹槸鎶鑳藉埗浣滐級錛屽ぇ姒傚幓騫村勾搴曞叕鍙稿唴閮ㄨ繘琛屼簡涓嬈℃販鎴樻祴璇曘?0涓鑹插湪涓涓満鏅繘琛屾販鎴橈紝嫻嬭瘯緇撴灉浠庢妧鏈笂鏉ヨ闈炲父涓嶇悊鎯熾傞鍏堟槸瀹㈡埛绔拰鏈嶅姟鍣ㄩ兘宸ㄥ崱鏃犳瘮銆傛湇鍔″櫒CPU涓鐩存槸婊¤礋杞界姸鎬併傝屽鎴風鍙堥綣佸畷鏈恒?/p>
鎴戜滑鍏蟲敞鐨勪富瑕侀棶棰橈紝鏄湇鍔″櫒CPU婊¤礋杞介棶棰樸傛渶寮濮嬶紝鎴戦氳繃鏃ュ織鍒濇瀹氫綅涓虹綉緇滄ā鍧楅棶棰橈紝鍥犱負閫昏緫綰跨▼琛ㄧ幇涓嶆槸閭d箞宸傜劧鍚庤冭檻鍒版妧鑳借繃紼嬩腑鐨勭壒鏁堛佸姩浣滈兘鏄氳繃鏈嶅姟鍣ㄦ秷鎭┍鍔紝騫朵笖鏈韓鐗規晥鍜屽姩浣滃氨姣斾竴鑸綉娓稿鏉傦紝閫氳繃閫愪竴灞忚斀榪欎竴閮ㄥ垎鍔熻兘錛屾渶緇堢‘璁ょ‘涓虹綉緇滄ā鍧楀鑷淬傜劧鍚庡洟闃熷喅瀹氫粠涓ゆ柟闈㈠姫鍔涳細閲嶅啓緗戠粶妯″潡錛屾敼鍠勬ц兘錛涙敼鍠勬妧鑳藉疄鐜版満鍒訛紝灝嗚〃鐜扮被閫昏緫縐誨埌瀹㈡埛绔?/p>
鑷充簬緗戠粶妯″潡錛屽湪鍚庢潵鎵嶅彂鐜幫紝铏界劧緗戠粶嫻侀噺榪囬珮錛屼絾瀵艱嚧緗戠粶綰跨▼CPU婊$殑鍘熷洜绔熺劧鏄綉緇滄ā鍧楄嚜韜殑嫻侀噺闄愬埗瀵艱嚧銆傝屾妧鑳藉疄鐜版満鍒剁殑鏀瑰杽錛岃冭檻鍒版敼鍔ㄧ殑鎴愭湰錛屾渶緇堜嬌鐢ㄤ簡涓縐峈PC鏈哄埗錛岃鏈嶅姟鍣ㄨ剼鏈彲浠ヨ皟鐢ㄥ鎴風鑴氭湰錛屽茍涓旀敮鎸佷紶鍏ュ鏉傚弬鏁般傜劧鍚庣瓥鍒掗氳繃涓浜涘叧閿暟鎹湪瀹㈡埛绔綆楀嚭鐗規晥銆佸姩浣滀箣綾匯?/p>
姝ゅ錛岀▼搴忓皢鏇村鐨勬妧鑳藉睘鎬у箍鎾粰瀹㈡埛绔紝涓涓鎴風涓婁繚瀛樹簡鍛ㄥ洿瑙掕壊鐨勬妧鑳芥暟鎹紝浠庤屽彲浠ヨ繘琛屾洿澶氱殑瀹㈡埛绔昏緫銆傝繖涓鍧楀叿浣撶殑淇敼褰撶劧榪樻槸絳栧垝鍦ㄥ仛錛堟垜浠殑鑴氭湰絳栧垝鍩烘湰灝辨槸鍗婁釜紼嬪簭鍛橈級銆傚悗緇忔祴璇曪紝鏁堟灉鏀瑰杽鏄捐憲銆?/p>
鍦ㄧ瓥鍒掑埗浣滀簡涓涓狿VP绔炴妧鍓湰鍚庯紝鏈嶅姟鍣ㄥ湪10V10嫻嬭瘯榪囩▼涓張琛ㄧ幇鍑篊PU璐熻澆杈冮珮鐨勬儏鍐點傝繖涓棶棰樺埌鐩墠涓烘渚濈劧瀛樺湪錛屽彧涓嶈繃鎯呭喌鐣ュ井涓嶅悓銆?/p>
棣栧厛鏄Е鍙戝櫒鐢熷懡鍛ㄦ湡鐨勯棶棰樸傝Е鍙戝櫒鑷韓鍖呭惈鏈澶цЕ鍙戞鏁般佸瓨鐣欐椂闂寸瓑闇姹傦紝鍗沖綋瑙﹀彂涓瀹氭鏁幫紝鎴栬秴榪囧瓨鐣欐椂闂村悗錛岄渶瑕佺敱紼嬪簭鑷姩鍒犻櫎錛涘彟涓鏂歸潰錛岃Е鍙戝櫒鍙互鏄畾鏃跺櫒綾誨瀷錛岃屽畾鏃跺櫒涔熷喅瀹氫簡瑙﹀彂鍣ㄧ殑鐢熷懡鍛ㄦ湡銆傝繖涓鍧椾唬鐮佸啓鐨勯潪甯哥碂緋曪紝澶ф灝辨槸綆$悊鑱岃矗鍒掑垎涓嶆竻錛屽鑷村嚭鐜板璞¤嚜宸卞垹闄よ嚜宸憋紝鑰屽垹闄ゅ悗榪樺湪渚濊禆鑷繁鍋氶昏緫銆?/p>
浣嗚繖鏍風殑閫昏緫錛屾渶澶氬氨鏄鑷撮噹鎸囬拡鐨勫嚭鐜般備笉榪囷紝榪欑娣蜂貢鐨勪唬鐮侊紝涔熸洿瀹規槗瀵艱嚧BUG銆備緥濡傦紝鍦ㄦ煇縐嶆儏鍐典笅瑙﹀彂鍣ㄥ緱涓嶅埌鑷姩鍒犻櫎浜嗐備絾榪欎釜BUG騫朵笉鏄洿鎺ユ毚闇茬殑錛岀洿鎺ユ毚闇茬殑錛屾槸CPU婊′簡銆傛垜浠殑鎬墿AI鍦ㄨ剼鏈腑鏄氳繃瀹氭椂鍣ㄧ被瑙﹀彂鍣ㄩ┍鍔ㄧ殑錛屾瘡嬈I甯у畬浜嗗悗灝辨敞鍐屼竴涓Е鍙戝櫒錛屼互椹卞姩涓嬩竴嬈I甯с傜敱浜庤繖涓狟UG瀵艱嚧瑙﹀彂鍣ㄦ病鏈夎鍒犻櫎錛屼粠鑰屽鑷存湇鍔″櫒涓婅Е鍙戝櫒鐨勬暟閲忔ュ墽澧炲姞銆備絾錛岃繖涔熷氨瀵艱嚧鍐呭瓨澧為暱鍚э紵
鍙︿竴涓閥鍚堢殑鍘熷洜鍦ㄤ簬錛屽湪褰撴椂鐨勭増鏈腑錛岃Е鍙戝櫒鏄繚瀛樹竴涓〃閲岀殑錛屽嵆瀹氭椂鍣ㄧ被瑙﹀彂鍣ㄣ佸睘鎬х被瑙﹀彂鍣ㄣ佺Щ鍔ㄧ被瑙﹀彂鍣ㄧ瓑閮藉湪涓涓〃閲屻傛瘡嬈′換鎰忚Е鍙戝櫒浜嬩歡鍙戠敓鏃訛紝渚嬪灞炴ф敼鍙橈紝閮戒細閬嶅巻榪欎釜琛紝媯鏌ュ叾鏄惁瑙﹀彂銆?/p>
鍩轟簬浠ヤ笂鍘熷洜錛屾偛鍓у氨鍙戠敓浜嗐傚湪榪欎釜鎬墿鐨凙I鑴氭湰閲岋紝鏈夎浠g爜璁劇疆浜嗘墿鐨勫睘鎬с傝繖浼氬鑷寸▼搴忛亶鍘嗚鎬墿鐨勬墍鏈夎Е鍙戝櫒銆傝岃繖涓墿鐨勮Е鍙戝櫒鏁伴噺涓鐩村湪澧為暱銆傜劧鍚庡氨鍑虹幇浜嗗湪寰堝娓告垙甯ч噷鍑虹幇榪囬暱鐨勯亶鍘嗘搷浣滐紝CPU灝變笂鍘諱簡銆?/p>
鎵懼埌榪欎釜闂浜嗗嚑涔庤姳浜嗘垜涓澶╃殑鏃墮棿銆傚洜涓鴻剼鏈唬鐮佷笉鏄垜鍐欑殑錛岃Е鍙戝櫒鐨勬渶鍒濈増鏈篃涓嶆槸鎴戝啓鐨勩傞氳繃閫愪竴鎺掗櫎鍙兘鐨勪唬鐮侊紝鏈緇堢珶鐒跺彂鐜版槸涓琛屾涓嶈搗鐪肩殑灞炴ф敼鍙樺鑷淬傝繖涓棶棰樼殑鏌ユ壘嫻佺▼錛屽弽鏄犱簡灝嗗ぇ閲忛昏緫鏀懼湪鑴氭湰涓殑涓嶄究涔嬪錛氭煡璧烽棶棰樻潵瀹炲湪鍚冨姏涓嶈濂姐?/p>
淇浜嗚繖涓狟UG鍚庯紝鎴戝張瀵硅Е鍙戝櫒綆$悊鍋氫簡綆鍗曠殑浼樺寲銆傚皢瑙﹀彂鍣ㄥ垪琛ㄦ敼鎴愪簩綰ц〃錛屽皢瑙﹀彂鍣ㄦ寜鐓х被鍨嬩繚瀛樻垚鍑犱釜鍒楄〃銆傛瘡嬈¤Е鍙戜簨浠舵椂錛屾壘鍑哄搴旂被鍨嬬殑琛ㄩ亶鍘嗐?/p>
闄や簡淇敼瑙﹀彂鍣ㄧ殑緇存姢鏁版嵁緇撴瀯澶栵紝紼嬪簭榪樺疄鐜頒簡涓濂楁ц兘緇熻鏈哄埗錛屽ぇ姒傚氨鏄粺璁℃煇涓嚱鏁板湪涓孌墊椂闂村唴鐨勬墽琛屾椂闂存儏鍐點傛渶鍒濊繖濂楁満鍒朵粎鐢ㄤ簬紼嬪簭錛屼絾鑰冭檻鍒拌剼鏈唬鐮佸湪鏁翠釜欏圭洰涓殑姣斾緥錛屽張鍐沖畾灝嗗叾搴旂敤鍒拌剼鏈腑銆?/p>
榪欎釜緇熻闇瑕佸湪鍑芥暟榪涘叆閫鍑烘椂鍋氫竴浜涗簨鎯咃紝C++涓彲浠ラ氳繃綾誨璞$殑鏋勫緩鍜屾瀽鏋勫畬鎴愶紝浣唋ua涓病鏈夌被浼兼満鍒躲傛渶鍒濓紝鎴戜嬌鐢ㄤ簡lua鐨勮皟璇曞簱鏉ユ崟鑾峰嚱鏁拌繘鍏?閫鍑轟簨浠訛紝浣嗗悗鏉ュ張瀹蟲曡繖縐嶆柟寮忔湰韜瓨鍦ㄦ晥鐜囨秷鑰楋紝灝卞彇娑堜簡銆傛垜浠嬌鐢╨ua鐨勬柟寮忥紝涓嶄粎浠呮槸鍏ㄥ眬鍑芥暟錛岃繕鍖呮嫭鍑芥暟瀵硅薄銆傝屽嚱鏁板璞℃槸娌℃湁鍚嶅瓧鏍囩ず鐨勶紝榪欏浜庢棩蹇楄褰曚笉鏄粈涔堝ソ浜嬨備負浜嗚В鍐寵繖涓棶棰橈紝鎴戝彧濂藉閮ㄥ垎鍔熻兘鍋氫簡灝佽錛屽茍璁╃瓥鍒掓樉紺哄~鍏ュ嚱鏁板浜庣殑瀛楃涓叉爣紺恒?/p>
闄ゆ涔嬪錛屽洜涓鴻Е鍙戝櫒鏄竴縐嶉噸瑕佺殑鏁忔劅璧勬簮錛屾垜鍙堝姞鍏ヤ簡涓涓笓闂ㄧ殑瑙﹀彂鍣ㄧ粺璁℃ā鍧楋紝鍒嗗埆緇熻瑙﹀彂鍣ㄧ殑綾誨瀷鏁伴噺銆佹父鎴忓璞℃嫢鏈夌殑瑙﹀彂鍣ㄦ暟閲忕瓑銆?/p>
鍒扮洰鍓嶄負姝紝瀵艱嚧鏈嶅姟鍣–PU璐熻澆榪囬珮錛屼竴鑸兘鏄敱BUG瀵艱嚧銆傝繖浜汢UG閫氬父浼氶犳垚涓涓繃闀跨殑鍒楄〃錛岀劧鍚庢湁閽堝榪欎釜鍒楄〃鐨勯亶鍘嗘搷浣滐紝浠庤屽鑷碈PU璐熻澆榪囬珮銆傛洿閲嶈鐨勶紝鎴戜滑浣跨敤浜嗚繖涔堝鐨勮剼鏈幓寮鍙戣繖涓父鎴忥紝濡備綍鎵懼埌涓涓洿鏈夋晥鍚堢悊鐨勭洃嫻嬫柟娉曪紝濡備綍璁╃▼搴忔鏋舵洿紼沖畾錛屽垯鏄帴涓嬫潵鏇村洶闅捐屽張蹇呴』鍘婚潰瀵圭殑浜嬫儏銆?/p>
鎴戜滑鐨勯昏緫鏈嶅姟鍣?Game Server錛屼互涓嬬畝縐癎S)涓昏閫昏緫澶ф鏄粠鍘誨勾澶忓ぉ寮濮嬪啓鐨勩傚洜涓哄緢澶氬熀紜妯″潡錛屽寘鎷暣浣撶粨鏋勬部鐢ㄤ簡涓婁釜欏圭洰鐨勪唬鐮侊紝鎵浠ョ畻涓嶄笂浠庡ご寮濮嬪仛銆傝漿鐪煎張蹇竴騫達紝鎴戣寰楀洖澶存葷粨涓嬪浜庣粡楠岀殑縐瘡澶湁蹇呰銆?/p>
GS鐨勬灦鏋勫緢澶х▼搴﹀彇鍐充簬娓告垙鐨勫姛鑳介渶姹傦紝褰撶劧鏇村彈闄愪簬涓婁釜欏圭洰鐨勫熀紜鏋舵瀯銆傚熀紜鏋舵瀯鍖呮嫭鍦烘櫙銆佸璞$殑鍏崇郴綆$悊錛屾秷鎭箍鎾瓑銆?/p>
榪欎竴鍥烇紝紼嬪簭鍛樺叾瀹炲凡緇忎笉闇瑕佸お榪囧叧蹇冮渶姹傘傚洜涓烘垜浠喅瀹氬ぇ閲忎嬌鐢ㄨ剼鏈傚埌鐩墠涓烘鏁翠釜欏圭洰涓昏榪樻槸闆嗕腑鍦ㄦ妧鑳藉紑鍙戜笂銆傝岃繖涓嬌鐢ㄨ剼鏈殑搴︼紝灝辨槸鎶鑳藉叏閮ㄧ敱絳栧垝浣跨敤鑴氭湰鍒朵綔錛岀▼搴忓憳涓嶄細鍘葷紪鍐欐煇涓叿浣撴妧鑳斤紝涔熶笉浼氭彁渚涙煇縐嶉厤緗柟寮忓幓璁╃瓥鍒掗氳繃閰嶇疆鏉ュ紑鍙戞妧鑳姐傝繖鐪熸槸涓涓ソ娑堟伅錛屼笉綆″浜庣▼搴忓憳鑰岃█錛岃繕鏄浜庣瓥鍒掕岃█銆備絾鍚庢潵錛屾垜瑙夊緱瀵逛簬榪欎竴鐐硅繕鏄甫鏉ヤ簡寰堝闂銆?/p>
鍩轟簬浠ヤ笂闇姹傦紝紼嬪簭鍛樻墍鍋氱殑灝辨槸寮鍙戞鏋訛紝鍒跺畾鍔熻兘瀹炵幇鏂規銆傝剼鏈負浜嗕笌鏁翠釜娓告垙妗嗘灦浜や簰錛屾垜浠埗瀹氫簡“瑙﹀彂鍣?#8220;榪欎釜姒傚康錛屽ぇ姒傚氨鏄竴縐嶄簨浠剁郴緇熴?/p>
榪欎釜瑙﹀彂鍣ㄧ郴緇燂紝綆鍗曟潵璇達紝灝辨槸鎻愪緵涓縐?#8220;鍏沖績“銆?#8221;閫氱煡“鐨勪氦浜掓柟寮忥紝涔熷氨鏄竴鑸剰涔変笂鐨勪簨浠舵満鍒躲備緥濡傦紝鑴氭湰涓憡璇夌▼搴忓畠鍏沖績鏌愪釜瀵硅薄鐨勭Щ鍔紝閭d箞褰撶▼搴忎腑璇ュ璞′駭鐢熺Щ鍔ㄦ椂錛屽氨閫氱煡鑴氭湰銆傝剼鏈腑鍙互鍏沖績寰堝涓滆タ錛屽寘鎷璞″睘鎬э紝鍏跺叧蹇冪殑鏂瑰紡鍖呮嫭灞炴у兼敼鍙樸佸彉澶с佸彉灝忥紝鍚勭鍙樺寲褰㈠紡錛涘璞″紑濮嬬Щ鍔紝縐誨姩鍋滄錛涘璞$鎾烇紝榪欎釜浼氬崟鐙皥璋堬紱瀹氭椂鍣ㄧ瓑銆?/p>
闄や簡瑙﹀彂鍣ㄧ郴緇熷錛岃繕鏈変釜杈冨ぇ鐨勭郴緇熸槸娓告垙瀵硅薄鐨勫睘鎬х郴緇熴傚璞$殑灞炴у繀鐒舵槸娓告垙閫昏緫涓瓥鍒掓渶鍏沖績鏈瀹規槗鏀瑰姩鐨勬ā鍧椼傛棦鐒舵垜浠▼搴忕殑澶ф柟鍚戞槸灝藉彲鑳藉湴涓嶅叧蹇冪瓥鍒掗渶姹傦紝鎵浠ュ璞″睘鎬у湪璁捐涓婂氨涓嶅彲鑳藉幓緙栧啓鏌愪釜鍏蜂綋灞炴э紝鏇翠笉浼氱紪鍐欒繖涓睘鎬х浉鍏崇殑閫昏緫鍔熻兘銆傜畝鍗曟潵璇達紝紼嬪簭涓烘瘡涓璞$淮鎶や竴涓猭ey-value琛紝涔熷氨鏄睘鎬у悕銆佸睘鎬у艱〃銆傝琛ㄧ殑鍐呭鐢辮剼鏈~鍏ワ紝鑴氭湰浜湁瀛樺彇鏉冮檺銆傜劧鍚庤剼鏈腑灝卞彲浠ュ洿緇曟煇涓睘鎬ф潵緙栧啓鍔熻兘錛岃岀▼搴忎粎璧峰瓨鍌ㄤ綔鐢ㄣ?/p>
絎笁錛屾墿AI妯″潡銆侫I妯″潡鐨勮璁″湪寮鍙戝懆鏈熶笂闈犲悗銆傚悓鏍鳳紝紼嬪簭涓嶄細鍘葷紪鍐欐煇綾籄I鐨勫疄鐜般傜▼搴忔彁渚涗簡鍙︿竴縐嶇畝鍗曠殑浜嬩歡緋葷粺錛岃繖涓郴緇熷叾瀹炲氨鏄竴涓皟鐢ㄨ剼鏈殑鏂規銆傚綋鍏充簬鏌愪釜鎬墿鍙戠敓浜嗘煇涓簨浠舵椂錛岀▼搴忚皟鐢ㄨ剼鏈紝浼犲叆浜嬩歡綾誨瀷鍜屼簨浠跺弬鏁般傝繖涓簨浠跺垎涓轟袱綾伙細紼嬪簭綾誨拰鑴氭湰綾匯傝剼鏈被紼嬪簭涓嶉渶鍏沖績錛屼粎鎻愪緵浜嬩歡瑙﹀彂API銆傜▼搴忕被浜嬩歡闈炲父鏈夐檺錛氭墿鍒涘緩銆佸嚭鐢熴佸垹闄ゃ?/p>
闄や簡浠ヤ笂涓夊潡涔嬪錛岃繕鏈夊緢澶氶浂鏁g殑鑴氭湰浜や簰銆備緥濡傛父鎴忓璞″睘鎬у垵濮嬪寲錛岃鑹茶繘鍏ユ父鎴忥紝瑙掕壊榪涘叆鍦烘櫙絳夈傝繖浜涢兘鏃犲叧鐥涚棐銆?/p>
鎺ヤ笅鏉ヨ皥涓浜涘叧閿ā鍧楃殑瀹炵幇銆?/p>
瀹氭椂鍣?/strong>
鏁翠釜GS鐨勫緢澶氶昏緫妯″潡閮藉熀浜庤繖涓畾鏃跺櫒鏉ュ疄鐜般傝繖涓畾鏃跺櫒鎺ユ敹閫昏緫妯″潡鐨勬敞鍐岋紝鍦ㄤ富寰幆涓紶鍏ョ郴緇熸椂闂達紝瀹氭椂鍣ㄦā鍧楁鏌ュ摢浜涘畾鏃跺櫒瀹炰緥瓚呮椂錛岀劧鍚庤Е鍙戣皟鐢ㄤ箣銆傝繖涓富寰幆浠ユ瘡甯?ms鐨勯熺巼榪愯錛屼篃鍗沖撫鐜?000/5銆?/p>
榪欎釜瀹氭椂鍣ㄦ槸鍩轟簬鎿嶄綔緋葷粺鐨勬椂闂淬傞殢鐫甯х巼鐨勪笉鍚岋紝瀹冨湪瑙﹀彂閫昏緫鍔熻兘鏃訛紝灝卞繀鐒朵笉綺劇‘銆傛父鎴忓鎴風錛堝寘鎷崟鏈烘父鎴忥級鍦ㄥ撫鐜囪繖鍧楃殑瀹炵幇涓婏紝涓鑸昏緫鍔熻兘鐨勮綆楅兘浼氳冭檻鍒頒竴涓猟t錛堜篃灝辨槸涓甯х殑鏃墮棿宸級錛屼緥濡傜Щ鍔ㄦ洿鏂幫紝涓鑸兘鏄痻 = last_x + speed * dt銆備絾錛屾垜浠繖閲屽茍娌℃湁榪欐牱鍋氥傛垜浠殑鍑犱箮鎵鏈夐昏緫鍔熻兘錛岄兘娌℃湁鑰冭檻榪欎釜鏃墮棿宸?/p>
渚嬪錛屾垜浠殑縐誨姩妯″潡娉ㄥ唽浜嗕竴涓浐瀹氭椂闂村肩殑瀹氭椂鍣紝鍋囪鏄?00ms銆傜悊鎯蟲儏鍐典笅錛屽畾鏃跺櫒妯″潡姣?00ms鍥炶皟縐誨姩妯″潡鏇存柊鍧愭爣銆備絾鐜板疄鎯呭喌鑲畾鏄ぇ浜?00ms鐨勬洿鏂伴鐜囷紝鎮插墽鐨勬槸錛岀Щ鍔ㄦā鍧楁瘡嬈℃洿鏂板潗鏍囬兘鏇存柊涓涓浐瀹氬亸縐匯傝繖鏄劇劧鏄笉澶熺簿紜殑銆?/p>
鏇存偛鍓х殑鏄紝瀹氭椂鍣ㄧ殑瀹炵幇涓紝榪樺彲鑳藉嚭鐜拌煩榪囦竴浜涙洿鏂板撫銆備緥濡傦紝鐞嗚鎯呭喌涓嬶紝瀹氭椂鍣ㄤ細鍦ㄧ郴緇熸椂闂寸偣t1/t2/t3/t4鍒嗗埆鍥炶皟鏌愪釜閫昏緫妯″潡銆傛煇涓甯ч噷錛屽畾鏃跺櫒澶ф鍦╰1鍥炶皟浜嗘煇閫昏緫妯″潡錛岃屽綋璇ュ撫鑰楁椂涓ラ噸鏃訛紝涓嬩竴甯у畾鏃跺櫒妯″潡鍦ㄨ綆楁椂錛屽叾鏃墮棿鍊間負t錛岃宼澶т簬t4錛屾鏃跺畾鏃跺櫒妯″潡璺寵繃t2/t3銆傜浉褰撲簬璇ラ昏緫妯″潡灝戜簡2嬈℃洿鏂般傝繖瀵逛簬縐誨姩妯″潡鑰岃█錛岀浉褰撲簬鏌愪釜瀵硅薄鏈潵鍦?縐掔殑鏃墮棿閲岃璧?鏍鹼紝浣嗗疄闄呮儏鍐靛嵈璧頒簡1鏍箋?/p>
褰撶劧錛屽綋娓告垙甯х巼鏃犳硶淇濊瘉鏃訛紝閫昏緫妯″潡榪愯涓嶇悊鎯充篃鏄儏鏈夊彲鍘熺殑銆備絾錛屼笉鐞嗘兂騫朵笉鍖呭惈BUG銆傝屾垜瑙夊緱錛岃繖閲岄潰鏄彲鑳藉嚭鐜癇UG鐨勩傚浣曟敼鍠勮繖鍧楋紝鐩墠涓烘鎴戜篃娌′粈涔堟柟妗堛?/p>
縐誨姩
鏈夊緢澶氭洿涓婂眰鐨勬ā鍧椾緷璧栫Щ鍔ㄣ傛垜浠殑縐誨姩閲囩敤浜嗕竴縐嶅垎鍒ā鎷熺殑瀹炵幇銆傚鎴風灝嗗鏉傜殑縐誨姩璺緞鎷嗗垎涓轟竴鏉′竴鏉$殑綰挎錛岀劧鍚庢瘡涓嚎孌佃姹傛湇鍔″櫒縐誨姩銆傜劧鍚庢湇鍔″櫒涓婁嬌鐢ㄥ畾鏃跺櫒鏉ユā鎷熷湪璇ョ嚎孌典笂鐨勭Щ鍔ㄣ傚洜涓烘湇鍔″櫒涓婄殑闃繪尅鏄簩緇存牸瀛愶紝榪欐牱鏈嶅姟鍣ㄧ殑妯℃嫙涔熷緢綆鍗曘傚綋鐒訛紝榪欎釜妯″潡鍦ㄥ叿浣撳疄鐜頒笂澶嶆潅寰堝錛岃繖閲屼笉緇嗚皥銆?/p>
紕版挒媯嫻?/strong>
鎴戜滑鐨勬妧鑳借姹傛湁紕版挒媯嫻嬶紝榪欎富瑕佸寘鎷璞′笌瀵硅薄涔嬮棿鐨勭鎾炪傚湪鏈鏃╃殑瀹炵幇涓紝褰撹剼鏈叧蹇冩煇涓璞$殑紕版挒鎯呭喌鏃訛紝紼嬪簭灝變負璇ュ璞℃敞鍐屽畾鏃跺櫒錛岀劧鍚庡懆鏈熻Е鍙戞嫻嬩笌鍛ㄥ洿瀵硅薄鐨勮窛紱誨叧緋伙紝榪欎釜鍛ㄦ湡浣庝簬100ms銆傝繖涓疄鐜板緢綆鍗曪紝緇存姢璧鋒潵涔熷氨寰堢畝鍗曘備絾瀹冩槸鏈夐棶棰樼殑銆傚洜涓哄畠鍩轟簬浜嗕竴涓笉綺劇‘鐨勫畾鏃跺櫒錛屽拰涓涓笉綺劇‘鐨勭Щ鍔ㄦā鍧椼?/p>
棣栧厛錛岃繖涓嫻嬫槸鍩轟簬瀵硅薄鐨勫綋鍓嶅潗鏍囥傚墠闈㈠垎鏋愯繃鍦ㄥ撫鐜囨帀鍒扮Щ鍔ㄦ洿鏂板撫閮芥帀甯х殑鎯呭喌涓嬶紝鏈嶅姟鍣ㄧ殑瀵硅薄鍧愭爣鍜岀悊璁烘儏鍐靛樊璺濅細寰堝ぇ錛岃屽鎴風鍩烘湰涓婃槸鎺ヨ繎姝g‘鎯呭喌鐨勶紝榪欎釜鏃跺欏仛鐨勮窛紱繪嫻嬶紝灝變笉鍙兘姝g‘銆傚彟涓鏂歸潰錛屽氨綆楃Щ鍔ㄧ簿紜簡錛岃繖涓鎾炴嫻嬭繕鏄細甯︽潵BUG銆備緥濡傜幇鍦ㄦ嫻嬪埌浜嗙鎾烇紝瑙﹀彂浜嗚剼鏈紝鑴氭湰涓敞鍐屼簡鍏沖績紱誨紑鐨勪簨浠躲備絾涓嶅垢鐨勬槸錛屽湪榪欎釜瀹氭椂鍣ㄥ紑濮嬫嫻嬪墠錛岃繖涓や釜瀵硅薄宸茬粡緇忓巻浜嗙鎾炪佺寮銆佸啀紕版挒鐨勮繃紼嬶紝鑰屽畾鏃跺櫒寮濮嬫嫻嬬殑鏃跺欙紝鍥犱負瀹冨熀浜庝簡褰撳墠鐨勫璞″潗鏍囷紝瀹冧緷鐒剁湅鍒扮殑鏄袱涓璞″浜庣鎾炵姸鎬併?/p>
鏈寮濮嬶紝鎴戜滑鐩磋榪欐牱鐨勫疄鐜版槸璐規椂鐨勶紝鏄笉綺劇‘鐨勩傜劧鍚庢湁浜嗙浜岀瀹炵幇銆傝繖涓疄鐜板熀浜庝簡縐誨姩鐨勫疄鐜般傚洜涓哄璞$殑縐誨姩鏄熀浜庣洿綰跨殑錛堟湇鍔″櫒涓婏級銆傛垜浠氨鍦ㄥ璞″紑濮嬬Щ鍔ㄦ椂錛屾牴鎹Щ鍔ㄦ柟鍚戙侀熷害棰勬祴涓や釜瀵硅薄浼氬湪鏈潵鐨勬煇涓椂闂寸偣鍙戠敓紕版挒銆傚綋鐒訛紝瀵逛簬棰戠箒鐨勫皬璺濈縐誨姩鑰岃█錛岃繖涓嫻嬩粠鐩磋涓婃潵璇翠篃鏄垂鏃剁殑銆傜劧鍚庡疄鐜頒唬鐮佸啓浜嗗嚭鏉ワ紝涓鐪嬶紝鎸哄鏉傦紝緇存姢闅懼害涓嶅皬銆傚鏋滄晥鏋滃ソ榪欎釜緇存姢鎴愭湰涔熷氨綆椾簡錛屼絾鏄紝瀹冧緷鐒舵槸涓嶇簿紜殑銆傚洜涓猴紝瀹冧篃渚濊禆浜嗚繖涓畾鏃跺櫒銆?/p>
渚嬪錛屽湪鏌愪釜瀵硅薄寮濮嬬Щ鍔ㄦ椂錛屾垜浠嫻嬪埌鍦?00ms浼氫笌瀵硅薄B鍙戠敓紕版挒銆傜劧鍚庢敞鍐屼簡涓涓?00ms鐨勫畾鏃跺櫒銆備絾瀹氭椂鍣ㄤ笉浼氱簿紜湴鍦ㄦ湭鏉?00ms瑙﹀彂錛岄殢鐫甯х巼鐨勪笅闄嶏紝400ms瑙﹀彂閮芥湁鍙兘銆傚嵆渚夸笉鑰冭檻甯х巼涓嬮檷鐨勬儏鍐碉紝瀹冭繕鏄湁闂銆傚墠闈㈣榪囷紝鎴戜滑娓告垙甯т繚璇佹瘡甯ц嚦灝?ms錛屾湰鏉ヨ繖鏄竴涓檺甯ф墜孌碉紝鐩殑褰撶劧鏄伩鍏峛usy-loop銆傝繖瀵艱嚧瀹氭椂鍣ㄦ渶澶氬嚭鐜?ms鐨勫歡榪熴傚鏋滅瓥鍒掍嬌鐢ㄨ繖涓鎾炴嫻嬪幓鍋氶琛岄亾鍏風殑瀹炵幇錛屼緥濡備竴涓揩閫熼鍑哄幓鐨勭伀鐞冿紝褰撹繖涓琛岄熷害寰堝揩鐨勬椂鍊欙紝榪?ms鐩稿浜庤繖涓嫻嬬鎾炴椂闂村氨涓嶅啀鏄釜灝忔暟鐩傜湡鎮插墽銆?/p>
鎶鑳?/strong>
铏界劧鍏蜂綋鐨勬妧鑳戒笉鏄▼搴忓啓鐨勶紝浣嗘濡傛妸鍑犱箮鎵鏈夊叿浣撻昏緫浜ょ粰絳栧垝鍐欏甫鏉ョ殑鎮插墽涓鏍鳳細榪欎簨涓嶆槸浣犲共鐨勶紝浣嗕綘寰楄礋璐e畠鐨勬ц兘銆傛墍浠ユ湁蹇呰璋堣皥鎶鑳界殑瀹炵幇銆?/p>
鎶鑳界殑瀹炵幇閲岋紝鍙湁涓涓妧鑳戒嬌鐢ㄥ叆鍙o紝紼嬪簭鍙渶瑕佸湪瀹㈡埛绔彂鍑轟嬌鐢ㄦ妧鑳界殑娑堟伅鏃訛紝璋冪敤榪欎釜鍏ュ彛鑴氭湰鍑芥暟銆傜劧鍚庤剼鏈腑浼氶氳繃娉ㄥ唽涓浜涜Е鍙戝櫒鏉ラ┍鍔ㄦ暣涓妧鑳借繍浣溿傜▼搴忓憳涓鐩村笇鏈涚瓥鍒掕兘鎶婃妧鑳界敤涓涓粺涓鐨勩佸叿浣撶殑妗嗘灦緇熶竴璧鋒潵錛屾墍璋撶殑鍙樺姩閮芥槸鍩轟簬榪欎釜妗嗘灦鏉ュ彉鐨勩備絾絳栧垝涔熶竴鐩村潥鎸侊紝浠栦滑蹇冪洰涓殑鎶鑳芥槸鏃犳硶緇熶竴鐨勩?/p>
鎴戜滑鐨勬妧鑳界‘瀹炲緢澶嶆潅銆備竴涓妧鑳界殑鏁翠釜榪囩▼涓紝鏈嶅姟鍣ㄥ彲鑳戒細鍜屽鎴風鍙戠敓澶氭娑堟伅浜や簰銆傚湪鏈鍒濈殑瀹炵幇涓紝鏈嶅姟鍣ㄧ敋鑷充細鎺у埗瀹㈡埛绔殑鎶鑳界壒鏁堛侀噴鏀懼姩浣滅瓑鍚勭緇嗚妭錛涚敋鑷充簬鏈嶅姟鍣ㄤ細鍦ㄨ繖涓繃紼嬩腑渚濊禆瀹㈡埛绔殑鑻ュ共嬈¤緭鍏ャ?/p>
涓嬩竴綃囨垜灝嗚皥璋堜竴浜涢亣鍒扮殑闂銆?/p>
| Author: | Kevin Lynx |
|---|---|
| Date: | 5.2.2011 |
涓鑸殑MMORPG涓紝娓告垙瀵硅薄涓昏鍖呮嫭鎬墿鍜岀帺瀹躲傝繖涓ょ被瀵硅薄鍦ㄧ粡榪囨父鎴忔ф柟闈㈢殑涓嶆柇“榪涘寲”鍚庯紝鍏跺睘鎬ф暟閲忓強涓庝箣鐩稿叧鐨勯昏緫寰寰浼氬彉寰楀緢宸ㄥぇ銆傚浣曞皢榪欎竴鍧楀仛寰楁棦涓嶆崯澶辨晥鐜囷紝鍙堣兘淇濊瘉緇撴瀯鐨勭伒媧匯佹竻鏅般佸彲緇存姢錛熸湰鏂囧皢鎻愪緵涓縐嶇畝鍗曠殑緇撴瀯銆?/p>
鏈鍘熷鐨勭粨鏋勶紝鏋佹湁鍙兘涓鴻繖鏍?
Player: +---------------+
| property-1 |
+---------------+
| property-2 |
+---------------+
| ... |
+---------------+
| operator-1 |
+---------------+
| operator-2 |
+---------------+
| ... |
+---------------+
涔熷氨鏄紝涓涓璞′負涓涓狢++綾伙紝鐒跺悗閲岄潰鐩存帴濉炴弧浜嗗悇縐嶅睘鎬у悕錛岀劧鍚庢槸閽堝榪欎釜灞炴х殑閫昏緫鎿嶄綔錛堝嚱鏁幫級銆傚叾緇撴灉灝辨槸Player鎴愪負宸ㄧ被銆傞拡瀵硅繖涓儏鍐碉紝涓鐩翠互鏉ユ垜瑙夊緱鍙互浣跨敤涓縐嶇畝鍗曠殑鏂規硶鏉ユ媶鍒嗚繖涓被銆傚啝浠ュ畼鑵旓紝縐頒箣涓篍ntity-Component-based Desgin銆備駭鐢熻繖縐嶆兂娉曞拰鎴戠殑涓漢鎶鏈Н绱湁涓瀹氬叧緋伙紝瑙佷笅鏂囥?/p>
Policy-based Design錛屽熀浜庡喅絳栫殑璁捐銆傝繖涓蹇墊潵婧愪簬<Modern C++ Design>銆傝櫧鐒惰繖鏈功璁茶堪鐨勬槸閽堝C++妯℃澘鐨勪嬌鐢ㄥ強璁捐鎶宸с備絾榪欑鎬濇兂渚濈劧琚垜娼滄剰璇嗚埇鍦扮敤鍦ㄥ叾浠栧湴鏂廣侾olicy澶ц嚧鏉ヨ灝辨槸涓涓皬鐨勭粍浠?Component)銆傚畠鍔姏涓嶄緷璧栦簬鍏朵粬涓滆タ錛屽畠鍙兘灝辨槸涓畝鍗曠殑綾伙紝瀹冩嫢鏈夋瀬灝戠殑鏁版嵁緇撴瀯錛屽強閽堝榪欎簺鏁版嵁鐨勬瀬灝戞搷浣滄帴鍙c備婦渚嬭岃█錛岀帺瀹禡P鐨勮嚜鍔ㄥ洖澶嶅姛鑳斤紝灝卞彲灝佽涓轟竴涓狿olicy銆傚皢璁稿Policy緇勫悎璧鋒潵錛屽氨鍙畬鎴愪竴涓鏉傜殑鍔熻兘銆?/p>
榪欑鎬濇兂榪樺彲鎸囧寰堝紼嬪簭緇撴瀯鏂歸潰鐨勮璁°備緥濡傚湪鍋氬姛鑳界殑鎺ュ彛鎷嗗垎鏃訛紝灝卞皢姣忎釜鍑芥暟璁捐寰楄凍澶熷皬錛屽皬鍒板崟綰湴瀹屾垚涓涓姛鑳姐備竴涓姛鑳界殑鍏ュ彛鍑芥暟錛屽氨灝嗕箣鍓嶅疄鐜扮殑灝忓嚱鏁板叏閮ㄧ粍鍚堣搗鏉ワ紝鐒跺悗鍏卞悓瀹屾垚鍔熻兘鐐廣?/p>
褰撶劧錛?lt;Modern C++ Design>閲岀殑Policy鍦ㄨ〃鐜板艦寮忎笂鏈夋墍涓嶅悓銆備絾鍏舵牳蹇冩濇兂鐩稿悓錛屼富瑕佷綋鐜板湪 緇勫悎 鐗圭偣涓娿?/p>
Entity-Component-based Design鎸夌収google鍒扮殑鏂囩珷錛屼弗鏍兼潵璇寸畻鏄笌OOP瀹屽叏涓嶅悓鐨勮蔣浠惰璁℃柟娉曘備笉榪囧湪榪欓噷瀹冨皢鎸夌収鎴戠殑鎰忔濋噸鏂拌瑙i噴銆?/p>
濡傛灉璇碢olicy-based Design鏋佸ぇ鍙兘鍦板獎鍝嶇潃鎴戜滑騫蟲椂鐨勭粏鑺傜紪鐮侊紝閭d箞Entity-Component鍒欐槸鐩存帴瀵規父鎴忓璞$殑緇撴瀯璁捐鍋氱洿鎺ョ殑璇存槑銆?涓涓父鎴忓璞″氨鏄竴涓狤ntity銆?/strong> Entity鎷ユ湁寰堝皯鐨勫睘鎬э紝涔熻浠呭寘鍚竴涓叏灞鏍囩ず鐨処D銆?涓涓狢omponent鍒欐槸Entity鐨勬煇涓涓恒佹垨鑰呰鏌愪釜緇勬垚閮ㄥ垎銆?/strong> 鍏跺疄璇寸櫧浜嗭紝浠ョ帺瀹朵負渚嬶紝涓涓帺瀹跺璞″氨鏄竴涓狤ntity錛岃屼竴涓狹P鐨勮嚜鍔ㄥ洖澶嶅姛鑳藉氨鍙鍖呰涓轟竴涓狢omponent銆傝繖涓狢omponent鍙兘鍖呭惈鑻ュ共涓庤鍔熻兘鐩稿叧鐨勬暟鎹紝渚嬪鍥炲鏃墮棿闂撮殧錛屾瘡嬈$殑鍥炲閲忕瓑銆傛垜浠線鐜╁瀵硅薄榪欎釜Entity娣誨姞鍚勭Component錛屼篃灝辨槸緇欑帺瀹舵坊鍔犲悇縐嶉昏緫鍔熻兘銆?/p>
浣嗘槸錛孋omponent涔嬮棿鍙兘浼氭秹鍙婂埌浜や簰錛岀帺瀹跺璞′箣澶栫殑妯″潡鍙兘涔熶細涓庣帺瀹跺唴鐨勬煇涓狢omponent浜や簰銆傚瓙鍔熻兘鐐圭殑鎷嗗垎錛屼笉寰椾笉娑夊強鍒版洿澶氱殑鑳舵按浠g爜錛岃繖涔熺畻涓縐嶄唬浠楓?/p>
榪欎喚灞炴х粨鏋勮璁★紝鍩烘湰灝辨槸鍙傝冧簡涓婇潰鎻愬埌鐨勮璁℃濇兂銆傛暣涓郴緇熸湁濡備笅緇勪歡:
Entity: +-------------------+
| property-table |
+-------------------+
| component-table |
+-------------------+
Property: +-------------------+
| observer-list |
+-------------------+
Component: +--------------------+
| logic-related data |
+--------------------+
| logic-related func |
+--------------------+
鎰忓嵆錛屾墍鏈塃ntity閮藉寘鍚竴涓睘鎬ц〃鍜岀粍浠惰〃銆傝繖閲岀殑灞炴ц〃騫墮潪紜紪鐮佺殑灞炴ф暟鎹垚鍛橀泦鍚堬紝鑰屾槸涓涓猭ey-value褰㈠紡鐨勮〃銆侾roperty鍖呭惈涓涓瀵熻呭垪琛紝鍏跺疄灝辨槸涓緋誨垪鍥炶皟鍑芥暟錛屼絾鏄繖浜涜瀵熻呮湰璐ㄤ笂涔熸槸緇勪歡錛屽悗闈細鎻愬埌銆侰omponent姝e涓婃枃鎻忚堪錛屼粎鍖呭惈Component鏈韓瀹炵幇鐨勫姛鑳芥墍闇瑕佺殑鏁版嵁鍜屽嚱鏁般傛暣涓粨鏋勫ぇ鑷寸殑浠g爜濡備笅:
class Entity {
private:
GUID id;
std::map<std::string, IComponent*> components;
std::map<std::string, Property*> properties;
};
class Property {
private:
std::string name;
Value val;
std::vector<IComponent*> observers;
};
class IComponent {
public:
virtual bool Operate (const Args &args) { return false; }
virtual void OnNotify (const Property &property, const Args &args) {}
protected:
std::string name;
Entity *entity;
};
灞炴ф湰韜槸鎶借薄鐨勶紝榪欏畬鍏ㄦ槸鍥犱負鎴戜滑灝嗗睘鎬х粺涓鍦版斁鍦ㄤ簡涓涓〃閲屻備粠鑰屽張瀵艱嚧灞炴х殑鍊間篃闇瑕?a >緇х畫闃呰
SGI瀹炵幇鐨凷TL閲岋紝鎵鏈夌殑瀹瑰櫒閮戒嬌鐢⊿GI鑷繁瀹氫箟鐨刟llocator銆傝繖涓猘llocator瀹炵幇浜嗕竴涓猻mall object鐨勫唴瀛樻睜銆?br>Loki閲屼負浜嗗鐞嗗皬瀵硅薄鐨勫唴瀛樺垎閰嶏紝涔熷疄鐜頒簡綾諱技鐨勫唴瀛樼鐞嗘満鍒躲?
璇ュ唴瀛樻睜澶ц嚧涓婏紝灝辨槸涓澶у潡涓澶у潡鍦頒粠緋葷粺鑾峰彇鍐呭瓨錛岀劧鍚庡皢鍏跺垎鎴愬緢澶氬皬鍧椾互閾捐〃鐨勫艦寮忛摼鎺ヨ搗鏉ャ傚叾鍐呴儴
鏈夊緢澶氫笉鍚岀被鍨嬬殑閾捐〃錛屼笉鍚岀殑閾捐〃緇存姢涓嶅悓澶у皬鐨勫唴瀛樺潡銆傛瘡涓嬈″鎴風瑕佹眰鍒嗛厤鍐呭瓨鏃訛紝allcator灝辨牴鎹姹?br>鐨勫ぇ灝忔壘鍒扮浉搴旂殑閾捐〃(鏈鎺ヨ繎鐨勫昂瀵?錛岀劧鍚庝粠閾捐〃閲屽彇鍑哄唴瀛樸傚綋瀹㈡埛绔綊榪樺唴瀛樻椂錛宎llocator灝卞皢榪欏潡鍐呭瓨
鏀懼洖鍒板搴旂殑閾捐〃閲屻?
鎴戠畝鍗曞湴鐢諱簡騫呭浘琛ㄧず鏁翠釜緇撴瀯錛?/font>
allocator鍐呴儴緇存姢涓涓摼琛ㄦ暟緇勶紝鏁扮粍鍏冪礌鍏ㄩ儴鏄摼琛ㄥご鎸囬拡銆傞摼琛ˋ姣忎竴涓妭鐐圭淮鎶や竴涓?bytes鐨勫唴瀛樺潡錛岄摼琛?br>B姣忎竴涓妭鐐圭淮鎶や竴涓?6bytes鐨勫唴瀛樺潡銆?
褰撳鎴風璇鋒眰鍒嗛厤10bytes鐨勫唴瀛樻椂錛宎llocator灝?0璋冩暣涓烘渶鎺ヨ繎鐨?6bytes(鍙兘澶т簬10bytes)錛岀劧鍚庡彂鐜?6bytes 澶ц嚧榪囩▼灝辮繖涔堢畝鍗曪紝涔熻鏈変漢瑕佽鐢ㄩ摼琛ㄧ淮鎶や竴鍧楀唴瀛橈紝閾捐〃鏈韓灝變細嫻垂涓浜涘唴瀛?鍦ㄦ垜寰堟棭鍓嶆帴瑙﹀唴瀛樻睜鏃訛紝 榪樻槸鍐欑偣浠g爜璇︾粏璇翠笅榪欎釜灝忔妧宸э細
榪欐牱錛岄氳繃header鎸囬拡鍜宯ext鍩燂紝灝卞彲浠ラ愬潡(榪欓噷鏄?0byts)鍦拌闂甿em鎵鎸囧悜鐨勫唴瀛橈紝鑰岃繖浜涢摼琛ㄧ殑鑺傜偣錛岄兘 鎴戠敤C妯′豢鐫SGI鐨勮繖涓猘llocator鍐欎簡涓彲閰嶇疆鐨勫唴瀛樻睜錛屽湪鍏朵笂鎸夌収STL鐨勬爣鍑嗗寘瑁呬簡涓涓猘llocator錛屽彲浠ョ洿鎺?br>鐢ㄤ簬VC鑷甫鐨凷TL閲屻?/font>嫻嬭瘯浠g爜紼嶅井嫻嬭瘯浜嗕笅錛屽彂鐜板湪涓嶅悓鐨勬満鍣ㄤ笂鏈夋槑鏄劇殑宸窛銆?
榪欎釜閾捐〃(閾捐〃B)閲屾湁鍙敤鍐呭瓨鍧楋紝浜庢槸浠嶣閲屽彇鍑轟竴鍧楀唴瀛樿繑鍥炪傚綋瀹㈡埛绔綊榪樻椂錛宎llocator鎵懼埌瀵瑰簲鐨勯摼琛紝灝?br>鍐呭瓨閲嶆柊鏀懼洖閾捐〃B鍗沖彲銆?
鎬諱細鐪嬪埌綾諱技鐨勮鐐? =|)錛屽叾瀹為氳繃涓浜涚畝鍗曠殑鎶宸ф槸瀹屽叏鍙互閬垮厤鐨勩備緥濡傦紝榪欓噷allocator緇存姢浜嗗緢澶氬唴瀛樺潡錛?br>鍙嶆榪欎簺鍐呭瓨鏈韓灝辨槸闂茬疆鐨勶紝鍥犳鎴戜滑灝卞彲浠ョ洿鎺ュ湪榪欎簺鍐呭瓨閲岃褰曢摼琛ㄧ殑淇℃伅(涓嬩竴涓厓绱?銆?
struct Obj
{
Obj *next;
}; 
void *mem = malloc( 100 );
Obj *header = (Obj*) mem;
Obj *cur_obj = header;
Obj *next_obj = cur_obj;
for( int i = 0; ; ++ i )
{
cur_obj = next_obj;
next_obj = (Obj*)((char*)next_obj + 10 );
if( i == 9 )
{
cur_obj->next = 0;
break;
}
else
{
cur_obj->next = next_obj;
}
}
free( mem );
鏄洿鎺ヤ繚瀛樺湪榪欏潡鍐呭瓨閲岀殑錛屾墍浠ュ畬鍏ㄦ病鏈夐澶栨秷鑰椼?
鍓嶈█錛?/strong> 鍦ㄥ緢澶氭瘮杈冨悇縐嶇綉緇滄ā鍨嬬殑鏂囩珷涓紝浣嗗嚒鎻愬埌select妯″瀷鏃訛紝閮戒細璇磗elect鍙楅檺浜庤疆璇㈢殑濂楁帴瀛楁暟閲忥紝榪欎釜 C璇█鐨勫亸鏂癸細 鍦–璇█鐨勪笘鐣岄噷瀛樺湪涓涓叧浜庣粨鏋勪綋鐨勫亸闂ㄦ妧宸э紝渚嬪錛? str_type鐢ㄤ簬淇濆瓨瀛楃涓?鎴戝彧鏄婦渚嬶紝浜嬪疄涓婅繖涓粨鏋勪綋娌′粈涔堢敤澶?錛屼箥鐪嬩笂鍘籹tr_type鍙兘淇濆瓨闀垮害涓?br>1鐨勫瓧絎︿覆('\0')銆備絾鏄紝閫氳繃鍐欎笅濡備笅鐨勪唬鐮侊紝浣犲皢紿佺牬榪欎釜闄愬埗錛? 鍏跺疄select涔熷彲浠ヨ繖鏍峰仛錛?/strong> 浜嬪疄涓婏紝鍥犱負select娑夊強鍒扮殑fd_set鏄竴涓畬鍏ㄦ弧瓚充笂榪拌姹傜殑緇撴瀯浣擄細 鍥犱負榪欎釜瀹忓師鐞嗕笉榪囧姝わ紝鎵浠ユ垜浠畬鍏ㄥ彲浠ヨ嚜宸卞啓涓涓柊鐨勭増鏈備緥濡傦細 榪欓噷鎴戜笉浼氬叿浣撹select妯″瀷錛屾垜鍙◢寰彁涓涓嬨備竴涓吀鍨嬬殑select杞妯″瀷涓猴細 鐩稿叧涓嬭澆(5.21.2008)
鏁伴噺涔熷氨鏄郴緇熷ご鏂囦歡涓畾涔夌殑FD_SETSIZE鍊?渚嬪64)銆備絾浜嬪疄涓婅繖涓畻涓嶄笂鐪熺殑闄愬埗銆?
typedef struct _str_type
{
int _len;
char _s[1];
}str_type;
int str_len = 5;
str_type *s = (str_type*) malloc( sizeof( str_type ) + str_len - 1 );
//
free( s ); 

榪欎釜鎶宸у師鐞嗗緢綆鍗曪紝鍥犱負_s鎭板ソ鍦ㄧ粨鏋勪綋灝鵑儴錛屾墍浠ュ彲浠ヤ負鍏跺垎閰嶄竴孌佃繛緇殑絀洪棿錛屽彧瑕佹敞鎰忔寚閽堢殑浣跨敤錛?br>榪欎釜灝辯畻涓嶄笂浠g爜涓婄殑緗伓銆備絾鏄繖涓妧宸ф湁涓檺鍒訛紝str_type瀹氫箟鐨勫彉閲忓繀欏繪槸琚垎閰嶅湪鍫嗕笂錛屽惁鍒欎細鐮?br>鍧忓爢鏍堛傚彟澶栵紝闇瑕佸姩鎬佸闀跨殑鎴愬憳闇瑕佷綅浜庣粨鏋勪綋鐨勬湯灝俱傛渶鍚庯紝涓涓繝鍛婂氨鏄紝榪欎釜鏄疌璇█閲岀殑鎶宸э紝
濡傛灉浣犵殑緇撴瀯浣撳寘鍚簡C++鐨勪笢瑗匡紝榪欎釜鎶宸у皢涓嶅啀瀹夊叏(<Inside the C++ object model>)銆?
winsock2.h : 
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set; 

浣嗘槸錛屽鏋滀嬌鐢ㄤ簡浠ヤ笂鎶宸ф潵澧炲姞fd_array鐨勬暟閲?涔熷氨鏄繚瀛樼殑濂楁帴瀛楁暟閲?錛岄偅涔堝叧浜巉d_set鐨勯偅浜涘畯鍙?br>鑳藉氨鏃犳硶浣跨敤浜嗭紝渚嬪FD_SET銆?
winsock2.h : 
#define FD_SET(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \
break; \
} \
} \
if (__i == ((fd_set FAR *)(set))->fd_count) { \
if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
((fd_set FAR *)(set))->fd_array[__i] = (fd); \
((fd_set FAR *)(set))->fd_count++; \
} \
} \
} while(0) 

鏈夌偣璁╀漢鐪艱姳緙貢錛屾垜榧撳姳浣犱粩緇嗙湅錛屽叾瀹炲緢綆鍗曘傝繖閲屾湁涓皬鎶宸э紝灝辨槸浠栨妸榪欎簺浠g爜鏀懼埌涓涓猟o...while(0)
閲岋紝涓轟粈涔堣榪欐牱鍋氾紝鎴戣寰楀簲璇ユ槸闃叉鍚嶅瓧姹℃煋錛屼篃灝辨槸闃叉閭d釜__i鍙橀噺涓庝綘鐨勪唬鐮佺浉鍐茬獊銆傚彲浠ョ湅鍑猴紝
FD_SET浼氬皢fd_count涓嶧D_SETSIZE鐩告瘮杈冿紝榪欓噷涓昏鏄槻姝㈠線fd_array鐨勯潪娉曚綅緗啓鏁版嵁銆?
#define MY_FD_SET( fd, set, size ) do { \
unsigned int i = 0; \
for( i = 0; i < ((fd_set*) set)->fd_count; ++ i ) { \
if( ((fd_set*)set)->fd_array[i] == (fd) ) { \
break; \
} \
} \
if( i == ((fd_set*)set)->fd_count ) { \
if( ((fd_set*)set)->fd_count < (size) ) { \
((fd_set*)set)->fd_array[i] = (fd); \
((fd_set*)set)->fd_count ++; \
} \
} \
} while( 0 ) 

娌′粈涔堝彉鍖栵紝鍙槸涓篎D_SET鍔犲叆涓涓猣d_array鐨勯暱搴﹀弬鏁幫紝瀹忎綋涔熷彧鏄皢FD_SETSIZE鎹㈡垚榪欎釜闀垮害鍙傛暟銆?br>浜庢槸錛岀幇鍦ㄤ綘鍙互鍐欎笅榪欐牱鐨勪唬鐮侊細
unsigned int count = 100;
fd_set *read_set = (fd_set*) malloc( sizeof( fd_set ) + sizeof(SOCKET) * (count - FD_SETSIZE ) );
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
//
MY_FD_SET( s, read_set, count );
//
free( read_set );
closesocket( s ); 

灝忔彁涓媠elect妯″瀷錛?/strong>
int r = select( 0, &read_set, 0, 0, &timeout );
if( r < 0 )
{
// select error
} 
if( r > 0 )
{
for( each sockets )
{
if( FD_ISSET( now_socket, &read_set ) )
{
// this socket can read data
}
}
} 

杞write鏃朵篃宸笉澶氥傚湪Etwork(涓涓秴灝忓瀷鐨勫熀鏈敤浜庣粌涔犵綉緇滅紪紼嬬殑緗戠粶搴?google yourself)涓紝浣滆?br>鐨勮疆璇㈡柟寮忓垯鏈夋墍涓嶅悓錛?
// read_set, write_set涓洪噰鐢ㄤ簡涓婃枃鎵榪版妧宸х殑fd_set綾誨瀷鐨勬寚閽?/span>
int r = select( 0, read_set, write_set, 0, &timeout );
//
error handling
for( int i = 0; i < read_set->fd_count; ++ i )
{
// 杞鎵鏈塻ocket錛岃繖閲岀洿鎺ラ噰鐢╮ead_set->fd_array[i] == now_socket鍒ゆ柇錛岃屼笉鏄疐D_ISSET
} 
for( int i = 0; i < write_set->fd_count; ++ i )
{
// 杞鎵鏈塻ocket錛屾鏌ュ叾whether can write錛屽垽鏂柟寮忓悓涓?/span>
} 

涓ょ鏂瑰紡鐨勬晥鐜囦粠浠g爜涓婄湅鍘諱技涔庨兘宸笉澶氾紝鍏抽敭鍦ㄤ簬錛孎D_ISSET騫蹭簡浠涔堬紵榪欎釜瀹忓疄闄呬笂浣跨敤浜哶_WSAFDIsSet
鍑芥暟錛岃宊_WSAFDIsSet鍋氫簡浠涔堝垯涓嶇煡閬撱備篃璁稿畠浼氫緷璧栦簬FD_SETSIZE瀹忥紝閭d箞榪欏湪鎴戜滑榪欓噷灝嗘槸涓嶅畨鍏ㄧ殑錛?br>鎵浠ョ浉姣斾箣涓嬶紝濡傛灉鎴戜滑浣跨敤浜嗚繖涓獊鐮碏D_SETSIZE鐨勫亸鏂規墜孌碉紝閭d箞涔熻絎簩縐嶆柟寮忚濂戒簺銆?
涓昏閮ㄥ垎錛屽洓嬈℃彙鎵嬶細
鏂紑榪炴帴鍏跺疄浠庢垜鐨勮搴︾湅涓嶅尯鍒嗗鎴風鍜屾湇鍔″櫒绔紝浠諱綍涓鏂歸兘鍙互璋冪敤close(or closesocket)涔嬬被
鐨勫嚱鏁板紑濮嬩富鍔ㄧ粓姝竴涓繛鎺ャ傝繖閲屽厛鏆傛椂璇存甯告儏鍐點傚綋璋冪敤close鍑芥暟鏂紑涓涓繛鎺ユ椂錛屼富鍔ㄦ柇寮鐨?br>涓鏂瑰彂閫丗IN(finish鎶ユ枃緇欏鏂廣傛湁浜嗕箣鍓嶇殑緇忛獙錛屾垜鎯充綘搴旇鏄庣櫧鎴戣鐨凢IN鎶ユ枃鏃朵粈涔堜笢瑗褲備篃灝辨槸
涓涓緗簡FIN鏍囧織浣嶇殑鎶ユ枃孌點侳IN鎶ユ枃涔熷彲鑳介檮鍔犵敤鎴鋒暟鎹紝濡傛灉榪欎竴鏂硅繕鏈夋暟鎹鍙戦佹椂錛屽皢鏁版嵁闄?br>鍔犲埌榪欎釜FIN鎶ユ枃鏃跺畬鍏ㄦ甯哥殑銆備箣鍚庝綘浼氱湅鍒幫紝榪欑闄勫姞鎶ユ枃榪樹細鏈夊緢澶氾紝渚嬪ACK鎶ユ枃銆傛垜浠墍瑕佹妸鎻?br>鐨勫師鍒欐槸錛孴CP鑲畾浼氬姏鎵鑳藉強鍦拌揪鍒版渶澶ф晥鐜囷紝鎵浠ヤ綘鑳藉鎯沖埌鐨勪紭鍖栨柟娉曪紝鎴戞兂TCP閮戒細鎯沖埌銆?
褰撹鍔ㄥ叧闂殑涓鏂規敹鍒癋IN鎶ユ枃鏃訛紝瀹冧細鍙戦丄CK紜鎶ユ枃(瀵逛簬ACK榪欎釜涓滆タ浣犲簲璇ュ緢鐔熸倝浜?銆傝繖閲屾湁涓?br>涓滆タ瑕佹敞鎰忥紝鍥犱負TCP鏄弻宸ョ殑錛屼篃灝辨槸璇達紝浣犲彲浠ユ兂璞′竴瀵筎CP榪炴帴涓婃湁涓ゆ潯鏁版嵁閫氳礬銆傚綋鍙戦丗IN鎶ユ枃
鏃訛紝鎰忔濇槸璇達紝鍙戦丗IN鐨勪竴绔氨涓嶈兘鍙戦佹暟鎹紝涔熷氨鏄叧闂簡鍏朵腑涓鏉℃暟鎹氳礬銆傝鍔ㄥ叧闂殑涓绔彂閫?br>浜咥CK鍚庯紝搴旂敤灞傞氬父灝變細媯嫻嬪埌榪欎釜榪炴帴鍗沖皢鏂紑錛岀劧鍚庤鍔ㄦ柇寮鐨勫簲鐢ㄥ眰璋冪敤close鍏抽棴榪炴帴銆?
鎴戝彲浠ュ憡璇変綘錛屼竴鏃﹀綋浣犺皟鐢╟lose(or closesocket)錛岃繖涓绔氨浼氬彂閫丗IN鎶ユ枃銆備篃灝辨槸璇達紝鐜板湪琚姩
鍏抽棴鐨勪竴绔篃鍙戦丗IN緇欎富鍔ㄥ叧闂銆傛湁鏃跺欙紝琚姩鍏抽棴绔細灝咥CK鍜孎IN涓や釜鎶ユ枃鍚堝湪涓璧峰彂閫併備富鍔?br>鍏抽棴绔敹鍒癋IN鍚庝篃鍙戦丄CK錛岀劧鍚庢暣涓繛鎺ュ叧闂?浜嬪疄涓婅繕娌″畬鍏ㄥ叧闂紝鍙槸鍏抽棴闇瑕佷氦鎹㈢殑鎶ユ枃鍙戦?br>瀹屾瘯)錛屽洓嬈℃彙鎵嬪畬鎴愩傚浣犳墍瑙侊紝鍥犱負琚姩鍏抽棴绔彲鑳戒細灝咥CK鍜孎IN鍚堝埌涓璧峰彂閫侊紝鎵浠ヨ繖涔熺畻涓嶄笂
涓ユ牸鐨勫洓嬈℃彙鎵?--鍥涗釜鎶ユ枃孌點?
鍦ㄥ墠闈㈢殑鏂囩珷涓紝鎴戜竴鐩存病鎻怲CP鐨勭姸鎬佽漿鎹€傚湪榪欓噷鎴戣繕鏄湪鐘硅鮑鏄笉鏄灝嗛偅寮犲洓澶勯氱敤鐨勫浘鎷垮嚭鏉ワ紝
涓嶈繃錛岃繖閲屾垜鍙粰鍑烘柇寮榪炴帴鏃剁殑鐘舵佽漿鎹㈠浘錛屾憳鑷?lt;The TCP/IP Guide>錛?
緇欏嚭涓涓甯稿叧闂椂鐨剋indump淇℃伅錛?br>
14:00:38.819856 IP cd-zhangmin.1748 > 220.181.37.55.80: F 1:1(0) ack 1 win 65535
14:00:38.863989 IP 220.181.37.55.80 > cd-zhangmin.1748: F 1:1(0) ack 2 win 2920
14:00:38.864412 IP cd-zhangmin.1748 > 220.181.37.55.80: . ack 2 win 65535
琛ュ厖緇嗚妭錛?/strong> 鍏充簬浠ヤ笂鐨勫洓嬈℃彙鎵嬶紝鎴戣ˉ鍏呬笅緇嗚妭錛?br>1. 榛樿鎯呭喌涓?涓嶆敼鍙榮ocket閫夐」)錛屽綋浣犺皟鐢╟lose( or closesocket錛屼互涓嬭close涓嶅啀閲嶅)鏃訛紝濡傛灉 鐗瑰埆鐨凾IME_WAIT鐘舵侊細 浠庝互涓奣CP榪炴帴鍏抽棴鐨勭姸鎬佽漿鎹㈠浘鍙互鐪嬪嚭錛屼富鍔ㄥ叧闂殑涓鏂瑰湪鍙戦佸畬瀵瑰鏂笷IN鎶ユ枃鐨勭‘璁?ACK)鎶ユ枃鍚庯紝 浠涔堟槸2MSL錛烳SL鍗矼aximum Segment Lifetime錛屼篃灝辨槸鎶ユ枃鏈澶х敓瀛樻椂闂達紝寮曠敤<TCP/IP璇﹁В>涓殑璇濓細鈥?br>瀹?MSL)鏄換浣曟姤鏂囨琚涪寮冨墠鍦ㄧ綉緇滃唴鐨勬渶闀挎椂闂淬傗濋偅涔堬紝2MSL涔熷氨鏄繖涓椂闂寸殑2鍊嶃傚叾瀹炴垜瑙夊緱娌?br>蹇呰鎶婅繖涓狹SL鐨勭‘鍒囧惈涔夋悶鏄庣櫧錛屼綘鎵闇瑕佹槑鐧界殑鏄紝褰揟CP榪炴帴瀹屾垚鍥涗釜鎶ユ枃孌電殑浜ゆ崲鏃訛紝涓誨姩鍏抽棴鐨?br>涓鏂瑰皢緇х畫絳夊緟涓瀹氭椂闂?2-4鍒嗛挓)錛屽嵆浣夸袱绔殑搴旂敤紼嬪簭緇撴潫銆備綘鍙互鍐欎唬鐮佽瘯璇曪紝鐒跺悗鐢╪etstat鏌ョ湅涓嬨? 涓轟粈涔堥渶瑕?MSL錛熸牴鎹?lt;TCP/IP璇﹁В>鍜?lt;The TCP/IP Guide>涓殑璇存硶錛屾湁涓や釜鍘熷洜錛?br>鍏朵竴錛屼繚璇佸彂閫佺殑ACK浼氭垚鍔熷彂閫佸埌瀵規柟錛屽浣曚繚璇侊紵鎴戣寰楀彲鑳芥槸閫氳繃瓚呮椂璁℃椂鍣ㄥ彂閫併傝繖涓氨寰堥毦鐢?br>浠g爜婕旂ず浜嗐?br>鍏朵簩錛屾姤鏂囧彲鑳戒細琚販娣嗭紝鎰忔濇槸璇達紝鍏朵粬鏃跺欑殑榪炴帴鍙兘浼氳褰撲綔鏈鐨勮繛鎺ャ傜洿鎺ュ紩鐢?lt;The TCP/IP Guide> TIME_WAIT鐘舵佹墍甯︽潵鐨勫獎鍝嶏細 褰撴煇涓繛鎺ョ殑涓绔浜嶵IME_WAIT鐘舵佹椂錛岃榪炴帴灝嗕笉鑳藉啀琚嬌鐢ㄣ備簨瀹炰笂錛屽浜庢垜浠瘮杈冩湁鐜板疄鎰忎箟鐨?br>鏄紝榪欎釜绔彛灝嗕笉鑳藉啀琚嬌鐢ㄣ傛煇涓鍙e浜嶵IME_WAIT鐘舵?鍏跺疄搴旇鏄繖涓繛鎺?鏃訛紝榪欐剰鍛崇潃榪欎釜TCP 瀵逛簬鏈嶅姟鍣ㄨ岃█錛屽鏋滄湇鍔″櫒紿佺劧crash鎺変簡錛岄偅涔堝畠灝嗘棤娉曞啀2MSL鍐呴噸鏂板惎鍔紝鍥犱負bind浼氬け璐ャ傝В鍐寵繖 瀵逛簬TIME_WAIT鐨勬彃鏇詫細 褰撳緩绔嬩竴涓猅CP榪炴帴鏃訛紝鏈嶅姟鍣ㄧ浼氱戶緇敤鍘熸湁绔彛鐩戝惉錛屽悓鏃剁敤榪欎釜绔彛涓庡鎴風閫氫俊銆傝屽鎴風榛樿鎯呭喌 瀵逛簬鏈嶅姟鍣ㄧ錛屽綋璁劇疆浜哠O_REUSEADDR閫夐」鏃訛紝瀹冨彲浠ュ湪2MSL鍐呭惎鍔ㄥ茍listen鎴愬姛銆備絾鏄浜庡鎴風錛屽綋浣?br>鐢╞ind騫惰緗甋O_REUSEADDR鏃訛紝濡傛灉鍦?MSL鍐呭惎鍔紝铏界劧bind浼氭垚鍔燂紝浣嗘槸鍦╳indows騫沖彴涓奵onnect浼氬け璐ャ?br>鑰屽湪linux涓婂垯涓嶅瓨鍦ㄨ繖涓棶棰樸?鎴戠殑瀹為獙騫沖彴錛歸inxp, ubuntu7.10) 瑕佽В鍐硍indows騫沖彴鐨勮繖涓棶棰橈紝鍙互璁劇疆SO_LINGER閫夐」銆係O_LINGER閫夐」鍐沖畾璋冪敤close鏃訛紝TCP鐨勮涓恒?br>SO_LINGER娑夊強鍒發inger緇撴瀯浣擄紝濡傛灉璁劇疆緇撴瀯浣撲腑l_onoff涓洪潪0錛宭_linger涓?錛岄偅涔堣皟鐢╟lose鏃禩CP榪炴帴 濡備綘鎵瑙侊紝榪欐牱鍋氳櫧鐒惰В鍐充簡闂錛屼絾鏄茍涓嶅畨鍏ㄣ傞氳繃浠ヤ笂鏂瑰紡璁劇疆SO_LINGER鐘舵侊紝絳夊悓浜庤緗甋O_DONTLINGER 鏂紑榪炴帴鏃剁殑鎰忓錛?/strong> 榪欎技涔庡彲浠ラ氳繃璁劇疆SO_KEEPALIVE閫夐」鏉ヨВ鍐籌紝涓嶈繃涓嶇煡閬撹繖涓夐」鏄惁瀵逛簬鎵鏈夊鉤鍙伴兘鏈夋晥銆? 鎬葷粨錛?/strong> 涓漢鎰熻錛岃秺鍐欒秺鐑傘傛帴涓嬫潵浼氳鍒癟CP鐨勬暟鎹彂閫侊紝榪欎細娑夊強鍒版粦鍔ㄧ獥鍙e悇縐嶅畾鏃跺櫒涔嬬被鐨勪笢瑗褲傛垜鐪熻瘹
鍙戦佺紦鍐蹭腑榪樻湁鏁版嵁錛孴CP浼氱戶緇妸鏁版嵁鍙戦佸畬銆?br>2. 鍙戦佷簡FIN鍙槸琛ㄧず榪欑涓嶈兘緇х畫鍙戦佹暟鎹?搴旂敤灞備笉鑳藉啀璋冪敤send鍙戦?錛屼絾鏄繕鍙互鎺ユ敹鏁版嵁銆?br>3. 搴旂敤灞傚浣曠煡閬撳绔叧闂紵閫氬父錛屽湪鏈綆鍗曠殑闃誨妯″瀷涓紝褰撲綘璋冪敤recv鏃訛紝濡傛灉榪斿洖0錛屽垯琛ㄧず瀵圭
鍏抽棴銆傚湪榪欎釜鏃跺欓氬父鐨勫仛娉曞氨鏄篃璋冪敤close錛岄偅涔圱CP灞傚氨鍙戦丗IN錛岀戶緇畬鎴愬洓嬈℃彙鎵嬨傚鏋滀綘涓嶈皟鐢?br>close錛岄偅涔堝绔氨浼氬浜嶧IN_WAIT_2鐘舵侊紝鑰屾湰绔垯浼氬浜嶤LOSE_WAIT鐘舵併傝繖涓彲浠ュ啓浠g爜璇曡瘯銆?br>4. 鍦ㄥ緢澶氭椂鍊欙紝TCP榪炴帴鐨勬柇寮閮戒細鐢盩CP灞傝嚜鍔ㄨ繘琛岋紝渚嬪浣燙TRL+C緇堟浣犵殑紼嬪簭錛孴CP榪炴帴渚濈劧浼氭甯稿叧
闂紝浣犲彲浠ュ啓浠g爜璇曡瘯銆?
浼氳繘鍏IME_WAIT鐘舵併俆IME_WAIT鐘舵佷篃縐頒負2MSL鐘舵併?
鐨勮娉曪細The second is to provide a 鈥渂uffering period鈥?between the end of this connection
and any subsequent ones. If not for this period, it is possible that packets from different
connections could be mixed, creating confusion.
榪炴帴騫舵病鏈夋柇寮(瀹屽叏鏂紑)錛岄偅涔堬紝濡傛灉浣燽ind榪欎釜绔彛錛屽氨浼氬け璐ャ?
涓棶棰樼殑涓涓柟娉曞氨鏄緗畇ocket鐨凷O_REUSEADDR閫夐」銆傝繖涓夐」鎰忓懗鐫浣犲彲浠ラ噸鐢ㄤ竴涓湴鍧銆?
涓嬩細浣跨敤涓涓殢鏈虹鍙d笌鏈嶅姟鍣ㄧ鐨勭洃鍚鍙i氫俊銆傛湁鏃跺欙紝涓轟簡鏈嶅姟鍣ㄧ鐨勫畨鍏ㄦэ紝鎴戜滑闇瑕佸瀹㈡埛绔繘琛?br>楠岃瘉錛屽嵆闄愬畾鏌愪釜IP鏌愪釜鐗瑰畾绔彛鐨勫鎴風銆傚鎴風鍙互浣跨敤bind鏉ヤ嬌鐢ㄧ壒瀹氱殑绔彛銆?
浼氱珛鍒繪柇寮錛孴CP涓嶄細灝嗗彂閫佺紦鍐蹭腑鏈彂閫佺殑鏁版嵁鍙戦侊紝鑰屾槸绔嬪嵆鍙戦佷竴涓猂ST鎶ユ枃緇欏鏂癸紝榪欎釜鏃跺橳CP榪?br>鎺ュ氨涓嶄細榪涘叆TIME_WAIT鐘舵併?
鐘舵併?
榪欎釜綆椾笉涓婃柇寮榪炴帴鏃剁殑鎰忓錛屽綋TCP榪炴帴鍙戠敓涓浜涚墿鐞嗕笂鐨勬剰澶栨儏鍐墊椂錛屼緥濡傜綉綰挎柇寮錛宭inux涓婄殑TCP瀹炵幇
浼氫緷鐒惰涓鴻榪炴帴鏈夋晥錛岃寃indows鍒欎細鍦ㄤ竴瀹氭椂闂村悗榪斿洖閿欒淇℃伅銆?
甯屾湜鍚勪綅鑳藉澶氭彁鎰忚銆傚浜嶵CP榪炴帴鐨勬柇寮錛屾垜浠彧瑕佹竻妤氾細
1. 鍦ㄩ粯璁ゆ儏鍐典笅錛岃皟鐢╟lose鏃禩CP浼氱戶緇皢鏁版嵁鍙戦佸畬姣曪紱
2. TIME_WAIT鐘舵佷細瀵艱嚧鐨勯棶棰橈紱
3. 榪炴帴鎰忓鏂紑鏃跺彲鑳戒細鍑虹幇鐨勯棶棰樸?br>4. maybe more...
鍖恒傛垜瀵逛簬褰撳勾閭g鐤媯緙栫▼鐨勫共鍔插緢鏄嚜璞紝鐜板湪宸簡寰堝錛屼互鍓嶅府鍒漢鍋氬皬瀛︾敓緋誨垪娓告垙澶栧寘鐨勬椂鍊欙紝鍙互12灝忔椂鍑?/p>
涓急鏅虹殑灝忔父鎴忥紝閭d簺鏃ュ瓙涓搴﹁鎴戠О涓衡?2灝忔椂緙栫▼鎸戞垬璧涒橈紝鍙槸鑷繁璺熻嚜宸辨瘮璧涖?/p>
姣忎竴嬈″彂甯冨湪GameRes(鎺掗櫎鏃╂湡鐨勯偅浜涘瀮鍦劇帺鎰忥級錛屽湪鍐欑畝浠嬫椂鎴戦兘瑕佹妸鑷繁寮鍙戠敤鐨勬椂闂村啓涓婏紝鍙槸鑴炬皵濂界殑sea_bug
姣忔閮界粰鎴戝垹鎺変簡銆傛垜鑷繁姹囨諱竴涓嬶細
1. 鏈璁╂垜鑷豹鐨勪竴涓父鎴忓紩鎿庯紝鑰楀敖浜嗘垜褰撴椂鎵鏈夌殑璁捐鑳藉姏銆傛垜鍔姏鎶婂畠鍋氬緱寰堝叿鎵╁睍鎬э紝鍙槸蹇界暐浜嗗姛鑳芥с傜幇鍦ㄥ熀鏈笉緇存姢浜嗭紝鍙兘鏄敤鎴風兢澶皯浜嗐傛垜鎯蟲垜榪樻槸娌″仛濂藉惂錛?/p>
鎵榮ea_bug鐨勫繖鎼炰簡涓鍧涳紝鍐鋒竻寰楄鎴戝績瀵?http://bbs.gameres.com/showforum.asp?forumid=91
2. PacShooter3d:
http://data.gameres.com/showmessage.asp?TopicID=90655
涓嶇煡閬撴庝箞鐨勮浜烘斁鍒頒竴涓綉绔欎笂浜嗭細http://noyes.cn/Software.Asp?id=9667
3. Space Demon demo
褰撳垵鐪嬪埌dophi鍐欑殑淇勭綏鏂柟鍧楄惀閫犵殑閭g鎰熻瑙夊緱寰堜笉閿欙紝浜庢槸鍐沖畾璁ょ湡鍦板仛涓父鎴忓嚭鏉ャ傜粨鏋滃悗鏉ュ仛鐨勪笢瑗胯鎴戝緢澶辨湜銆傝繖鏄竴涓湪浠g爜涓婅繃搴﹁璁$殑涓滆タ銆傛垜铏界劧瀵硅繖涓父鎴忎笉婊℃剰錛屼絾鏄垜瀵逛唬鐮佽繕鍩烘湰婊℃剰銆傚悗鏉ヨ繖涓父鎴忕殑浠g爜琚垜娓告垙瀛﹂櫌鐨勪竴涓湅鍙嬫嬁緇欓噾灞辯殑涓涓富紼嬶紙鍦ㄤ粬浠鏍℃暀涔︼紵錛夌湅錛岃繕寰楀埌浜嗚〃鎵?D
榪欎釜娓告垙鎴戞槸鐩存帴寮婧愪簡鐨勶細http://www.gameres.com/showmessage.asp?TopicID=73123
4. Crazy Eggs Clone
<Crazy Eggs>鏄皬鏋楀瓙浠栦滑宸ヤ綔瀹ゅ仛鐨勪笢瑗匡紝灞炰簬casual games錛屾嬁鍒板浗澶栧幓鍗栫殑銆傛垜褰撴椂涔熻寰梒asual games甯傚満涓嶉敊錛岃繕鎵句簡涓編宸ワ紝澶ц皥鐗硅皥錛屽惞鍢樹簡寰堝錛屾渶緇堝湪鍐欑瓥鍒掓鐨勬椂鍊欏け璐ヤ簡銆傛垜褰撴椂蹇冧篃鎳掍簡錛屾渶緇堝け璐ャ?/p>
鍚屾牱鏄湪GameRes涓婏細http://www.gameres.com/showmessage.asp?TopicID=72351
鍚庢潵鎴戜負浜嗗浼爀dge2d錛岀壒鍦版妸榪欎釜娓告垙縐繪鍒版垜鐨勫紩鎿庝笂銆傛垜浠庢潵寰堣嚜璞嚜宸變唬鐮佺殑妯″潡鎬э紝鎵浠ョЩ妞嶈搗鏉ュ緢瀹規槗銆傞櫎浜唀dge2d鐗堟湰錛屾垜榪樺仛浜咹GE鐗堟湰錛屼笉榪嘓GE鐗堟湰鏄仛緇欏埆浜虹殑澶栧寘錛?/p>
5. Brick Shooter Jr
榪欎釜娓告垙涔熸槸鎴戠炕鐗堝埆浜虹殑錛岀敤鐨勫埆浜虹殑緹庢湳+闊充箰璧勬簮錛岃嚜宸遍噸鍐欎唬鐮併傚悗鏉ョ綉涓婃湁涓漢鍙堢敤鎴戠殑璧勬簮緲諱綔浜嗕釜錛屽仛鐨勬瘮鎴戝ソ銆?/p>
http://data.gameres.com/showmessage.asp?TopicID=65654
6. Feeding Frenzy
Popcap鐨勭粡鍏告父鎴忥紝鎴戝仛鐨勫瀮鍦句笢瑗匡紝涓嶆彁鍏朵粬鐨勪簡錛?/p>
http://data.gameres.com/showmessage.asp?TopicID=62796
7.鏄敺浜哄氨涓嬩竴鐧懼眰
瓚呯駭鍙よ佺殑涓滆タ錛岃繖涓笢瑗垮綋鍒濊繕鍜屼笂嫻蜂竴瀹跺箍鍛婂叕鍙稿悎浣滆繃銆傛垜絳劇講浜嗛暱榪欎箞澶х殑絎竴浠藉悎鍚岋紝緇撴灉鍚庢潵涓鍒嗛挶娌℃崬鍒般備粬浠叕鍙哥幇鍦ㄤ篃涓嶅仛榪欎釜浜嗐傚拰鎴戝悎浣滅殑浜у搧緇忕悊鐜板湪璨屼技鍦ㄦ悶媯嬬墝銆?/p>
http://data.gameres.com/showmessage.asp?TopicID=54475
8. 鎵璋撶殑闆風數錛屼竴涓垜鏈鏃╁仛鐨勪笢瑗匡紝鐜板湪浣犲紑baidu鎼滅儲 kevin lynx錛屽嚭鏉ユ渶澶氱殑閾炬帴灝辨槸<闆風數kevinlynx鐗?gt;錛屽埆淇¢偅
浜涳紝鍏ㄦ槸嫻佹皳杞歡銆?/p>
http://data.gameres.com/showmessage.asp?TopicID=54474
鍏朵粬榪樼粰鍒漢鍋氫簡涓浜涘鍖咃紝鍦ㄦ鐗瑰埆鎰熻阿鍝嗗暒G姊﹁佸ぇ錛岀粰鎴戞壘浜嗗緢澶氬伐浣溿備粬榪欎釜浜哄洓澶勮煩宸紝榪樼粰鎴戣浜嗗嚑嬈″伐浣溿?/p>
鍙槸鎴戣繕鎯蟲殏鏃剁暀鍦ㄦ垚閮斤紝鎵浠ラ兘鎷掔粷浜嗐傞偅浜涘鍖呭仛鐨勯兘姣旇緝鍨冨溇錛屽仛鍒板悗鏉ュ熀鏈湁涓皬娓告垙妗嗘灦浜嗐傜増鏉冮棶棰樺彲鑳戒笉
鑳藉彂甯冨嚭鏉ュ惂銆?/p>
鍑嗗錛?/strong> 鍦ㄨ繖閲屾湰鏂囧皢閬靛驚涓婁竴綃囨枃绔犵殑椋庢牸錛屽彧鎻怲CP鍗忚涓殑瑕佺偣錛岃繖鏍鋒垜瑙夊緱鍙互鏇村鏄撳湴鎺屾彙TCP銆傛垨鑰?br>鏍規湰璋堜笉涓婃帉鎻★紝瀵逛簬榪欑綰悊璁虹殑涓滆タ錛屽嵆浣夸綘鐜板湪鎺屾彙浜嗗啀澶氱殑緇嗚妭錛屼竴孌墊椂闂村悗涔熶細娣″繕銆? 鍦ㄤ互鍚庡悇縐嶇粏鑺備腑錛屽洜涓烘垜浠細娑夊強鍒板垎鏋愪竴浜汿CP涓殑鏁版嵁鎶ワ紝鍥犳涓涓崗璁寘鎴幏宸ュ叿蹇呬笉鍙皯銆傚湪 鍏充簬WinDump鐨勫叿浣撶敤娉曚綘鍙互浠庣綉涓婂叾浠栧湴鏂硅幏鍙栵紝榪欓噷鎴戝彧紼嶅井鎻愪竴涓嬨傝璁¦inDump寮濮嬬洃鍚暟鎹紝 鑾峰彇褰撳墠鏈哄櫒涓婄殑緗戠粶鎺ュ彛銆傜劧鍚庝嬌鐢細 寮濮嬪緗戠粶鎺ュ彛2鐨勬暟鎹洃鍚倃indump濡傚悓tcpdump(鍏跺疄灝辨槸tcpdump)涓鏍鋒敮鎸佽繃婊よ〃杈懼紡錛寃indump 閭d箞windump鍙細鏄劇ず绔彛鍙蜂負4000鐨勭綉緇滄暟鎹? 搴忓彿鍜岀‘璁ゅ彿錛?/strong> 瑕佽瑙CP鐨勫緩绔嬭繃紼嬶紝涔熷氨鏄偅涓墍璋撶殑涓夋鎻℃墜錛屽氨浼氭秹鍙婂埌搴忓彿鍜岀‘璁ゅ彿榪欎袱涓笢瑗褲傜炕涔﹀埌TCP 鎺ョ潃鐪嬶紝紜鍙鋒槸浠涔堬紵鍥犱負TCP浼氬鎺ユ敹鍒扮殑鏁版嵁鍖呰繘琛岀‘璁わ紝鍙戦佺‘璁ゆ暟鎹寘鏃訛紝灝變細璁劇疆榪欎釜紜鍙鳳紝 澶ч儴鍒嗕功涓婂湪璁茬‘璁ゅ彿鍜屽簭鍙鋒椂錛岄兘浼氳紜鍙鋒槸搴忓彿鍔犱竴銆傝繖鍏跺疄鏈夌偣璇В浜猴紝鎵浠ユ垜鎵嶅湪榪欓噷搴熻瘽浜?br>鍗婂ぉ(楂樻墜瀹藉涓?D)銆? 寮濮嬩笁嬈℃彙鎵嬶細 濡傛灉浣犺繕涓嶄細綆鍗曠殑tcp socket緙栫▼錛屾垜寤鴻浣犲厛鍘誨瀛︼紝榪欏氨濂芥瘮浣犱笉浼欳++鍩烘湰璇硶錛屽氨鍒幓鐮旂┒vtable 涓夋鎻℃墜寮濮嬩簬瀹㈡埛绔瘯鍥捐繛鎺ユ湇鍔″櫒绔傚綋浣犺皟鐢ㄨ濡俢onnect鐨勫嚱鏁版椂錛屾甯告儏鍐典笅灝變細寮濮嬩笁嬈℃彙鎵嬨?br>闅忎究鍦ㄧ綉涓婃壘寮犱笁嬈℃彙鎵嬬殑鍥撅細 濡傚墠鏂囨墍榪幫紝涓夋鎻℃墜涔熷氨鏄駭鐢熶簡涓変釜鏁版嵁鍖呫傚鎴風涓誨姩榪炴帴錛屽彂閫丼YN琚緗簡鐨勬姤鏂?娉ㄦ剰搴忓彿鍜?br>紜鍙鳳紝鍥犱負榪欓噷涓嶅寘鍚敤鎴鋒暟鎹紝鎵浠ュ簭鍙峰拰紜鍙峰氨鏄姞涓鍑忎竴鐨勫叧緋?銆傛湇鍔″櫒绔敹鍒拌鎶ユ枃鏃訛紝姝?br>甯告儏鍐典笅灝卞彂閫丼YN鍜孉CK琚緗簡鐨勬姤鏂囦綔涓虹‘璁わ紝浠ュ強鍛婅瘔瀹㈡埛绔細鎴戞兂鎵撳紑鎴戣繖杈圭殑榪炴帴(鍙屽伐)銆傚鎴?br>绔簬鏄啀瀵規湇鍔″櫒绔殑SYN榪涜紜錛屼簬鏄啀鍙戦丄CK鎶ユ枃銆傜劧鍚庤繛鎺ュ緩绔嬪畬姣曘傚浜庨樆濉炲紡socket鑰岃█錛屼綘 鍦ㄨ繘琛屼簡閾哄ぉ鐩栧湴鐨勭綏鍒╁反绱㈢殑鍩虹姒傚康鐨勮瑙e悗錛岀湅鐪嬭繖涓繛鎺ュ緩绔嬬殑榪囩▼錛屾槸涓嶆槸綆鍗曞緱鍑犺繎鏃犺亰錛? 鎴戜滑鏉ュ疄闄呯偣錛屽啓涓渶綆鍗曠殑瀹㈡埛绔唬鐮侊細 濡備綍鍒嗘瀽windump鐨勭粨鏋滐紝寤鴻鍙傜湅<tcp/ip璇﹁В>涓浜巘cpdump鐨勬弿榪般? 寤虹珛榪炴帴鐨勯檮鍔犱俊鎭細 铏界劧SYN銆丄CK涔嬬被鐨勬姤鏂囨病鏈夌敤鎴鋒暟鎹紝浣嗘槸TCP榪樻槸闄勫姞浜嗗叾浠栦俊鎭傛渶涓洪噸瑕佺殑灝辨槸闄勫姞鐨凪SS鍊箋傝繖涓?br>鍙互琚崗鍟嗙殑MSS鍊煎熀鏈笂灝卞彧鍦ㄥ緩绔嬭繛鎺ユ椂鍗忓晢銆傚浠ヤ笂鏁版嵁琛ㄧず錛孧SS涓?460瀛楄妭銆? 榪炴帴鐨勬剰澶栵細 榪炴帴鐨勬剰澶栨垜澶ц嚧鍒嗕負涓ょ鎯呭喌(涔熻榪樻湁鏇村鎯呭喌)錛氱洰鐨勪富鏈轟笉鍙揪銆佺洰鐨勪富鏈哄茍娌℃湁鍦ㄦ寚瀹氱鍙g洃鍚?br>褰撶洰鐨勪富鏈轟笉鍙揪鏃訛紝涔熷氨鏄錛孲YN鎶ユ枃孌墊牴鏈棤娉曞埌杈懼鏂?濡傛灉浣犵殑鏈哄櫒鏍規湰娌℃彃緗戠嚎錛屼綘灝變笉鍙揪)錛?br>閭d箞TCP鏀朵笉鍒頒換浣曞洖澶嶆姤鏂囥傝繖涓椂鍊欙紝浣犱細鐪嬪埌TCP涓殑瀹氭椂鍣ㄦ満鍒跺嚭鐜頒簡銆俆CP瀵瑰彂鍑虹殑SYN鎶ユ枃榪涜 鍙戝嚭浜嗕笁涓簭鍙蜂竴鏍風殑SYN鎶ユ枃錛屼絾鏄病鏈夊緱鍒頒竴涓洖澶嶆姤鏂?搴熻瘽)銆傛瘡涓涓猄YN鎶ユ枃涔嬮棿鐨勯棿闅旀椂闂撮兘鏄?br>鏈夎寰嬬殑錛屽湪windows涓婃槸3縐?縐?縐?2縐掋備笂闈㈢殑鏁版嵁浣犵湅涓嶅埌12縐掕繖涓暟鎹紝鍥犱負榪欐槸絎笁涓姤鏂囧彂鍑虹殑 (鎴戝己鐑堝緩璁綘鑳借繍琛寃indump鍘昏瘯楠岃繖閲屾彁鍒扮殑姣忎竴涓幇璞★紝濡傛灉浣犲湪ubuntu涓嬩嬌鐢╰cpdump錛岃浣弒udo :D) 鍑虹幇鎰忓鐨勭浜岀鎯呭喌鏄鏋滀富鏈烘暟鎹寘鍙揪錛屼絾鏄瘯鍥捐繛鎺ョ殑绔彛鏍規湰娌℃湁鐩戝惉錛岄偅涔堝彂閫丼YN鎶ユ枃鐨勮繖 鍙互鐪嬪嚭錛?AURORA-CCTEST.7100榪斿洖浜哛ST鎶ユ枃緇欐垜錛屼絾鏄垜榪欒竟鏍規湰涓嶅湪涔庤繖涓姤鏂囷紝緇х畫鍙戦丼YN鎶ユ枃銆?br>涓夋榪囧悗connect灝辮繑鍥炰簡銆?鏁版嵁鍙嶆槧鐨勪簨瀹炴槸榪欐牱) 鍏充簬listen: TCP鏈嶅姟鍣ㄧ浼氱淮鎶や竴涓柊榪炴帴鐨勯槦鍒椼傚綋鏂拌繛鎺ヤ笂鐨勫鎴風涓夋鎻℃墜瀹屾垚鏃訛紝灝變細灝嗗叾鏀懼叆榪欎釜闃熷垪銆傝繖涓槦 鍒楃殑澶у皬鏄氳繃listen璁劇疆鐨勩傚綋榪欎釜闃熷垪婊℃椂錛屽鏋滄湁鏂扮殑瀹㈡埛绔瘯鍥捐繛鎺ワ紙鍙戦丼YN錛夛紝鏈嶅姟鍣ㄧ涓㈠純鎶ユ枃錛? 鍚屾椂涓嶅仛浠諱綍鍥炲銆? 鎬葷粨錛?/strong>
<TCP/IP璇﹁В>涓竴鐩翠嬌鐢╰cpdump銆傝繖閲屽洜涓烘垜鐨勭郴緇熸槸windows錛屾墍浠ュ彧濂戒嬌鐢╳indows騫沖彴鐨則cpdump錛?br>涔熷氨鏄?a target="_blank">WinDump銆傚湪浣跨敤WinDump涔嬪墠錛屼綘闇瑕佸畨瑁呰紼嬪簭浣跨敤鐨勫簱WinpCap銆?
棣栧厛闇瑕佺‘瀹氳鍏剁洃鍚摢涓涓綉緇滆澶?鎴栬呰鏄綉緇滄帴鍙?銆備綘鍙互:
windump -D
windump -i 2
灝嗕細鏍規嵁浣犳彁渚涚殑榪囨護琛ㄨ揪寮忚繃婊や笉闇瑕佺殑緗戠粶鏁版嵁鍖咃紝渚嬪錛?
windump -i 2 port 4000
鐨勬姤鏂囧ご錛屾湁涓や釜寰堥噸瑕佺殑鍩?閮芥槸32浣?灝辨槸搴忓彿鍩熷拰紜鍙峰煙銆傚彲鑳芥湁浜涘悓瀛︿細瀵筎CP閭d釜鎶ユ枃澶存湁鎵
鐤戞儜(鑳界湅鎳傛垜鍦ㄨ浠涔堢殑浼氫駭鐢熻繖鏍風殑鐤戞儜涔堬紵)錛岃繖閲屾垜鍙互鍛婅瘔浣狅紝浣犲彲浠ュ亣鎯砊CP鐨勬姤鏂囧ご灝辨槸涓?br>C璇█緇撴瀯浣?鍋囨兂鑰屽凡錛屽幓緲葷炕bsd瀵筎CP鐨勫疄鐜幫紝鑲畾娌¤繖涔堢畝鍗?錛岄偅涔堝ぇ鑷翠笂錛屾墍璋撶殑TCP鎶ユ枃澶村氨鏄細
typedef struct _tcp_header
{
/// 16浣嶆簮绔彛鍙?/span>
unsigned short src_port;
/// 16浣嶇洰鐨勭鍙e彿
unsigned short dst_port;
/// 32浣嶅簭鍙?/span>
unsigned long seq_num;
/// 32浣嶇‘璁ゅ彿
unsigned long ack_num;
/// 16浣嶆爣蹇椾綅[4浣嶉閮ㄩ暱搴︼紝淇濈暀6浣嶏紝ACK銆丼YN涔嬬被鐨勬爣蹇椾綅]
unsigned short flag;
/// 16浣嶇獥鍙eぇ灝?/span>
unsigned short win_size;
/// 16浣嶆牎楠屽拰
short crc_sum;
/// 16浣嶇揣鎬ユ寚閽?/span>
short ptr;
/// 鍙夐夐」
/// how to implement this ?
} tcp_header; 
閭d箞錛岃繖涓簭鍙峰拰紜鍙鋒槸浠涔堬紵TCP鎶ユ枃涓烘瘡涓涓瓧鑺傞兘璁劇疆涓涓簭鍙鳳紝瑙夊緱寰堝鎬紵榪欓噷騫朵笉鏄負姣忎竴
瀛楄妭闄勫姞涓涓簭鍙?閭d細鏄涔堝彲絎戠殑緙栫▼鎵嬫硶?)錛岃屾槸涓轟竴涓猅CP鎶ユ枃闄勫姞涓涓簭鍙鳳紝榪欎釜搴忓彿琛ㄧず鎶ユ枃
涓暟鎹殑絎竴涓瓧鑺傜殑搴忓彿錛岃屽叾浠栨暟鎹垯鏄牴鎹絎竴涓暟鎹殑鍋忕Щ鏉ュ喅瀹氬簭鍙風殑錛屼緥濡傦紝鐜板湪鏈夋暟鎹細
abcd銆傚鏋滆繖孌墊暟鎹殑搴忓彿涓?200錛岄偅涔坅鐨勫簭鍙峰氨鏄?200錛宐鐨勫簭鍙峰氨鏄?201銆傝孴CP鍙戦佺殑涓嬩竴涓暟鎹寘
鐨勫簭鍙峰氨浼氭槸涓婁竴涓暟鎹寘鏈鍚庝竴涓瓧鑺傜殑搴忓彿鍔犱竴銆備緥濡俥fghi鏄痑bcd鐨勪笅涓涓暟鎹寘錛岄偅涔堝畠鐨勫簭鍙峰氨
鏄?204銆傞氳繃榪欑鐪嬩技綆鍗曠殑鏂規硶錛孴CP灝卞疄鐜頒簡涓烘瘡涓涓瓧鑺傝緗簭鍙風殑鍔熻兘(緇堜簬鏄庣櫧涓轟粈涔堜功涓婅鍛婅瘔
鎴戜滑鈥樹負姣忎竴涓瓧鑺傝緗竴涓簭鍙封欎簡鍚?)銆傛敞鎰忥紝璁劇疆搴忓彿鏄竴縐嶅彲浠ヨTCP鎴愪負鈥欏彲闈犲崗璁樼殑鎵嬫銆?br>TCP涓悇縐嶄貢涓冨叓緋熺殑涓滆タ閮芥槸鏈夌洰鐨勭殑錛屽ぇ閮ㄥ垎鐩殑榪樻槸涓轟簡鈥欏彲闈犫樹袱涓瓧銆傚埆鎶奣CP鐪嬮珮娣變簡錛屽鏋?br>璁╀綘鏉ヨ璁′竴涓綉緇滃崗璁紝鐩殑闇瑕佸憡璇変綘鏄欏彲闈犵殑鈥橈紝浣犲氨浼氭槑鐧戒負浠涔堜細浜х敓閭d簺涔變竷鍏碂鐨勪笢瑗夸簡銆?
紜鍙烽氬父琛ㄧず鎺ユ敹鏂瑰笇鏈涙帴鏀跺埌鐨勪笅涓孌墊姤鏂囩殑搴忓彿銆備緥濡傛煇涓嬈℃帴鏀舵柟鏀跺埌搴忓彿涓?200鐨?瀛楄妭鏁頒婦鎶ワ紝
閭d箞瀹冨彂閫佺‘璁ゆ姤鏂囩粰鍙戦佹柟鏃訛紝灝變細璁劇疆紜鍙蜂負1204銆?
涔嬬被銆?
鐨刢onnect鍙兘灝辮繑鍥炴垚鍔熺粰浣犮?
sockaddr_in addr;
memset( &addr, 0, sizeof( addr ) );
addr.sin_family = AF_INET;
addr.sin_port = htons( 80 );
/// 220.181.37.55
addr.sin_addr.s_addr = inet_addr( "220.181.37.55" );
printf( "%s : connecting to server.\n", _str_time() );
int err = connect( s, (sockaddr*) &addr, sizeof( addr ) ); 
涓昏灝辨槸connect銆傝繍琛岀▼搴忓墠鎴戜滑榪愯windump錛?
windump -i 2 host 220.181.37.55
00:38:22.979229 IP noname.domain.4397 > 220.181.37.55.80: S 2523219966:2523219966(0) win 65535 <mss 1460,nop,nop,sackOK>
00:38:23.024254 IP 220.181.37.55.80 > noname.domain.4397: S 1277008647:1277008647(0) ack 2523219967 win 2920 <mss 1440,nop,nop,sackOK>
00:38:23.024338 IP noname.domain.4397 > 220.181.37.55.80: . ack 1 win 65535 

璁℃椂錛屽綋鍦ㄦ寚瀹氭椂闂村唴娌℃湁寰楀埌鍥炲鎶ユ枃鏃訛紝TCP灝變細閲嶄紶鍒氭墠鐨凷YN鎶ユ枃銆傞氬父錛屽悇縐嶄笉鍚岀殑TCP瀹炵幇瀵逛簬
榪欎釜瓚呮椂鍊奸兘涓嶅悓錛屼絾鏄嵁鎴戣瀵燂紝閲嶄紶嬈℃暟鍩烘湰涓婇兘鏄?嬈°備緥濡傦紝鎴戣繛鎺ヤ竴涓笉鍙揪鐨勪富鏈猴細
12:39:50.560690 IP cd-zhangmin.1573 > 220.181.37.55.1024: S 3117975575:3117975575(0) win 65535 <mss 1460,nop,nop,sackOK>
12:39:53.538734 IP cd-zhangmin.1573 > 220.181.37.55.1024: S 3117975575:3117975575(0) win 65535 <mss 1460,nop,nop,sackOK>
12:39:59.663726 IP cd-zhangmin.1573 > 220.181.37.55.1024: S 3117975575:3117975575(0) win 65535 <mss 1460,nop,nop,sackOK>
鏃墮棿鍜宑onnect榪斿洖閿欒淇℃伅鏃剁殑鏃墮棿涔嬪樊銆傚彟涓鏂歸潰錛屽鏋滆繛鎺ュ悓涓涓綉緇滐紝榪欎釜闂撮殧鏃墮棿鍙堜笉鍚屻備緥濡?br>鐩存帴榪炲眬鍩熺綉錛岄棿闅旀椂闂村氨宸笉澶氫負500ms銆?
鏂逛細鏀跺埌RST琚緗殑鎶ユ枃(connect涔熶細榪斿洖鐩稿簲鐨勪俊鎭粰浣?錛屼緥濡傦細
13:37:22.202532 IP cd-zhangmin.1658 > 7AURORA-CCTEST.7100: S 2417354281:2417354281(0) win 65535 <mss 1460,nop,nop,sackOK>
13:37:22.202627 IP 7AURORA-CCTEST.7100 > cd-zhangmin.1658: R 0:0(0) ack 2417354282 win 0
13:37:22.711415 IP cd-zhangmin.1658 > 7AURORA-CCTEST.7100: S 2417354281:2417354281(0) win 65535 <mss 1460,nop,nop,sackOK>
13:37:22.711498 IP 7AURORA-CCTEST.7100 > cd-zhangmin.1658: R 0:0(0) ack 1 win 0
13:37:23.367733 IP cd-zhangmin.1658 > 7AURORA-CCTEST.7100: S 2417354281:2417354281(0) win 65535 <mss 1460,nop,nop,sackOK>
13:37:23.367826 IP 7AURORA-CCTEST.7100 > cd-zhangmin.1658: R 0:0(0) ack 1 win 0
TCP榪炴帴鐨勫緩绔嬬殑鐩稿叧瑕佺偣灝辨槸榪欎簺(or more?)銆傛甯告儏鍐典笅灝辨槸涓夋鎻℃墜錛岄潪姝e父鎯呭喌涓嬪氨鏄疭YN涓夋瓚呮椂錛?br>浠ュ強鏀跺埌RST鎶ユ枃鍗磋蹇界暐銆?
棰勮鏂伴」鐩細閫夋嫨lua鎴杙ython涔嬩竴浣滀負娓告垙鐨勮剼鏈璦銆備互鍓嶈崏鑽夊湴鎺ヨЕ榪囪繖涓ら棬璇█錛屽浜庤娉曪紝浠ュ強宓屽叆榪汣/C++紼嬪簭閮芥湁鐐規劅鎬т笂鐨勮璇嗐傚彲鑳芥槸鍙椼奤NIX緙栫▼鑹烘湳銆嬩腑KISS鍘熷垯鐨勫獎鍝嶏紝鐜板湪鎬誨枩嬈㈢畝媧佺殑涓滆タ銆傛墍浠ユ垜涓漢姣旇緝鍋忓悜浜庝嬌鐢╨ua銆?/p>
榪欎袱澶╃炕浜嗕笅緗戠粶涓婄殑璧勬枡錛屽湪lua鐨剋iki涓婄湅鍒頒竴綃囨瘮杈僱ua鍜宲ython鐨?a >鏂囩珷錛岃崏鑽夊湴緲昏瘧鍑鴻鐐癸細
Python:
1. 鎵╁睍搴撳緢澶氾紝璧勬枡寰堝
2. 鏁板艱綆楁瘮杈冨己澶э紝鏀寔澶氱淮鏁扮粍錛岃宭ua娌℃湁鏁扮粍綾誨瀷
3. 鏈韓甯︾殑c綾誨瀷(?)鏀寔澶勭悊鍔ㄦ侀摼鎺ュ簱錛屼笉闇瑕佽繘琛孋灝佽(C鎵╁睍)
4. 榪滅▼璋冭瘯鍣紝浼間箮lua鎵╁睍宸ュ叿鏀寔
5. 鑷劧璇█浼肩殑璇硶
6. 瀵逛簬string鍜宭ist鐨勬敮鎸侊紝lua鍙互閫氳繃鎵╁睍搴撳疄鐜?br>7. 瀵箄nicode鐨勬敮鎸?br>8. 絀烘牸鏁忔劅(浠g爜涓嶅拷鐣ョ┖鏍?錛岃繖鍏跺疄鍙互浣縫ython鐨勪唬鐮侀鏍肩湅璧鋒潵鏇村ソ涓鐐?br>9. 鍐呭緩浣嶆搷浣滐紝lua鍙互閫氳繃鎵╁睍搴撴敮鎸?br>10.璇█鏈韓瀵歸敊璇殑澶勭悊瑕佸ソ浜涳紝鍙互鏈夋晥鍑忓皯紼嬪簭閿欒
11.鍒濈駭鏂囨。姣攍ua澶?br>12.瀵歸潰鍚戝璞℃敮鎸佹洿濂?
Lua:
1. 姣攑ython灝忓閥寰堝(鍖呮嫭緙栬瘧鍑烘潵鐨勮繍琛屾椂搴?
2. 鍗犵敤鏇村皬鐨勫唴瀛?br>3. 瑙i噴鍣ㄩ熷害鏇村揩
4. 姣攑ython鏇村鏄撻泦鎴愬埌C璇█涓?br>5. 瀵逛簬瀵硅薄涓嶄嬌鐢ㄥ紩鐢ㄨ鏁?寮曠敤璁℃暟浼氬鑷存洿澶氱殑闂錛?
6. lua鏃╂湡瀹氫綅浜庝竴縐嶉厤緗璦(浣滀負閰嶇疆鏂囦歡)錛屽洜姝ゆ瘮璧穚ython鏉ユ洿瀹規槗閰嶇疆鏁版嵁
7. 璇█鏇存紓浜?nice)銆佺畝鍗?simple)銆佸己澶?powerful)銆?br>8. lua鏀寔澶氱嚎紼嬶紝姣忎釜綰跨▼鍙互閰嶇疆鐙珛鐨勮В閲婂櫒錛屽洜姝ua鏇撮傚悎浜庨泦鎴愯繘澶氱嚎紼嬬▼搴?br>9. 瀵圭┖鏍間笉鏁忔劅錛屼笉鐢ㄦ媴蹇冪紪杈戝櫒浼氬皢tab鏇挎崲鎴愮┖鏍?
Useful Comments:
1. Everything is an object allocated on the heap in Python, including numbers. (So 123+456 creates a new heap object).
2. lua瀵逛簬coroutine鐨勬敮鎸佹洿閫傜敤浜庡祵鍏ヨ繘娓告垙錛岃櫧鐒秔ython涔熸湁錛屼絾鏄茍娌℃湁鍖呭惈榪涙牳蹇冩ā鍧?
3.Python was a language better suited to Game AI
鏈潵鎯沖幓鎵劇偣瀵逛簬python鐨勬闈㈣祫鏂?宓屽叆榪涙父鎴忚繖鏂歸潰錛夛紝浣嗘槸灞呯劧娌℃壘鍒般傚瑙傚湴璇村鏋滃崟鐙敤python鍋氬簲鐢紝python榪樻槸寰堟湁浼樺娍銆傜幇鍦ㄥ績鎰忓凡鍐籌紝搴旇鍚憀eader鎺ㄨ崘lua銆?/p>
ps錛屽笇鏈涜兘琛ュ厖浠ヤ笂涓ょ璇█鐨勭壒鐐廣?/p>
On regular intervals, it forms segments to be transmitted using IP. The size of the segment is
controlled by two primary factors. The first issue is that there is an overall limit to the size
of a segment, chosen to prevent unnecessary fragmentation at the IP layer. This is governed by a
parameter called the maximum segment size (MSS), which is determined during connection establishment.
The second is that TCP is designed so that once a connection is set up, each of the devices tells the
other how much data it is ready to accept at any given time. If this is lower than the MSS value, a
smaller segment must be sent. This is part of the sliding window system described in the next topic.
Since TCP works with individual bytes of data rather than discrete messages, it must use an
identification scheme that works at the byte level to implement its data transmission and tracking
system. This is accomplished by assigning each byte TCP processes a sequence number.
Since applications send data to TCP as a stream of bytes and not prepackaged messages, each
application must use its own scheme to determine where one application data element ends and the
next begins.
--------------------------------------------------------------------------------------------------------------------------------------------------------
TCP MSS:
http://www.tcpipguide.com/free/t_TCPMaximumSegmentSizeMSSandRelationshiptoIPDatagra.htm
In addition to the dictates of the current window size, each TCP device also has associated
with it a ceiling on TCP size鈥攁 segment size that will never be exceeded regardless of how
large the current window is. This is called the maximum segment size (MSS). When deciding
how much data to put into a segment, each device in the TCP connection will choose the amount
based on the current window size, in conjunction with the various algorithms described in
the reliability section, but it will never be so large that the amount of data exceeds the
MSS of the device to which it is sending.
Note: I need to point out that the name “maximum segment size” is in fact misleading. The
value actually refers to the maximum amount of data that a segment can hold鈥攊t does not
include the TCP headers. So if the MSS is 100, the actual maximum segment size could be 120
(for a regular TCP header) or larger (if the segment includes TCP options).
This was computed by starting with the minimum MTU for IP networks of 576.
Devices can indicate that they wish to use a different MSS value from the default by including
a Maximum Segment Size option in the SYN message they use to establish a connection. Each
device in the connection may use a different MSS value.
--------------------------------------------------------------------------------------------------------------------------------------------------------
delayed ACK algorithm
http://tangentsoft.net/wskfaq/intermediate.html#delayed-ack
In a simpleminded implementation of TCP, every data packet that comes in is immediately acknowledged
with an ACK packet. (ACKs help to provide the reliability TCP promises.)
In modern stacks, ACKs are delayed for a short time (up to 200ms, typically) for three reasons: a)
to avoid the silly window syndrome; b) to allow ACKs to piggyback on a reply frame if one is ready
to go when the stack decides to do the ACK; and c) to allow the stack to send one ACK for several
frames, if those frames arrive within the delay period.
The stack is only allowed to delay ACKs for up to 2 frames of data.
--------------------------------------------------------------------------------------------------------------------------------------------------------
Nagle algorithm:
Nagle's algorithm, named after John Nagle, is a means of improving the efficiency of TCP/IP networks by reducing the number of packets that need to be sent over the network.
Nagle's document, Congestion Control in IP/TCP Internetworks (RFC896) describes what he called the 'small packet problem', where an application repeatedly emits data in small chunks, frequently only 1 byte in size. Since TCP packets have a 40 byte header (20 bytes for TCP, 20 bytes for IPv4), this results in a 41 byte packet for 1 byte of useful information, a huge overhead. This situation often occurs in Telnet sessions, where most keypresses generate a single byte of data which is transmitted immediately. Worse, over slow links, many such packets can be in transit at the same time, potentially leading to congestion collapse.
Nagle's algorithm works by coalescing a number of small outgoing messages, and sending them all at once. Specifically, as long as there is a sent packet for which the sender has received no acknowledgment, the sender should keep buffering its output until it has a full packet's worth of output, so that output can be sent all at once.
[edit] Algorithm
if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if
where MSS = Maximum segment size
This algorithm interacts badly with TCP delayed acknowledgments, a feature introduced into TCP at roughly the same time in the early 1980s, but by a different group. With both algorithms enabled, applications which do two successive writes to a TCP connection, followed by a read, experience a constant delay of up to 500 milliseconds, the "ACK delay". For this reason, TCP implementations usually provide applications with an interface to disable the Nagle algorithm. This is typically called the TCP_NODELAY option. The first major application to run into this problem was the X Window System.
The tinygram problem and silly window syndrome are sometimes confused. The tinygram problem occurs when the window is almost empty. Silly window syndrome occurs when the window is almost full
===================================================================================================================================
3.17 - What is the Nagle algorithm?
The Nagle algorithm is an optimization to TCP that makes the stack wait until all data is acknowledged on the connection before it sends more data. The exception is that Nagle will not cause the stack to wait for an ACK if it has enough enqueued data that it can fill a network frame. (Without this exception, the Nagle algorithm would effectively disable TCP's sliding window algorithm.) For a full description of the Nagle algorithm, see RFC 896.
So, you ask, what's the purpose of the Nagle algorithm?
The ideal case in networking is that each program always sends a full frame of data with each call to send(). That maximizes the percentage of useful program data in a packet.
The basic TCP and IPv4 headers are 20 bytes each. The worst case protocol overhead percentage, therefore, is 40/41, or 98%. Since the maximum amount of data in an Ethernet frame is 1500 bytes, the best case protocol overhead percentage is 40/1500, less than 3%.
While the Nagle algorithm is causing the stack to wait for data to be ACKed by the remote peer, the local program can make more calls to send(). Because TCP is a stream protocol, it can coalesce the data in those send() calls into a single TCP packet, increasing the percentage of useful data.
Imagine a simple Telnet program: the bulk of a Telnet conversation consists of sending one character, and receiving an echo of that character back from the remote host. Without the Nagle algorithm, this results in TCP's worst case: one byte of user data wrapped in dozens of bytes of protocol overhead. With the Nagle algorithm enabled, the TCP stack won't send that one Telnet character out until the previous characters have all been acknowledged. By then, the user may well have typed another character or two, reducing the relative protocol overhead.
This simple optimization interacts with other features of the TCP protocol suite, too:
Most stacks implement the delayed ACK algorithm: this causes the remote stack to delay ACKs under certain circumstances, which allows the local stack a bit of time to "Nagle" some more bytes into a single packet.
The Nagle algorithm tends to improve the percentage of useful data in packets more on slow networks than on fast networks, because ACKs take longer to come back.
TCP allows an ACK packet to also contain data. If the local stack decides it needs to send out an ACK packet and the Nagle algorithm has caused data to build up in the output buffer, the enqueued data will go out along with the ACK packet.
The Nagle algorithm is on by default in Winsock, but it can be turned off on a per-socket basis with the TCP_NODELAY option of setsockopt(). This option should not be turned off except in a very few situations.
Beware of depending on the Nagle algorithm too heavily. send() is a kernel function, so every call to send() takes much more time than for a regular function call. Your application should coalesce its own data as much as is practical to minimize the number of calls to send().
--------------------------------------------------------------------------------------------------------------------------------------------------------
Sliding Window Acknowledgment System :
http://www.tcpipguide.com/free/t_TCPSlidingWindowAcknowledgmentSystemForDataTranspo.htm
--------------------------------------------------------------------------------------------
A basic technique for ensuring reliability in communications uses a rule that requires a
device to send back an acknowledgment each time it successfully receives a transmission.
If a transmission is not acknowledged after a period of time, it is retransmitted by its
sender. This system is called positive acknowledgment with retransmission (PAR). One
drawback with this basic scheme is that the transmitter cannot send a second message
until the first has been acknowledged.
--------------------------------------------------------------------------------------------
http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html
The sliding window serves several purposes:
(1) it guarantees the reliable delivery of data
(2) it ensures that the data is delivered in order,
(3) it enforces flow control between the sender and the receiver.
------------------to be continued
Author: Kevin Lynx
Ascent鏄疻oW鐨勬湇鍔″櫒妯℃嫙鍣紝浣犲彲浠ヤ粠瀹冪殑SVN涓婅幏鍙栧畠鐨勫叏閮ㄤ唬鐮侊紝騫朵粠瀹冪殑WIKI欏甸潰鑾峰彇鏋舵瀯璧鋒暣涓湇鍔″櫒鐨勭浉鍏蟲楠ゃ?/p>
鍩烘湰鏋舵瀯錛?o:p>
Ascent緗戠粶妯″潡鏍稿績鐨勫嚑涓被鍏崇郴濡備笅鍥炬墍紺猴細

ThreadBase灞炰簬Ascent綰跨▼姹犳ā鍧椾腑鐨勭被錛屽畠瀹炵幇浜嗕竴涓猨ob綾伙紝褰撳叾琚姞鍏ュ埌綰跨▼姹犱腑寮濮嬫墽琛屾椂錛岀嚎紼嬫睜綆$悊鍣ㄤ細涓哄叾鍒嗛厤涓涓嚎紼嬶紙濡傛灉鏈夌嚎紼嬭祫婧愶級騫跺鎬佽皟鐢ㄥ埌ThreadBase媧劇敓綾葷殑run鍑芥暟銆?/p>
SocketWorkerThread鐢ㄤ互浠h〃IOCP緗戠粶妯″瀷涓殑涓涓伐浣滆呯嚎紼嬶紝瀹冧細浠嶪OCP緇撴灉闃熷垪閲屽彇鍑哄紓姝O鐨勬搷浣滅粨鏋溿傝繖閲岀殑IOCP浣跨敤鐨勫畬鎴愰敭鏄疭ocket瀵硅薄鎸囬拡銆係ocketWorkerThread鑾峰彇鍒癐O鎿嶄綔緇撴灉鍚庯紝鏍規嵁鑾峰緱鐨勫畬鎴愰敭灝嗙粨鏋滈氱煡緇欏叿浣撶殑Socket瀵硅薄銆傦紙Socket鐨勮鏄庤鍚庨潰錛?/p>
ListenSocket浠h〃涓涓洃鍚鎺ュ瓧銆傝緗戠粶妯″潡鍏跺疄鍙槸綆鍗曞湴灝唖ocket涓殑姒傚康鍔犱互灝佽銆備篃灝辮錛屽畠渚濈劧鎶婁竴涓鎺ュ瓧鍒嗕負涓ょ綾誨瀷錛氱洃鍚鎺ュ瓧鍜屾暟鎹鎺ュ瓧錛堜唬琛ㄤ竴涓綉緇滆繛鎺ワ級銆傛墍璋撶殑鐩戝惉濂楁帴瀛楋紝鏄寚鍙彲浠ュ湪璇ュ鎺ュ瓧涓婅繘琛岀洃鍚搷浣滐紱鑰屾暟鎹鎺ュ瓧鍒欏彧鍙互鍦ㄦ濂楁帴瀛椾笂榪涜鍙戦併佹帴鏀舵暟鎹殑鎿嶄綔銆?/p>
Socket浠h〃鎴戜笂闈㈣鐨勬暟鎹鎺ュ瓧銆侺istenSocket鏄竴涓被妯℃澘錛屼負榪欎釜妯℃澘鎸囧畾鐨勬ā鏉垮弬鏁伴氬父鏄淳鐢熶簬Socket鐨勭被銆傚叾瀹炶繖閲屼嬌鐢ㄤ簡榪欎釜灝忔妧宸ч殣钘忎簡宸ュ巶妯″紡鐨勭粏鑺傘傚洜涓篖istenSocket琚斁鍦ㄤ竴涓崟鐙殑綰跨▼閲岃繍浣滐紝褰撳叾鎺ュ彈鍒頒竴涓柊鐨勭綉緇滆繛鎺ユ椂錛屽氨鍒涘緩涓涓猄ocket媧劇敓綾誨璞°傦紙ListenSocket綾誨浣曠煡閬撹繖涓淳鐢熺被鐨勭被鍚嶏紵榪欏氨鏄氳繃綾繪ā鏉跨殑閭d釜妯℃澘鍙傛暟錛?/p>
涓婂眰妯″潡閫氬父浼氭淳鐢烻ocket綾伙紝瀹炵幇涓浜汭O鎿嶄綔鐨勫洖璋冦備篃灝辮錛屽綋鏌愪釜IO鎿嶄綔瀹屾垚鍚庯紝浼氶氳繃Socket鍩虹被璁╀笂灞傛ā鍧楄幏鍙栭氱煡銆?/p>
SocketMgr鏄竴涓叏灞鍗曚歡綾匯傚畠涓昏璐熻矗涓浜涚綉緇滃簱鐨勫叏灞鎿嶄綔錛堜緥濡倃insock搴撶殑鍒濆鍖栵級錛屽畠榪樼淮鎶や簡涓涓鍣紝淇濆瓨鎵鏈夌殑Socket瀵硅薄銆傝繖鍏跺疄鏄畠鐨勪富瑕佷綔鐢ㄣ?/p>
榪愪綔涔嬩竴錛屾帴鏀舵柊鐨勮繛鎺?/strong>錛?o:p>
鎺ユ敹鏂扮殑緗戠粶榪炴帴鏄氳繃ListenSocket瀹炵幇鐨勩傚湪鍒涘緩涓涓狶istenSocket瀵硅薄鏃訛紝浣犻渶瑕佹寚瀹氬畠鐨勬ā鏉垮弬鏁般傝繖涓弬鏁伴氬父鏄竴涓淳鐢熶簬Socket鐨勭被銆傚涓嬶細
ascent-logonserver/Main.cpp
ListenSocket<AuthSocket> * cl = new ListenSocket<AuthSocket>(host.c_str(), cport);
AuthSocket媧劇敓浜嶴ocket銆傚垱寤篖istenSocket鏃舵瀯閫犲嚱鏁版寚瀹氱洃鍚琁P鍜岀洃鍚鍙c?/p>
鍥犱負ListenSocket媧劇敓浜嶵hreadBase錛屽睘浜庣嚎紼嬫睜job錛屽洜姝よ璁㎜istenSocket宸ヤ綔璧鋒潵錛屽彧闇瑕佸皢鍏跺姞鍏ュ埌綰跨▼姹犵鐞嗗櫒錛?/p>
ascent-logonserver/Main.cpp
ThreadPool.ExecuteTask(cl);ListenSocket寮濮嬭繍浣滆搗鏉ュ悗錛屼細闃誨寮忓湴WSAAccept銆傚鏋淲SAAccept榪斿洖涓涓湁鏁堢殑濂楁帴瀛楋紝ListenSocket灝卞垱寤轟竴涓猄ocket媧劇敓綾誨璞★紙綾誨瀷鐢辨ā鏉垮弬鏁版寚瀹氾級錛屽湪涓婇潰涓劇殑渚嬪瓙涓紝涔熷氨鏄疉uthSocket錛?/p>
ascent-logonserver/ ListenSocketWin32.h
socket = new T(aSocket); //鍒涘緩AuthSocket騫朵繚瀛樼綉緇滃鎺ュ瓧aSocket
socket->SetCompletionPort(m_cp);//淇濆瓨瀹屾垚绔彛瀵硅薄
socket->Accept(&m_tempAddress); //鍏寵仈鍒板畬鎴愮鍙g瓑
Accept鍑芥暟鏈緇堜細灝嗘柊鍒涘緩鐨凷ocket瀵硅薄淇濆瓨鍒癝ocketMgr瀵硅薄鍐呴儴緇存姢鐨勫鍣ㄩ噷銆傚湪榪欓噷錛岃繕浼氬洖璋冨埌涓婂眰妯″潡鐨凮nConnect鍑芥暟錛屼粠鑰屽疄鐜頒俊鎭崟鑾楓?/p>
榪愪綔涔嬩簩錛屾帴鏀舵暟鎹?o:p>
鍦╳indows騫沖彴涓嬶紝璇ョ綉緇滄ā鍧椾嬌鐢ㄧ殑鏄疘OCP妯″瀷錛屽睘浜庡紓姝O銆傚綋鎺ユ敹鏂扮殑榪炴帴鏃訛紝鍗沖彂鍑篧SARecv鐨処O鎿嶄綔銆傚湪宸ヤ綔鑰呯嚎紼嬩腑錛屼篃灝辨槸SocketWorkerThread涓紝浼氭牴鎹甀OCP瀹屾垚閿緱鍒癝ocket瀵硅薄鎸囬拡錛岀劧鍚庢牴鎹笉鍚岀殑IO鎿嶄綔緇撴灉澶氭佸洖璋冨埌Socket媧劇敓綾誨搴旂殑鍑芥暟銆備緥濡傚鏋滄槸WSARecv瀹屾垚錛屽垯璋冪敤鍒癆uthSocket::OnRead鍑芥暟錛堜笂榪頒緥瀛愶級銆侽nRead鍑芥暟鐩存帴鍙互鑾峰彇鍒頒繚瀛樻暟鎹殑緙撳啿鍖烘寚閽堛備簨瀹炰笂錛屾瘡涓涓猄ocket瀵硅薄鍦ㄨ鍒涘緩鏃訛紝灝變細鑷姩鍒涘緩鎺ユ敹緙撳啿鍖轟互鍙婂彂閫佺紦鍐插尯銆?/p>
榪愪綔涔嬩笁錛屽彂閫佹暟鎹?o:p>
鍒嗘瀽鍒拌繖閲岋紝鎴戜滑鍙互鐪嬪嚭錛岃緗戠粶妯″潡瀹炵幇寰楀緢涓鑸傚湪鎺ュ彈鏁版嵁閮ㄥ垎錛岀綉緇滃伐浣滆呯嚎紼嬪洖璋冨埌瀵瑰簲鐨凷ocket瀵硅薄錛孲ocket鐩存帴瀵規暟鎹繘琛屼笂灞傞昏緫澶勭悊銆傛洿濂界殑鍋氭硶鏄綋宸ヤ綔鑰呯嚎紼嬪洖璋冨埌涓婂眰Socket錛圫ocket鐨勬淳鐢熺被錛夋椂錛岃繖閲屽簲璇ョ畝鍗曞湴灝嗘暟鎹粍緇囨垚涓婂眰鏁版嵁鍖呭茍鏀懼叆涓婂眰鏁版嵁鍖呴槦鍒楋紝璁╀笂灞傞昏緫紼嶅悗澶勭悊錛岃屼笉鏄緗戠粶妯″潡鑷繁鍘誨鐞嗐傝繖鏍峰仛涓昏鏄冭檻鍒板綰跨▼妯″瀷銆?/p>
鍚屾牱錛岃緗戠粶妯″潡鐨勫彂閫佹ā鍧椾篃鏄竴鏍鳳紝娌℃湁緙撳啿鏈哄埗銆傚綋瑕佸彂閫佹暟鎹椂錛岀洿鎺ヨ皟鐢ㄥ埌Socket鐨凷end鍑芥暟銆傝鍑芥暟鎷瘋礉鐢ㄦ埛鏁版嵁鍒拌嚜宸辯淮鎶ょ殑鍙戦佺紦鍐插尯錛岀劧鍚庡皢鑷繁鐨勭紦鍐插尯鎸囬拡鐩存帴鎻愪氦緇橧OCP錛學SASend鍙戦併?/p>
緇撴潫
璇ョ綉緇滄ā鍧楀疄鐜扮殑浼間箮鏈夌偣綆闄嬶紝鍦ㄨ妯″潡涔嬩笂涔熸病鏈夋暟鎹牎楠屻佹暟鎹姞瀵嗙殑妯″潡錛堣繖浜涘姩浣滄暎涔卞湴鍒嗗竷鍦ㄦ渶涓婂眰閫昏緫錛夈傚湪鏋舵瀯涓婁篃娌¤兘寰堝ソ鍦板皢姒傚康鍖哄垎寮鏉ワ紝Socket濂楃敤浜嗗師濮媠ocket涓殑鏁版嵁濂楁帴瀛楋紝鑰屼笉鏄垜鎵甯屾湜鐨凬etSession銆傚彲浠ュ湀鐐圭殑鍦版柟鍦ㄤ簬璇ユā鍧楀緢澶氬湴鏂逛嬌鐢ㄤ簡鍥炶皟鍑芥暟琛紝浠庤屾柟渚垮湴瀹炵幇浜嬩歡浼犻併?/p>