锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鎴戜滑鐪嬩竴涓疄渚嬶細
鎶婅繖涓ゅぉ鍋歅roactor鐨勪竴浜涚粡楠屽拰蹇冨緱鍐欎竴涓嬶紝鍙兘浼氱粰涓浜涗漢甯姪銆?br /> Proactor鏄紓姝ユā寮忕殑緗戠粶澶勭悊鍣紝ACE涓彨鍋?#8220;鍓嶆憚鍣?#8221;銆?br /> 鍏堣鍑犱釜姒傚康錛?br /> 鍓嶆憚鍣紙Proactor錛夛紞寮傛鐨勪簨浠跺璺垎紱誨櫒銆佸鐞嗗櫒錛屾槸鏍稿績澶勭悊綾匯傚惎鍔ㄥ悗鐢?涓嚎紼嬬粍鎴愶紙浣犱笉闇瑕佸叧蹇冭繖涓変釜綰跨▼錛屾垜鍙槸璁╀綘鐭ラ亾涓涓嬫湁榪欏洖浜嬪瓨鍦級銆?br /> 鎺ュ彈鍣紙Acceptor錛夛紞鐢ㄤ簬鏈嶅姟绔紝鐩戝惉鍦ㄤ竴涓鍙d笂錛屾帴鍙楃敤鎴風殑璇鋒眰銆?br /> 榪炴帴鍣紙Connector錛夛紞鐢ㄤ簬瀹㈡埛绔紝鍘昏繛鎺ヨ繙紼嬬殑鐩戝惉銆傚綋鐒訛紝濡傛灉榪滅▼鏄疉CE鍐欑殑錛屽氨鏄疉cceptor銆?br /> 寮傛妯″紡錛嶅嵆闈為樆濉炴ā寮忋傜綉緇滅殑浼犺緭閫熷害涓鑸潵璁蹭負10Mbps銆?00Mbps銆?000Mbps銆傛嬁鍗冨厗緗戞潵璇達紝瀹為檯鐨勪紶杈撻熷害涓?000Mbps/8澶ф涓?28KB宸﹀彸銆傛垜浠殑CPU涓鑸負P4 3.0GHZ錛屽鏋滄槸32浣嶇殑澶勭悊鍣紝涓縐掗挓澶ф鍙互澶勭悊6G鐨勫瓧鑺傦紝閭d箞錛?28KB鐨勭綉緇滈熷害鏄繙榪滃強涓嶄笂澶勭悊鍣ㄧ殑閫熷害鐨勩傜綉緇滃彂閫佹暟鎹槸涓浣嶄竴浣嶅彂閫佸嚭鍘葷殑錛屽鏋淐PU絳夊湪榪欓噷錛屽彂閫佸畬鎴愬嚱鏁版墠緇撴潫錛岄偅涔堬紝澶勭悊鍣ㄦ氮璐逛簡澶ч噺鏃墮棿鍦ㄧ綉緇滀紶杈撲笂銆?br /> 鎿嶄綔緋葷粺鎻愪緵浜嗗紓姝ョ殑妯″紡鏉ヤ紶杈撶綉緇滄暟鎹紝宸ヤ綔妯″紡鍗籌細搴旂敤紼嬪簭鎶婅鍙戦佺殑鏁版嵁浜ょ粰鎿嶄綔緋葷粺錛屾搷浣滅郴緇熸妸鏁版嵁鏀懼湪緋葷粺緙撳啿鍖哄悗灝卞憡璇夊簲鐢ㄧ▼搴廜K浜嗭紝鎴戝府浣犲彂錛屽簲鐢ㄧ▼搴忚騫插槢騫插槢鍘匯傛搷浣滅郴緇熷彂閫佸畬鎴愬悗錛屼細緇欏簲鐢ㄧ郴緇熶竴涓洖鎵э紝鍛婅瘔搴旂敤紼嬪簭錛氬垰鎵嶉偅涓寘鍙戦佸畬鎴愪簡錛?br /> 涓句釜渚嬪瓙錛氫綘鏈夊嚑灝侀偖浠跺拰鍖呰9瑕佸彂錛屾渶鏈夋晥鐜囩殑鍔炴硶鏄粈涔堬紵浣犳妸閭歡鍜屽寘瑁瑰強浜ょ粰鎬誨彴錛屾誨彴MM璇達紝濂戒簡錛屼綘甯綘鍙戯紝浣犲繖鍘誨惂錛佺劧鍚庝綘鍘誨伐浣滀簡銆傝繃浜嗕竴浼氾紝鎬誨彴MM鎵撶數璇濆憡璇変綘錛?#8220;鍒氭墠鎴戝彨蹇掑叕鍙哥殑浜烘潵浜嗭紝鎶婁綘鐨勫寘瑁瑰彂鍑哄幓浜嗐傞偖灞鐨勪漢涔熸潵浜嗭紝鍙栬蛋浜嗛偖浠訛紝鏀懼績濂戒簡”銆傚悓鏍鳳紝濡傛灉浣犵煡閬撲粖澶╀細鏈夊寘瑁規潵錛屾瘮濡備綘鍦ㄦ窐瀹濅笂璐墿浜嗭紝浣犺兘鎴愬ぉ絳夊湪鎬誨彴錛熶綘搴旇鍛婅瘔鎬誨彴MM錛?#8220;浠婂ぉ鍙兘鏈夋垜鐨勪竴涓揩閫掞紝浣犲府鎴戞敹涓涓嬶紝鏅氫笂璇蜂綘鑲痙鍩猴紒”銆侻M錛?#8220;鐪嬪湪鑲緱鍩虹殑闈㈠瓙涓婏紝甯綘鏀朵簡”銆傛煇涓椂闂達紝MM鎵撶數璇濇潵浜嗭細“甯呭摜錛屼綘鐨勫寘瑁瑰埌浜嗭紝鎴戝府浣犵鏀朵簡錛屽揩鏉ユ嬁鍚с?#8221;
鍥犱負鎿嶄綔緋葷粺鏄緢鏈夋晥鐜囩殑錛屾墍鏈夛紝浠栧湪鍚庡彴鏀跺彂鏄緢蹇殑銆傚簲鐢ㄧ▼搴忎篃寰堢畝鍗曘侾roactor灝辨槸榪欑寮傛妯″紡鐨勩侾roactor灝辨槸鎬誨彴MM錛汚CE_Service_Handle灝辨槸鎬誨彴浠d負鏀跺彂閭歡鐨勫叕鍙告祦紼嬨?/p>
//***********************************************************
class TPTCPAsynchServerImpl : public ACE_Service_Handler
{
public:
TPTCPAsynchServerImpl(void);
~TPTCPAsynchServerImpl(void);
virtual void open (ACE_HANDLE handle, ACE_Message_Block &message_block);
virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);
virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);
virtual void handle_time_out (const ACE_Time_Value &tv, const void *act=0);
private:
int initiate_read_stream (const ACE_Asynch_Read_Stream::Result &result);
ACE_Asynch_Read_Stream rs_;
ACE_Asynch_Write_Stream ws_;
};
榪欎釜渚嬪瓙浠嶢CE_Service_Handler緇ф壙榪囨潵錛孉CE_Service_Handle涓昏灝辨槸瀹氫箟浜嗕竴浜涘洖璋冨嚱鏁般?br />1銆?virtual void open (ACE_HANDLE handle, ACE_Message_Block &message_block);
褰撴湁瀹㈡埛绔繛鎺ヤ笂鏉ワ紝榪炴帴寤虹珛鎴愬姛鍚嶱roactor浼氳皟鐢ㄨ繖涓柟娉曘?/p>
2銆?virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);
褰撶敤鎴瘋璇葷殑鏁版嵁璇誨ソ浜嗗悗錛岃皟鐢ㄨ繖涓柟娉?/p>
3銆乿irtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);
褰撶敤鎴瘋鍐欑殑鏁版嵁鍦ㄧ綉鍗′笂鍙戦佹垚鍔熷悗錛孭roactor浼氬洖璋冭繖涓柟娉?/p>
4銆?virtual void handle_time_out (const ACE_Time_Value &tv, const void *act=0);
褰撶敤鎴瘋瀹氱殑鏃墮挓鍒版湡浜嗭紝榪欎釜鏂規硶浼氳璋冪敤銆?/p>
榪欒窡鍜屾誨彴MM鐨勮仈緇滄柟娉曟槸涓嶆槸涓鏍風殑錛?/p>
瀵硅繕緙虹偣涓滆タ錛岀己灝戞庝箞鍚戞誨彴MM浜ゅ緟浠誨姟鐨勬柟娉曘備笅闈㈢湅鐪嬶細
棣栧厛錛屽垱寤轟竴涓洃鍚櫒銆?/p>
ACE_Asynch_Acceptor<TPTCPAsynchServerImpl> acceptor_;
鐪嬪埌娌★紝灝辨槸鎴戜滑鍒氭墠鍐欑殑綾伙紝鍥犱負浠栫戶鎵夸簡鍥炶皟鎺ュ彛錛屽茍瀹炵幇浜嗚嚜宸茬殑浠g爜錛屾ā鏉夸腑ACE_Asynch_Acceptor浼氬湪鍚堥傜殑鏃跺欏洖璋冭繖浜涙柟娉曘?/p>
//鍒涘緩涓涓湴鍧瀵硅薄
ACE_INET_Addr addr(port, ip);
acceptor_.open (addr, 8 * 1024, 1);
Open鍚庯紝灝卞紑濮嬬洃鍚簡銆傚叾瀹冪殑錛屽悜Proactor娉ㄥ唽涓浜涗簨浠剁殑浜嬫ā鏉跨被涓兘鏇夸綘鍋氫簡錛屼綘涓嶉渶瑕佸仛寰堝浜嬨?br /> 閭d箞錛屽凡緇忓紑濮嬬洃鍚簡錛屾垜鐨勭▼搴忎粠鍝噷寮濮嬪憿錛熷浜庝竴涓湇鍔$▼搴忔潵璁詫紝紼嬪簭鏄鐢ㄦ埛鐨勮繛鎺ラ┍鍔ㄧ殑錛屼竴涓敤鎴風▼搴忔兂鍜岄氳錛屽繀欏誨厛鍒涘緩榪炴帴錛屽氨鏄疭ocket涓殑connect鎿嶄綔銆傝繖涓搷浣淧roactor浼氭浛鎴戜滑鍋氫竴浜涘伐浣滐紝褰撹繛鎺ュ垱寤哄畬鎴愬悗錛屼笂闈㈣鐨凮pen鏂規硶浼氳璋冪敤錛屾垜浠湅鐪婳pen鏂規硶涓兘鏈変簺浠涔堜唬鐮侊細
"));
鎴戜滑鐪嬪埌錛岄鍏堝垱寤轟簡涓や釜嫻侊紝灝辨槸鍓嶉潰綾誨畾涔変腑瀹氫箟鐨勪竴涓紓姝ュ啓嫻侊紝涓涓紓姝ヨ嫻併備互鍚庡緗戠粶鐨勮鍜屽啓灝遍氳繃榪欎袱涓祦榪涜銆傛垜榪樼粰鍑轟簡涓孌佃瀹㈡埛绔湴鍧鍜岀鍙g殑浠g爜銆傜劧鍚庢槸璇誨彇瀹㈡埛Connect鍙兘闄勫甫鐨勬暟鎹紝閭f浠g爜涓嶇敤鐪嬫噦錛屼互鍚庝嬌鐢ㄧ収鎶勫氨琛屻傜劧鍚庡氨鏄?/p>
榪欐浠g爜浣跨敤璇繪祦璇諱竴孌墊暟鎹傝繖孌典唬鐮佸氨鏄悜鎬誨彴MM浜ゅ緟錛氭垜瑕佹敹鍖呰9錛屾敹濂戒簡鍙垜錛?br />涔熷氨鏄錛岃繖孌典唬鐮?9%鐨勫彲鑳芥槸璇諱笉鍑烘暟鎹殑錛屽彧鏄悜Proactor娉ㄥ唽璇葷殑浜嬩歡錛屽叿浣撶殑絳夊緟銆佽鍙栨搷浣滅敱Proactor璇伙紝璇誨埌浜嗭紝灝卞洖璋僅andle_Read_Stream鏂規硶銆侫CE_Message_Block鏄秷鎭潡錛屾暟鎹氨鏄瓨鏀懼湪娑堟伅鍧椾腑鐨勩?br />涓嬮潰鐪嬬湅Handle_Read_Stream鏂規硶鐨勪唬鐮侊細
榪欎釜鍑芥暟琚皟鐢紝灝辮〃鏄庢湁鏁版嵁宸茬粡璇誨ソ浜嗭紝鍖呰9宸茬粡鍦ㄦ誨彴浜嗐侾roactor姣旀誨彴MM榪樺ソ錛岀粰浣犻佷笂闂ㄤ簡錛屾暟鎹氨鍦≧esult閲岋紝涓婇潰婕旂ず浜哛esult涓殑鏁版嵁銆傜劧鍚庢妸娑堟伅鍧楅噴鏀句簡錛岀劧鍚庤皟鐢╥nitiate_read_stream緇х畫鐩戝惉緗戠粶涓婂彲鑳藉埌鏉ョ殑鏁版嵁銆傜湅鐪媔nitiate_read_stream濂戒簡錛?/p>
浠g爜寰堢畝鍗曪紝灝辨槸鍒涘緩涓涓柊鐨勬秷鎭潡錛岀劧鍚庝嬌鐢ㄨ嫻佹敞鍐屼竴涓娑堟伅灝卞彲浠ヤ簡銆?/p>
鍒版涓烘錛孭roactor鐨勮嫻佺▼寰堟竻妤氫簡鍚э紵
涓嬮潰鍐嶈涓涓啓嫻佺▼銆?/p>
鍐欐祦紼嬪叾瀹炴洿綆鍗曪紝鍦ㄤ換鎰忔兂鍚戝鎴風鍐欐暟鎹殑鍦版柟錛岃皟鐢ㄧ浉搴斾唬鐮佸氨琛屼簡錛屾瘮濡傦紝鎴戜滑鎻愪緵浜哠endData鏂規硶鏉ュ彂閫佹暟鎹紝鍦ㄤ換鎰忔兂鍙戦佹暟鎹殑鍦版柟璋冪敤SendData灝辮浜嗭紝SendData鐨勪唬鐮佸涓嬶細
綆鍗曡錛屽氨鏄垱寤轟簡涓涓秷鎭潡錛屾妸鐢ㄦ埛鏁版嵁鎷瘋礉榪涙潵錛岀劧鍚庤皟鐢ㄥ啓嫻乄S鍚慞roactor鍙戦佷竴涓猈rite浜嬩歡灝卞彲浠ヤ簡錛屽彂閫佹垚鍔熷悗錛孒andle_write_handle浼氳璋冪敤錛岀湅涓涓嬶細
浠g爜涓嬌鐢ㄤ簡result涓彂鏁版嵁錛岀劧鍚庢妸娑堟伅鍧楅噴鏀句簡錛屽氨榪欎箞綆鍗曘?/p>
////////////////////////////////////////////////////////////////////////////////////////////////////
榪欐槸綆鍗曠殑proactor鐢ㄦ硶錛屽綋鐒訛紝澶嶆潅涔熷熀鏈氨榪欐牱鐢ㄣ傛墍璋撲笉鍩烘湰鐨勪笉鏄疨roactor鐨勫唴瀹癸紝鑰屾槸鏈嶅姟鍣ㄧ紪紼嬫湰韜殑楹葷儲銆傛瘮濡傝錛屽涓繛鎺ョ殑綆$悊銆侀噸鍙戞満鍒躲佸彂閫侀槦鍒楃瓑絳夛紝榪欓兘涓嶆槸ACE鐨勫唴瀹廣傝繖浜涜澶у鑷繁鎬濊冧簡錛屽茍娣誨姞銆?/p>
鍦ㄨ繖閲岋紝鎴戣璇村嚑涓噸瑕佺殑闂錛氳繛鎺ョ殑綆$悊銆侫cceptor鏄竴涓被錛屼絾鏄湪姣忎竴涓繛鎺ワ紝Proactor閮界敤浜嗘煇縐嶅姙娉曞垱寤轟簡涓涓疄渚嬶紝鎵浠ワ紝榪炴帴綆$悊鐨勭兢闆嗙被涓瀹氫笉鑳藉湪Acceptor綾諱腑錛屼笉鐒跺緱鍒扮殑緇撴灉灝辨槸濮嬬粓鍙湁涓鏉¤褰曘傚洜涓烘瘡涓狝cceptor閮芥湁涓涓疄渚嬶紝瀹炰緥瀵瑰簲涓涓繛鎺ワ紝緹ら泦綾諱篃灝辨瘡涓疄渚嬩竴涓簡銆傝閲囧彇鐨勬柟娉曟槸涓涓叏灞鐨勫鍣ㄥ璞″氨鍙互浜嗐傛瘮濡傛垜榪欎釜綾伙細
鎴戜嬌鐢ˋCE鐨凷ingleton妯℃澘鍒涘緩榪欎釜綾伙紝姣忎竴涓狝cceptor瑕佷嬌鐢–onnectionMap錛岄兘浣跨敤榪欓噷鐨刜connections錛屾柟娉曞涓?錛?br /> GlobleSingleton::instance()->connection.bind()......
榪欎釜闂鍙槸鎴戣姳璐逛簡2澶╂椂闂存壘鍑烘潵鐨勶紝璇鎬綅鍚屼粊涓嶅彲涓嶆垝鍟婏紝緇欑偣鎺屽0錛氾級
濂藉

杞嚜錛?a >http://blog.csdn.net/hguisu/article/details/7453390
1. 姒傚康鐞嗚В
鍦ㄨ繘琛岀綉緇滅紪紼嬫椂錛屾垜浠父甯歌鍒?span style="margin: 0px; padding: 0px; font-family: Arial, Helvetica, sans-serif, 瀹嬩綋; font-size: 12px; line-height: 16px; text-indent: 24px;">鍚屾(Sync)/寮傛(Async)錛岄樆濉?Block)/闈為樆濉?Unblock)鍥涚璋冪敤鏂瑰紡錛?/span>
鍚屾錛?/span>
鎵璋撳悓姝ワ紝灝辨槸鍦ㄥ彂鍑轟竴涓姛鑳借皟鐢ㄦ椂錛屽湪娌℃湁寰楀埌緇撴灉涔嬪墠錛岃璋冪敤灝變笉榪斿洖銆?/span>涔熷氨鏄繀欏諱竴浠朵竴浠朵簨鍋?/strong>,絳夊墠涓浠跺仛瀹屼簡鎵嶈兘鍋氫笅涓浠朵簨銆?/span>
渚嬪鏅?span style="margin: 0px; padding: 0px; font-family: 'Times New Roman';">B/S妯″紡錛堝悓姝ワ級錛氭彁浜よ姹?span style="margin: 0px; padding: 0px; font-family: 'Times New Roman';">->絳夊緟鏈嶅姟鍣ㄥ鐞?span style="margin: 0px; padding: 0px; font-family: 'Times New Roman';">->澶勭悊瀹屾瘯榪斿洖 榪欎釜鏈熼棿瀹㈡埛绔祻瑙堝櫒涓嶈兘騫蹭換浣曚簨
寮傛錛?/span>
寮傛鐨勬蹇靛拰鍚屾鐩稿銆傚綋涓涓紓姝ヨ繃紼嬭皟鐢ㄥ彂鍑哄悗錛岃皟鐢ㄨ呬笉鑳界珛鍒誨緱鍒扮粨鏋溿傚疄闄呭鐞嗚繖涓皟鐢ㄧ殑閮ㄤ歡鍦ㄥ畬鎴愬悗錛岄氳繃鐘舵併侀氱煡鍜屽洖璋冩潵閫氱煡璋冪敤鑰呫?/span>
渚嬪 ajax璇鋒眰錛?/span>寮傛錛?/span>: 璇鋒眰閫氳繃浜嬩歡瑙﹀彂->鏈嶅姟鍣ㄥ鐞嗭紙榪欐槸嫻忚鍣ㄤ粛鐒跺彲浠ヤ綔鍏朵粬浜嬫儏錛?/span>->澶勭悊瀹屾瘯
闃誨
闃誨璋冪敤鏄寚璋冪敤緇撴灉榪斿洖涔嬪墠錛屽綋鍓嶇嚎紼嬩細琚寕璧鳳紙綰跨▼榪涘叆闈炲彲鎵ц鐘舵侊紝鍦ㄨ繖涓姸鎬佷笅錛宑pu涓嶄細緇欑嚎紼嬪垎閰嶆椂闂寸墖錛屽嵆綰跨▼鏆傚仠榪愯錛夈傚嚱鏁板彧鏈夊湪寰楀埌緇撴灉涔嬪悗鎵嶄細榪斿洖銆?/span>
鏈変漢涔熻浼氭妸闃誨璋冪敤鍜屽悓姝ヨ皟鐢ㄧ瓑鍚岃搗鏉ワ紝瀹為檯涓婁粬鏄笉鍚岀殑銆傚浜庡悓姝ヨ皟鐢ㄦ潵璇達紝寰堝鏃跺欏綋鍓嶇嚎紼嬭繕鏄縺媧葷殑錛屽彧鏄粠閫昏緫涓婂綋鍓嶅嚱鏁版病鏈夎繑鍥炶屽凡銆?/span> 渚嬪錛屾垜浠湪socket涓皟鐢╮ecv鍑芥暟錛屽鏋滅紦鍐插尯涓病鏈夋暟鎹紝榪欎釜鍑芥暟灝變細涓鐩寸瓑寰咃紝鐩村埌鏈夋暟鎹墠榪斿洖銆傝屾鏃訛紝褰撳墠綰跨▼榪樹細緇х畫澶勭悊鍚勭鍚勬牱鐨勬秷鎭?/span>
闈為樆濉?/strong>
闈為樆濉炲拰闃誨鐨勬蹇電浉瀵瑰簲錛屾寚鍦ㄤ笉鑳界珛鍒誨緱鍒扮粨鏋滀箣鍓嶏紝璇ュ嚱鏁頒笉浼氶樆濉炲綋鍓嶇嚎紼嬶紝鑰屼細绔嬪埢榪斿洖銆?/span>
瀵硅薄鐨勯樆濉炴ā寮忓拰闃誨鍑芥暟璋冪敤
瀵硅薄鏄惁澶勪簬闃誨妯″紡鍜屽嚱鏁版槸涓嶆槸闃誨璋冪敤鏈夊緢寮虹殑鐩稿叧鎬э紝浣嗘槸騫朵笉鏄竴涓瀵瑰簲鐨勩傞樆濉炲璞′笂鍙互鏈夐潪闃誨鐨勮皟鐢ㄦ柟寮忥紝鎴戜滑鍙互閫氳繃涓瀹氱殑API鍘昏疆璇㈢姸 鎬侊紝鍦ㄩ傚綋鐨勬椂鍊欒皟鐢ㄩ樆濉炲嚱鏁幫紝灝卞彲浠ラ伩鍏嶉樆濉炪傝屽浜庨潪闃誨瀵硅薄錛岃皟鐢ㄧ壒孌婄殑鍑芥暟涔熷彲浠ヨ繘鍏ラ樆濉炶皟鐢ㄣ傚嚱鏁?/span>select灝辨槸榪欐牱鐨勪竴涓緥瀛愩?/span>
1. 鍚屾錛屽氨鏄垜璋冪敤涓涓姛鑳斤紝璇ュ姛鑳芥病鏈夌粨鏉熷墠錛屾垜姝葷瓑緇撴灉銆?/span>
2. 寮傛錛屽氨鏄?span style="margin: 0px; padding: 0px; line-height: 20px;">鎴戣皟鐢ㄤ竴涓姛鑳斤紝涓嶉渶瑕佺煡閬撹鍔熻兘緇撴灉錛岃鍔熻兘鏈夌粨鏋滃悗閫氱煡鎴戯紙鍥炶皟閫氱煡錛?/span>
3. 闃誨錛? 灝辨槸璋冪敤鎴戯紙鍑芥暟錛夛紝鎴?span style="margin: 0px; padding: 0px; line-height: 20px;">錛堝嚱鏁幫級娌℃湁鎺ユ敹瀹屾暟鎹垨鑰呮病鏈夊緱鍒扮粨鏋滀箣鍓嶏紝鎴戜笉浼氳繑鍥炪?/span>
4. 闈為樆濉烇紝 灝辨槸璋冪敤鎴?span style="margin: 0px; padding: 0px; line-height: 20px;">錛堝嚱鏁幫級錛屾垜錛堝嚱鏁幫級绔嬪嵆榪斿洖錛?span style="margin: 0px; padding: 0px; line-height: 20px;">閫氳繃select閫氱煡璋冪敤鑰?/span>
鍚屾IO鍜屽紓姝O鐨勫尯鍒氨鍦ㄤ簬錛?span style="margin: 0px; padding: 0px; color: #ff0000;">鏁版嵁鎷瘋礉鐨勬椂鍊欒繘紼嬫槸鍚﹂樆濉烇紒
闃誨IO鍜岄潪闃誨IO鐨勫尯鍒氨鍦ㄤ簬錛?/span>搴旂敤紼嬪簭鐨勮皟鐢ㄦ槸鍚︾珛鍗寵繑鍥烇紒
瀵逛簬涓句釜綆鍗昪/s 妯″紡錛?/span>
鍚屾鍜屽紓姝?闃誨鍜岄潪闃誨,鏈変簺娣風敤,鍏跺疄瀹冧滑瀹屽叏涓嶆槸涓鍥炰簨,鑰屼笖瀹冧滑淇グ鐨勫璞′篃涓嶇浉鍚屻?br style="margin: 0px; padding: 0px;" />闃誨鍜岄潪闃誨鏄寚褰撹繘紼嬭闂殑鏁版嵁濡傛灉灝氭湭灝辯華,榪涚▼鏄惁闇瑕佺瓑寰?綆鍗曡榪欑浉褰撲簬鍑芥暟鍐呴儴鐨勫疄鐜板尯鍒?/span>,涔熷氨鏄湭灝辯華鏃舵槸鐩存帴榪斿洖榪樻槸絳夊緟灝辯華;
鑰屽悓姝ュ拰寮傛鏄?/span>鎸囪闂暟鎹殑鏈哄埗,鍚屾涓鑸寚涓誨姩璇鋒眰騫剁瓑寰匢/O鎿嶄綔瀹屾瘯鐨勬柟寮?褰撴暟鎹氨緇悗鍦ㄨ鍐欑殑鏃跺欏繀欏婚樆濉?鍖哄埆灝辯華涓庤鍐欎簩涓樁孌?鍚屾鐨勮鍐欏繀欏婚樆濉?,寮傛鍒欐寚涓誨姩璇鋒眰鏁版嵁鍚庝究鍙互緇х畫澶勭悊鍏跺畠浠誨姟,闅忓悗絳夊緟I/O,鎿嶄綔瀹屾瘯鐨勯氱煡,榪欏彲浠ヤ嬌榪涚▼鍦ㄦ暟鎹鍐欐椂涔熶笉闃誨銆?絳夊緟"閫氱煡")
1. Linux涓嬬殑浜旂I/O妯″瀷
1)闃誨I/O錛坆locking I/O錛?br style="margin: 0px; padding: 0px;" />2)闈為樆濉濱/O 錛坣onblocking I/O錛?/span>
3) I/O澶嶇敤(select 鍜宲oll) 錛圛/O multiplexing錛?/span>
4)淇″彿椹卞姩I/O 錛坰ignal driven I/O (SIGIO)錛?/span>
5)寮傛I/O 錛坅synchronous I/O (the POSIX aio_functions)錛?/span>
鍓嶅洓縐嶉兘鏄悓姝ワ紝鍙湁鏈鍚庝竴縐嶆墠鏄紓姝O銆?/p>
綆浠嬶細榪涚▼浼?/span>涓鐩撮樆濉?/span>錛岀洿鍒版暟鎹嫹璐濆畬鎴?/span>
搴旂敤紼嬪簭璋冪敤涓涓狪O鍑芥暟錛屽鑷村簲鐢ㄧ▼搴忛樆濉烇紝絳夊緟鏁版嵁鍑嗗濂姐?濡傛灉鏁版嵁娌℃湁鍑嗗濂斤紝涓鐩寸瓑寰?#8230;.鏁版嵁鍑嗗濂戒簡錛屼粠鍐呮牳鎷瘋礉鍒扮敤鎴風┖闂?IO鍑芥暟榪斿洖鎴愬姛鎸囩ず銆?/span>
闃誨I/O妯″瀷鍥撅細鍦ㄨ皟鐢╮ecv()/recvfrom錛堬級鍑芥暟鏃訛紝鍙戠敓鍦ㄥ唴鏍鎬腑絳夊緟鏁版嵁鍜屽鍒舵暟鎹殑榪囩▼銆?/span>

褰撹皟鐢╮ecv()鍑芥暟鏃訛紝緋葷粺棣栧厛鏌ユ槸鍚︽湁鍑嗗濂界殑鏁版嵁銆傚鏋滄暟鎹病鏈夊噯澶囧ソ錛岄偅涔堢郴緇熷氨澶勪簬絳夊緟鐘舵併傚綋鏁版嵁鍑嗗濂藉悗錛屽皢鏁版嵁浠庣郴緇熺紦鍐插尯澶嶅埗鍒扮敤鎴風┖闂達紝鐒跺悗璇ュ嚱鏁拌繑鍥炪傚湪濂楁帴搴旂敤紼嬪簭涓紝褰撹皟鐢╮ecv()鍑芥暟鏃訛紝鏈繀鐢ㄦ埛絀洪棿灝卞凡緇忓瓨鍦ㄦ暟鎹紝閭d箞姝ゆ椂recv()鍑芥暟灝變細澶勪簬絳夊緟鐘舵併?br style="margin: 0px; padding: 0px;" />
褰撲嬌鐢╯ocket()鍑芥暟鍜學SASocket()鍑芥暟鍒涘緩濂楁帴瀛楁椂錛岄粯璁ょ殑濂楁帴瀛楅兘鏄樆濉炵殑銆傝繖鎰忓懗鐫褰撹皟鐢╓indows Sockets API涓嶈兘绔嬪嵆瀹屾垚鏃訛紝綰跨▼澶勪簬絳夊緟鐘舵侊紝鐩村埌鎿嶄綔瀹屾垚銆?/span>
騫朵笉鏄墍鏈塛indows Sockets API浠ラ樆濉炲鎺ュ瓧涓哄弬鏁拌皟鐢ㄩ兘浼氬彂鐢熼樆濉炪備緥濡傦紝浠ラ樆濉炴ā寮忕殑濂楁帴瀛椾負鍙傛暟璋冪敤bind()銆乴isten()鍑芥暟鏃訛紝鍑芥暟浼氱珛鍗寵繑鍥炪傚皢鍙兘闃誨濂楁帴瀛楃殑Windows Sockets API璋冪敤鍒嗕負浠ヤ笅鍥涚:
1錛庤緭鍏ユ搷浣滐細 recv()銆乺ecvfrom()銆乄SARecv()鍜學SARecvfrom()鍑芥暟銆備互闃誨濂楁帴瀛椾負鍙傛暟璋冪敤璇ュ嚱鏁版帴鏀舵暟鎹傚鏋滄鏃跺鎺ュ瓧緙撳啿鍖哄唴娌℃湁鏁版嵁鍙錛屽垯璋冪敤綰跨▼鍦ㄦ暟鎹埌鏉ュ墠涓鐩寸潯鐪犮?/span>
2錛庤緭鍑烘搷浣滐細 send()銆乻endto()銆乄SASend()鍜學SASendto()鍑芥暟銆備互闃誨濂楁帴瀛椾負鍙傛暟璋冪敤璇ュ嚱鏁板彂閫佹暟鎹傚鏋滃鎺ュ瓧緙撳啿鍖烘病鏈夊彲鐢ㄧ┖闂達紝綰跨▼浼氫竴鐩寸潯鐪狅紝鐩村埌鏈夌┖闂淬?/span>
3錛庢帴鍙楄繛鎺ワ細accept()鍜學SAAcept()鍑芥暟銆備互闃誨濂楁帴瀛椾負鍙傛暟璋冪敤璇ュ嚱鏁幫紝絳夊緟鎺ュ彈瀵規柟鐨勮繛鎺ヨ姹傘傚鏋滄鏃舵病鏈夎繛鎺ヨ姹傦紝綰跨▼灝變細榪涘叆鐫$湢鐘舵併?/span>
4錛庡鍑鴻繛鎺ワ細connect()鍜學SAConnect()鍑芥暟銆傚浜嶵CP榪炴帴錛屽鎴風浠ラ樆濉炲鎺ュ瓧涓哄弬鏁幫紝璋冪敤璇ュ嚱鏁板悜鏈嶅姟鍣ㄥ彂璧瘋繛鎺ャ傝鍑芥暟鍦ㄦ敹鍒版湇鍔″櫒鐨勫簲絳斿墠錛屼笉浼氳繑鍥炪傝繖鎰忓懗鐫TCP榪炴帴鎬諱細絳夊緟鑷沖皯鍒版湇鍔″櫒鐨勪竴嬈″線榪旀椂闂淬?/span>
銆銆浣跨敤闃誨妯″紡鐨勫鎺ュ瓧錛屽紑鍙戠綉緇滅▼搴忔瘮杈冪畝鍗曪紝瀹規槗瀹炵幇銆傚綋甯屾湜鑳藉绔嬪嵆鍙戦佸拰鎺ユ敹鏁版嵁錛屼笖澶勭悊鐨勫鎺ュ瓧鏁伴噺姣旇緝灝戠殑鎯呭喌涓嬶紝浣跨敤闃誨妯″紡鏉ュ紑鍙戠綉緇滅▼搴忔瘮杈冨悎閫傘?/span>
闃誨妯″紡濂楁帴瀛楃殑涓嶈凍琛ㄧ幇涓猴紝鍦ㄥぇ閲忓緩绔嬪ソ鐨勫鎺ュ瓧綰跨▼涔嬮棿榪涜閫氫俊鏃舵瘮杈冨洶闅俱傚綋浣跨敤“鐢熶駭鑰?娑堣垂鑰?#8221;妯″瀷寮鍙戠綉緇滅▼搴忔椂錛屼負姣忎釜濂楁帴瀛楅兘鍒嗗埆鍒嗛厤涓涓綰跨▼銆佷竴涓鐞嗘暟鎹嚎紼嬪拰涓涓敤浜庡悓姝ョ殑浜嬩歡錛岄偅涔堣繖鏍鋒棤鐤戝姞澶х郴緇熺殑寮閿銆傚叾鏈澶х殑緙虹偣鏄綋甯屾湜鍚屾椂澶勭悊澶ч噺濂楁帴瀛楁椂錛屽皢鏃犱粠涓嬫墜錛屽叾鎵╁睍鎬у緢宸?/span>
鎴戜滑鎶婁竴涓猄OCKET鎺ュ彛璁劇疆涓洪潪闃誨灝辨槸鍛婅瘔鍐呮牳錛屽綋鎵璇鋒眰鐨処/O鎿嶄綔鏃犳硶瀹屾垚鏃訛紝涓嶈灝嗚繘紼嬬潯鐪狅紝鑰屾槸榪斿洖涓涓敊璇傝繖鏍鋒垜浠殑I/O鎿嶄綔鍑芥暟灝嗕笉鏂殑嫻嬭瘯鏁版嵁鏄惁宸茬粡鍑嗗濂斤紝濡傛灉娌℃湁鍑嗗濂斤紝緇х畫嫻嬭瘯錛岀洿鍒版暟鎹噯澶囧ソ涓烘銆傚湪榪欎釜涓嶆柇嫻嬭瘯鐨勮繃紼嬩腑錛屼細澶ч噺鐨勫崰鐢–PU鐨勬椂闂淬?/span>
鎶?span style="margin: 0px; padding: 0px; font-size: 14px;">SOCKET璁劇疆涓洪潪闃誨妯″紡錛屽嵆閫氱煡緋葷粺鍐呮牳錛氬湪璋冪敤Windows Sockets API鏃訛紝涓嶈璁╃嚎紼嬬潯鐪狅紝鑰屽簲璇ヨ鍑芥暟绔嬪嵆榪斿洖銆傚湪榪斿洖鏃訛紝璇ュ嚱鏁拌繑鍥炰竴涓敊璇唬鐮併傚浘鎵紺猴紝涓涓潪闃誨妯″紡濂楁帴瀛楀嬈¤皟鐢╮ecv()鍑芥暟鐨勮繃紼嬨傚墠涓夋璋冪敤recv()鍑芥暟鏃訛紝鍐呮牳鏁版嵁榪樻病鏈夊噯澶囧ソ銆傚洜姝わ紝璇ュ嚱鏁扮珛鍗寵繑鍥濿SAEWOULDBLOCK閿欒浠g爜銆傜鍥涙璋冪敤recv()鍑芥暟鏃訛紝鏁版嵁宸茬粡鍑嗗濂斤紝琚鍒跺埌搴旂敤紼嬪簭鐨勭紦鍐插尯涓紝recv()鍑芥暟榪斿洖鎴愬姛鎸囩ず錛屽簲鐢ㄧ▼搴忓紑濮嬪鐞嗘暟鎹?/span>

褰撲嬌鐢╯ocket()鍑芥暟鍜學SASocket()鍑芥暟鍒涘緩濂楁帴瀛楁椂錛岄粯璁ら兘鏄樆濉炵殑銆傚湪鍒涘緩濂楁帴瀛椾箣鍚庯紝閫氳繃璋冪敤ioctlsocket()鍑芥暟錛屽皢璇ュ鎺ュ瓧璁劇疆涓洪潪闃誨妯″紡銆侺inux涓嬬殑鍑芥暟鏄?fcntl().
濂楁帴瀛楄緗負闈為樆濉炴ā寮忓悗錛屽湪璋冪敤Windows Sockets API鍑芥暟鏃訛紝璋冪敤鍑芥暟浼氱珛鍗寵繑鍥炪傚ぇ澶氭暟鎯呭喌涓嬶紝榪欎簺鍑芥暟璋冪敤閮戒細璋冪敤“澶辮觸”錛屽茍榪斿洖WSAEWOULDBLOCK閿欒浠g爜銆傝鏄庤姹傜殑鎿嶄綔鍦ㄨ皟鐢ㄦ湡闂村唴娌℃湁鏃墮棿瀹屾垚銆傞氬父錛屽簲鐢ㄧ▼搴忛渶瑕侀噸澶嶈皟鐢ㄨ鍑芥暟錛岀洿鍒拌幏寰楁垚鍔熻繑鍥炰唬鐮併?/span>
闇瑕佽鏄庣殑鏄茍闈炴墍鏈夌殑Windows Sockets API鍦ㄩ潪闃誨妯″紡涓嬭皟鐢紝閮戒細榪斿洖WSAEWOULDBLOCK閿欒銆備緥濡傦紝浠ラ潪闃誨妯″紡鐨勫鎺ュ瓧涓哄弬鏁拌皟鐢╞ind()鍑芥暟鏃訛紝灝變笉浼氳繑鍥炶閿欒浠g爜銆傚綋鐒訛紝鍦ㄨ皟鐢╓SAStartup()鍑芥暟鏃舵洿涓嶄細榪斿洖璇ラ敊璇唬鐮侊紝鍥犱負璇ュ嚱鏁版槸搴旂敤紼嬪簭絎竴璋冪敤鐨勫嚱鏁幫紝褰撶劧涓嶄細榪斿洖榪欐牱鐨勯敊璇唬鐮併?/span>
瑕佸皢濂楁帴瀛楄緗負闈為樆濉炴ā寮忥紝闄や簡浣跨敤ioctlsocket()鍑芥暟涔嬪錛岃繕鍙互浣跨敤WSAAsyncselect()鍜學SAEventselect()鍑芥暟銆傚綋璋冪敤璇ュ嚱鏁版椂錛屽鎺ュ瓧浼氳嚜鍔ㄥ湴璁劇疆涓洪潪闃誨鏂瑰紡銆?br style="margin: 0px; padding: 0px;" />
銆銆鐢變簬浣跨敤闈為樆濉炲鎺ュ瓧鍦ㄨ皟鐢ㄥ嚱鏁版椂錛屼細緇忓父榪斿洖WSAEWOULDBLOCK閿欒銆傛墍浠ュ湪浠諱綍鏃跺欙紝閮藉簲浠旂粏媯鏌ヨ繑鍥炰唬鐮佸茍浣滃ソ瀵?#8220;澶辮觸”鐨勫噯澶囥傚簲鐢ㄧ▼搴忚繛緇笉鏂湴璋冪敤榪欎釜鍑芥暟錛岀洿鍒板畠榪斿洖鎴愬姛鎸囩ず涓烘銆備笂闈㈢殑紼嬪簭娓呭崟涓紝鍦╓hile寰幆浣撳唴涓嶆柇鍦拌皟鐢╮ecv()鍑芥暟錛屼互璇誨叆1024涓瓧鑺傜殑鏁版嵁銆傝繖縐嶅仛娉曞緢嫻垂緋葷粺璧勬簮銆?/span>
瑕佸畬鎴愯繖鏍風殑鎿嶄綔錛屾湁浜轟嬌鐢∕SG_PEEK鏍囧織璋冪敤recv()鍑芥暟鏌ョ湅緙撳啿鍖轟腑鏄惁鏈夋暟鎹彲璇匯傚悓鏍鳳紝榪欑鏂規硶涔熶笉濂姐傚洜涓鴻鍋氭硶瀵圭郴緇熼犳垚鐨勫紑閿鏄緢澶х殑錛屽茍涓斿簲鐢ㄧ▼搴忚嚦灝戣璋冪敤recv()鍑芥暟涓ゆ錛屾墠鑳藉疄闄呭湴璇誨叆鏁版嵁銆傝緝濂界殑鍋氭硶鏄紝浣跨敤濂楁帴瀛楃殑“I/O妯″瀷”鏉ュ垽鏂潪闃誨濂楁帴瀛楁槸鍚﹀彲璇誨彲鍐欍?/span>
闈為樆濉炴ā寮忓鎺ュ瓧涓庨樆濉炴ā寮忓鎺ュ瓧鐩告瘮錛屼笉瀹規槗浣跨敤銆備嬌鐢ㄩ潪闃誨妯″紡濂楁帴瀛楋紝闇瑕佺紪鍐欐洿澶氱殑浠g爜錛屼互渚垮湪姣忎釜Windows Sockets API鍑芥暟璋冪敤涓紝瀵規敹鍒扮殑WSAEWOULDBLOCK閿欒榪涜澶勭悊銆傚洜姝わ紝闈為樆濉炲鎺ュ瓧渚挎樉寰楁湁浜涢毦浜庝嬌鐢ㄣ?/span>
浣嗘槸錛岄潪闃誨濂楁帴瀛楀湪鎺у埗寤虹珛鐨勫涓繛鎺ワ紝鍦ㄦ暟鎹殑鏀跺彂閲忎笉鍧囷紝鏃墮棿涓嶅畾鏃訛紝鏄庢樉鍏鋒湁浼樺娍銆傝繖縐嶅鎺ュ瓧鍦ㄤ嬌鐢ㄤ笂瀛樺湪涓瀹氶毦搴︼紝浣嗗彧瑕佹帓闄や簡榪欎簺鍥伴毦錛屽畠鍦ㄥ姛鑳戒笂榪樻槸闈炲父寮哄ぇ鐨勩傞氬父鎯呭喌涓嬶紝鍙冭檻浣跨敤濂楁帴瀛楃殑“I/O妯″瀷”錛屽畠鏈夊姪浜庡簲鐢ㄧ▼搴忛氳繃寮傛鏂瑰紡錛屽悓鏃跺涓涓垨澶氫釜濂楁帴瀛楃殑閫氫俊鍔犱互綆$悊銆?/span>
綆浠嬶細涓昏鏄痵elect鍜宔poll錛涘涓涓狪O绔彛錛屼袱嬈¤皟鐢紝涓ゆ榪斿洖錛屾瘮闃誨IO騫舵病鏈変粈涔堜紭瓚婃э紱鍏抽敭鏄兘瀹炵幇鍚屾椂瀵瑰涓狪O绔彛榪涜鐩戝惉錛?/span>
I/O澶嶇敤妯″瀷浼氱敤鍒皊elect銆乸oll銆乪poll鍑芥暟錛岃繖鍑犱釜鍑芥暟涔熶細浣胯繘紼嬮樆濉烇紝浣嗘槸鍜岄樆濉濱/O鎵涓嶅悓鐨勭殑錛岃繖涓や釜鍑芥暟鍙互鍚屾椂闃誨澶氫釜I/O鎿嶄綔銆傝屼笖鍙互鍚屾椂瀵瑰涓鎿嶄綔錛屽涓啓鎿嶄綔鐨処/O鍑芥暟榪涜媯嫻嬶紝鐩村埌鏈夋暟鎹彲璇繪垨鍙啓鏃訛紝鎵嶇湡姝h皟鐢↖/O鎿嶄綔鍑芥暟銆?/span>

綆浠嬶細涓ゆ璋冪敤錛屼袱嬈¤繑鍥烇紱
棣栧厛鎴戜滑鍏佽濂楁帴鍙h繘琛屼俊鍙烽┍鍔↖/O,騫跺畨瑁呬竴涓俊鍙峰鐞嗗嚱鏁幫紝榪涚▼緇х畫榪愯騫朵笉闃誨銆傚綋鏁版嵁鍑嗗濂芥椂錛岃繘紼嬩細鏀跺埌涓涓猄IGIO淇″彿錛屽彲浠ュ湪淇″彿澶勭悊鍑芥暟涓皟鐢↖/O鎿嶄綔鍑芥暟澶勭悊鏁版嵁銆?/span>

綆浠嬶細鏁版嵁鎷瘋礉鐨勬椂鍊欒繘紼嬫棤闇闃誨銆?/span>
褰撲竴涓紓姝ヨ繃紼嬭皟鐢ㄥ彂鍑哄悗錛岃皟鐢ㄨ呬笉鑳界珛鍒誨緱鍒扮粨鏋溿傚疄闄呭鐞嗚繖涓皟鐢ㄧ殑閮ㄤ歡鍦ㄥ畬鎴愬悗錛岄氳繃鐘舵併侀氱煡鍜屽洖璋冩潵閫氱煡璋冪敤鑰呯殑杈撳叆杈撳嚭鎿嶄綔

鍚屾IO寮曡搗榪涚▼闃誨錛岀洿鑷矷O鎿嶄綔瀹屾垚銆?br style="margin: 0px; padding: 0px;" />寮傛IO涓嶄細寮曡搗榪涚▼闃誨銆?br style="margin: 0px; padding: 0px;" />IO澶嶇敤鏄厛閫氳繃select璋冪敤闃誨銆?br style="margin: 0px; padding: 0px;" />

1. select銆乸oll銆乪poll綆浠?br style="margin: 0px; padding: 0px;" />
epoll璺焥elect閮借兘鎻愪緵澶氳礬I/O澶嶇敤鐨勮В鍐蟲柟妗堛傚湪鐜板湪鐨凩inux鍐呮牳閲屾湁閮借兘澶熸敮鎸侊紝鍏朵腑epoll鏄疞inux鎵鐗規湁錛岃宻elect鍒欏簲璇ユ槸POSIX鎵瑙勫畾錛屼竴鑸搷浣滅郴緇熷潎鏈夊疄鐜?/p>
select錛?/span>
select鏈川涓婃槸閫氳繃璁劇疆鎴栬呮鏌ュ瓨鏀緁d鏍囧織浣嶇殑鏁版嵁緇撴瀯鏉ヨ繘琛屼笅涓姝ュ鐞嗐傝繖鏍鋒墍甯︽潵鐨勭己鐐規槸錛?/p>
1銆?鍗曚釜榪涚▼鍙洃瑙嗙殑fd鏁伴噺琚檺鍒訛紝鍗寵兘鐩戝惉绔彛鐨勫ぇ灝忔湁闄愩?br style="margin: 0px; padding: 0px;" />
涓鑸潵璇磋繖涓暟鐩拰緋葷粺鍐呭瓨鍏崇郴寰堝ぇ錛屽叿浣撴暟鐩彲浠at /proc/sys/fs/file-max瀵熺湅銆?2浣嶆満榛樿鏄?024涓?4浣嶆満榛樿鏄?048.
2銆?瀵箂ocket榪涜鎵弿鏃舵槸綰挎ф壂鎻忥紝鍗抽噰鐢ㄨ疆璇㈢殑鏂規硶錛屾晥鐜囪緝浣庯細
褰撳鎺ュ瓧姣旇緝澶氱殑鏃跺欙紝姣忔select()閮借閫氳繃閬嶅巻FD_SETSIZE涓猄ocket鏉ュ畬鎴愯皟搴?涓嶇鍝釜Socket鏄椿璺冪殑,閮介亶鍘嗕竴閬嶃傝繖浼氭氮璐瑰緢澶欳PU鏃墮棿銆傚鏋滆兘緇欏鎺ュ瓧娉ㄥ唽鏌愪釜鍥炶皟鍑芥暟錛屽綋浠栦滑媧昏穬鏃訛紝鑷姩瀹屾垚鐩稿叧鎿嶄綔錛岄偅灝遍伩鍏嶄簡杞錛岃繖姝f槸epoll涓巏queue鍋氱殑銆?/p>
3銆侀渶瑕佺淮鎶や竴涓敤鏉ュ瓨鏀懼ぇ閲廸d鐨勬暟鎹粨鏋勶紝榪欐牱浼氫嬌寰楃敤鎴風┖闂村拰鍐呮牳絀洪棿鍦ㄤ紶閫掕緇撴瀯鏃跺鍒跺紑閿澶?/p>
poll錛?/span>
poll鏈川涓婂拰select娌℃湁鍖哄埆錛屽畠灝嗙敤鎴蜂紶鍏ョ殑鏁扮粍鎷瘋礉鍒板唴鏍哥┖闂達紝鐒跺悗鏌ヨ姣忎釜fd瀵瑰簲鐨勮澶囩姸鎬侊紝濡傛灉璁懼灝辯華鍒欏湪璁懼絳夊緟闃熷垪涓姞鍏ヤ竴欏瑰茍緇х畫閬嶅巻錛屽鏋滈亶鍘嗗畬鎵鏈塮d鍚庢病鏈夊彂鐜板氨緇澶囷紝鍒欐寕璧峰綋鍓嶈繘紼嬶紝鐩村埌璁懼灝辯華鎴栬呬富鍔ㄨ秴鏃訛紝琚敜閱掑悗瀹冨張瑕佸啀嬈¢亶鍘唂d銆傝繖涓繃紼嬬粡鍘嗕簡澶氭鏃犺皳鐨勯亶鍘嗐?/p>
瀹冩病鏈夋渶澶ц繛鎺ユ暟鐨勯檺鍒訛紝鍘熷洜鏄畠鏄熀浜庨摼琛ㄦ潵瀛樺偍鐨勶紝浣嗘槸鍚屾牱鏈変竴涓己鐐癸細
1銆佸ぇ閲忕殑fd鐨勬暟緇勮鏁翠綋澶嶅埗浜庣敤鎴鋒佸拰鍐呮牳鍦板潃絀洪棿涔嬮棿錛岃屼笉綆¤繖鏍風殑澶嶅埗鏄笉鏄湁鎰忎箟銆?nbsp; 2銆乸oll榪樻湁涓涓壒鐐規槸“姘村鉤瑙﹀彂”錛屽鏋滄姤鍛婁簡fd鍚庯紝娌℃湁琚鐞嗭紝閭d箞涓嬫poll鏃朵細鍐嶆鎶ュ憡璇d銆?/p>epoll:
epoll鏀寔姘村鉤瑙﹀彂鍜岃竟緙樿Е鍙戯紝鏈澶х殑鐗圭偣鍦ㄤ簬杈圭紭瑙﹀彂錛屽畠鍙憡璇夎繘紼嬪摢浜沠d鍒氬垰鍙樹負灝遍渶鎬侊紝騫朵笖鍙細閫氱煡涓嬈°傝繕鏈変竴涓壒鐐規槸錛宔poll浣跨敤“浜嬩歡”鐨勫氨緇氱煡鏂瑰紡錛岄氳繃epoll_ctl娉ㄥ唽fd錛屼竴鏃﹁fd灝辯華錛屽唴鏍稿氨浼氶噰鐢ㄧ被浼糲allback鐨勫洖璋冩満鍒舵潵嬋媧昏fd錛宔poll_wait渚垮彲浠ユ敹鍒伴氱煡
epoll鐨勪紭鐐癸細
1銆佹敮鎸佷竴涓繘紼嬫墍鑳芥墦寮鐨勬渶澶ц繛鎺ユ暟
select | 鍗曚釜榪涚▼鎵鑳芥墦寮鐨勬渶澶ц繛鎺ユ暟鏈塅D_SETSIZE瀹忓畾涔夛紝鍏跺ぇ灝忔槸32涓暣鏁扮殑澶у皬錛堝湪32浣嶇殑鏈哄櫒涓婏紝澶у皬灝辨槸32*32錛屽悓鐞?4浣嶆満鍣ㄤ笂FD_SETSIZE涓?2*64錛夛紝褰撶劧鎴戜滑鍙互瀵硅繘琛屼慨鏀癸紝鐒跺悗閲嶆柊緙栬瘧鍐呮牳錛屼絾鏄ц兘鍙兘浼氬彈鍒板獎鍝嶏紝榪欓渶瑕佽繘涓姝ョ殑嫻嬭瘯銆?/p> |
poll | poll鏈川涓婂拰select娌℃湁鍖哄埆錛屼絾鏄畠娌℃湁鏈澶ц繛鎺ユ暟鐨勯檺鍒訛紝鍘熷洜鏄畠鏄熀浜庨摼琛ㄦ潵瀛樺偍鐨?/p> |
epoll | 铏界劧榪炴帴鏁版湁涓婇檺錛屼絾鏄緢澶э紝1G鍐呭瓨鐨勬満鍣ㄤ笂鍙互鎵撳紑10涓囧乏鍙崇殑榪炴帴錛?G鍐呭瓨鐨勬満鍣ㄥ彲浠ユ墦寮20涓囧乏鍙崇殑榪炴帴 |
2銆丗D鍓у鍚庡甫鏉ョ殑IO鏁堢巼闂
select | 鍥犱負姣忔璋冪敤鏃墮兘浼氬榪炴帴榪涜綰挎ч亶鍘嗭紝鎵浠ラ殢鐫FD鐨勫鍔犱細閫犳垚閬嶅巻閫熷害鎱㈢殑“綰挎т笅闄嶆ц兘闂”銆?/p> |
poll | 鍚屼笂 |
epoll | 鍥犱負epoll鍐呮牳涓疄鐜版槸鏍規嵁姣忎釜fd涓婄殑callback鍑芥暟鏉ュ疄鐜扮殑錛屽彧鏈夋椿璺冪殑socket鎵嶄細涓誨姩璋冪敤callback錛屾墍浠ュ湪媧昏穬socket杈冨皯鐨勬儏鍐典笅錛屼嬌鐢╡poll娌℃湁鍓嶉潰涓よ呯殑綰挎т笅闄嶇殑鎬ц兘闂錛屼絾鏄墍鏈塻ocket閮藉緢媧昏穬鐨勬儏鍐典笅錛屽彲鑳戒細鏈夋ц兘闂銆?/p> |
3銆?娑堟伅浼犻掓柟寮?/p>
select | 鍐呮牳闇瑕佸皢娑堟伅浼犻掑埌鐢ㄦ埛絀洪棿錛岄兘闇瑕佸唴鏍告嫹璐濆姩浣?/p> |
poll | 鍚屼笂 |
epoll | epoll閫氳繃鍐呮牳鍜岀敤鎴風┖闂村叡浜竴鍧楀唴瀛樻潵瀹炵幇鐨勩?/p> |
鎬葷粨錛?/span>
緇間笂錛屽湪閫夋嫨select錛宲oll錛宔poll鏃惰鏍規嵁鍏蜂綋鐨勪嬌鐢ㄥ満鍚堜互鍙婅繖涓夌鏂瑰紡鐨勮嚜韜壒鐐廣?/p>
1銆佽〃闈笂鐪媏poll鐨勬ц兘鏈濂斤紝浣嗘槸鍦ㄨ繛鎺ユ暟灝戝茍涓旇繛鎺ラ兘鍗佸垎媧昏穬鐨勬儏鍐典笅錛宻elect鍜宲oll鐨勬ц兘鍙兘姣攅poll濂斤紝姣曠珶epoll鐨勯氱煡鏈哄埗闇瑕佸緢澶氬嚱鏁板洖璋冦?/p>
2銆?span style="margin: 0px; padding: 0px; color: #000000; background-color: #ffcc00;">select浣庢晥鏄洜涓烘瘡嬈″畠閮介渶瑕佽疆璇€備絾浣庢晥涔熸槸鐩稿鐨勶紝瑙嗘儏鍐佃屽畾錛屼篃鍙氳繃鑹ソ鐨勮璁℃敼鍠?/span>
闈㈠悜榪炴帴鐨?/span>Socket閫氫俊鏄熀浜?/span>TCP鐨勩傜綉緇滀腑鐨勪袱涓繘紼嬩互瀹㈡埛鏈?/span>/鏈嶅姟鍣ㄦā寮忚繘琛岄氫俊
鏈嶅姟鍣ㄧ▼搴忚鍏堜簬瀹㈡埛鏈虹▼搴忓惎鍔紝姣忎釜姝ラ涓皟鐢ㄧ殑Socket鍑芥暟濡備笅錛?/span>
錛?/span>1錛夎皟鐢?/span>WSAStartup()鍑芥暟鍔犺澆Windows Sockets鍔ㄦ佸簱錛岀劧鍚庤皟鐢?/span>socket()鍑芥暟鍒涘緩涓涓祦寮忓鎺ュ瓧錛岃繑鍥炲鎺ュ瓧鍙?/span>s銆?/span>
錛?/span>2錛夎皟鐢?/span>bind()鍑芥暟灝嗗鎺ュ瓧s緇戝畾鍒頒竴涓凡鐭ョ殑鍦板潃錛岄氬父涓烘湰鍦?/span>IP鍦板潃銆?/span>
錛?/span>3錛夎皟鐢?/span>listen()鍑芥暟灝嗗鎺ュ瓧s璁劇疆涓轟睛鍚ā寮忥紝鍑嗗濂芥帴鏀舵潵鑷悇涓鎴鋒満鐨勮繛鎺ヨ姹傘?/span>
錛?/span>4錛夎皟鐢?/span>accept()鍑芥暟絳夊緟鎺ュ彈瀹㈡埛绔殑榪炴帴璇鋒眰銆?/span>
錛?/span>5錛夊鏋滄帴鏀跺埌瀹㈡埛绔殑璇鋒眰錛屽垯accept()鍑芥暟榪斿洖錛屽緱鍒版柊鐨勫鎺ュ瓧ns銆?/span>
錛?/span>6錛夎皟鐢?/span>recv()鍑芥暟鎺ユ敹鏉ヨ嚜瀹㈡埛绔殑鏁版嵁錛岃皟鐢?/span>send()鍑芥暟鍚戝鎴風鍙戦佹暟鎹?/span>
錛?/span>7錛変笌瀹㈡埛绔殑閫氫俊緇撴潫鍚庯紝鏈嶅姟鍣ㄧ▼搴忓彲浠ヨ皟鐢?/span>shutdown()鍑芥暟閫氱煡瀵規柟涓嶅啀鍙戦佹垨鎺ユ敹鏁版嵁錛屼篃鍙互鐢卞鎴風紼嬪簭鏂紑榪炴帴銆傛柇寮榪炴帴鍚庯紝鏈嶅姟鍣ㄨ繘紼嬭皟鐢?/span>closesocket()鍑芥暟鍏抽棴濂楁帴瀛?/span>ns銆傛鍚庢湇鍔″櫒紼嬪簭榪斿洖絎?/span>4姝ワ紝緇х畫絳夊緟瀹㈡埛绔繘紼嬬殑榪炴帴銆?/span>
錛?/span>8錛夊鏋滆閫鍑烘湇鍔″櫒紼嬪簭錛屽垯璋冪敤closesocket()鍑芥暟鍏抽棴鏈鍒濈殑濂楁帴瀛?/span>s銆?/span>
瀹㈡埛绔▼搴忓湪姣忎竴姝ラ涓嬌鐢ㄧ殑鍑芥暟濡備笅錛?/span>
錛?/span>1錛夎皟鐢?/span>WSAStartup()鍑芥暟鍔犺澆Windows Sockets鍔ㄦ佸簱錛岀劧鍚庤皟鐢?/span>socket()鍑芥暟鍒涘緩涓涓祦寮忓鎺ュ瓧錛岃繑鍥炲鎺ュ瓧鍙?/span>s銆?/span>
錛?/span>2錛夎皟鐢?/span>connect()鍑芥暟灝嗗鎺ュ瓧s榪炴帴鍒版湇鍔″櫒銆?/span>
錛?/span>3錛夎皟鐢?/span>send()鍑芥暟鍚戞湇鍔″櫒鍙戦佹暟鎹紝璋冪敤recv()鍑芥暟鎺ユ敹鏉ヨ嚜鏈嶅姟鍣ㄧ殑鏁版嵁銆?/span>
錛?/span>4錛変笌鏈嶅姟鍣ㄧ殑閫氫俊緇撴潫鍚庯紝瀹㈡埛绔▼搴忓彲浠ヨ皟鐢?/span>shutdown()鍑芥暟閫氱煡瀵規柟涓嶅啀鍙戦佹垨鎺ユ敹鏁版嵁錛屼篃鍙互鐢辨湇鍔″櫒紼嬪簭鏂紑榪炴帴銆傛柇寮榪炴帴鍚庯紝瀹㈡埛绔繘紼嬭皟鐢?/span>closesocket()鍑芥暟鍏抽棴濂楁帴瀛椼?/span>
閫氳繃涓涓帶鍒跺彴搴旂敤紼嬪簭瀹炰緥鏉ユ紨紺哄垵濮嬪寲Windows Sockets騫惰緭鍑哄緱鍒扮殑鐗堟湰淇℃伅銆?br />

娉ㄩ噴1錛?/p>
瀛楁wVersion錛歐indows Sockets DLL鏈熸湜璋冪敤鑰呬嬌鐢ㄧ殑Windows Sockets瑙勮寖鐨勭増鏈紝涓篧ORD綾誨瀷銆傞珮浣嶅瓧鑺備腑瀛樺偍鍓増鏈彿錛屽湴浣嶅瓧鑺備腑瀛樺偍涓葷増鏈彿銆傝皟鐢↙OBYTE()鍑芥暟鍙互榪斿洖WORD綾誨瀷鏁版嵁鐨勫湴浣嶅瓧鑺傦紝浠庤岃幏鍙栦富鐗堟湰鍙鳳紱璋冪敤HIBYTE()鍑芥暟鍙互榪斿洖WORD綾誨瀷鏁版嵁鐨勯珮浣嶅瓧鑺傦紝浠庤岃幏鍙栧壇鐗堟湰鍙楓?/p>
娉ㄩ噴2錛?/p>
瀛楁wHighVersion錛歐indows Sockets DLL 鍙互鏀寔鐨刉indows Sockets 瑙勮寖鐨勬渶楂樼増鏈?/p>
娉ㄩ噴3錛?/p>
瀛楁szDescription錛氫互null緇撳熬鐨凙SCLL瀛楃涓層俉indows Sockets DLL灝嗗Windows Sockets瀹炵幇鐨勬弿榪板鍒跺埌璇ュ瓧絎︿覆涓紝鏈澶氬彲浠ュ寘鍚?56涓瓧絎︺?/p>
娉ㄩ噴4錛?/p>
瀛楁szSystemStatus錛氫互null緇撳熬鐨凙SCLL瀛楃涓詫紝Windows Sockets DLL灝嗘湁鍏崇姸鎬佹垨閰嶇疆淇℃伅澶嶅埗鍒拌瀛楃涓蹭腑銆?/p>
鍏朵粬瀛楁鍙婂叾鍚箟錛?/p>
瀛楁iMaxSockets錛氬崟涓繘紼嬪彲浠ユ墦寮鐨勬渶澶ocket鏁伴噺銆俉indows Sockets鍙互鎻愪緵涓涓叏灞鐨凷ocket錛屼負姣忎釜榪涚▼鍒嗛厤Socket璧勬簮銆傜▼搴忓憳鍙互浣跨敤璇ユ暟瀛椾綔涓篧indows Sockets鏄惁鍙互琚簲鐢ㄧ▼搴忎嬌鐢ㄧ殑鍘熷渚濇嵁銆?/p>
瀛楁iMaxUdpDg錛歐indows Sockets搴旂敤紼嬪簭鑳藉鍙戦佹垨鎺ュ彈鐨勬渶澶DP鏁版嵁鍖呭ぇ灝忥紝鍗曚綅涓哄瓧鑺傘傚鏋滃疄鐜版柟寮忔病鏈夐檺鍒訛紝鍒檌MaxUdpDg絳変簬0銆?/p>
瀛楁lpVendorInfo錛氭寚鍚戦攢鍞晢鏁版嵁緇撴瀯鐨勬寚閽堛?/p>
涓銆?/span>Socket綆鍗曚粙緇?/span>
Socket鐨勪腑鏂囩炕璇戞槸濂楁帴瀛楋紝瀹冩槸TCP/IP緗戠粶鐜涓嬪簲鐢ㄧ▼搴忎笌搴曞眰閫氫俊椹卞姩紼嬪簭涔嬮棿榪愯鐨勫紑鍙戞帴鍙o紝瀹冨彲浠ュ皢搴旂敤紼嬪簭涓庡叿浣撶殑TCP/IP闅旂寮鏉ワ紝浣垮緱搴旂敤紼嬪簭涓嶉渶瑕佷簡瑙?/span>TCP/IP鐨勫叿浣撶粏鑺傦紝灝辮兘澶熷疄鐜版暟鎹紶杈撱?/span>
鍏充簬Socket闇瑕佷簡瑙g殑榪樻湁寰堝錛屾垜灝嗗湪闅忓悗鐨勭珷鑺傞噷闄嗙畫鍐欎笂銆?/span>
浜屻?/span>Socket搴旂敤紼嬪簭妗嗘灦
榪欓噷鍏堝0鏄庝竴涓嬶紝鎴戠敤鐨勬槸32浣?/span>win7緋葷粺錛?/span>vs2010緙栬瘧鍣ㄣ?/span>
棣栧厛鏂板緩涓涓病鏈夐緙栬瘧澶寸殑Win32鎺у埗鍙板簲鐢ㄧ▼搴忋?/span>
搴旂敤紼嬪簭妗嗘灦濡備笅錛?br />


娉ㄩ噴1錛?/p>
鎴戜滑鍦╲s涓竴鑸嬌鐢╓insock2瀹炵幇緗戠粶閫氫俊鍔熻兘錛岄渶瑕佸紩榪涘ご鏂囦歡winsock2.h鍜屽簱鏂囦歡ws2_32.lib銆?/p>
娉ㄩ噴2錛?/p>
WSADATA緇撴瀯浣撲腑涓昏鍖呭惈浜嗙郴緇熸墍鏀寔鐨刉insock鐗堟湰淇℃伅銆?/p>
娉ㄩ噴3“
WSAStartup()鍑芥暟鐢ㄤ簬鍒濆鍖朩indows Sockets錛屽茍榪斿洖WSADATA緇撴瀯浣撱傚彧鏈夎皟鐢╓SAStartup()鍑芥暟鍚庯紝搴旂敤紼嬪簭鎵嶈兘璋冪敤鍏朵粬Windows Sockets API鍑芥暟錛屽疄鐜扮綉緇滈氫俊銆?/p>
絎竴涓弬鏁版槸鐗堟湰鍙鳳紝絎簩涓弬鏁扮敤浜庢帴鏀剁増鏈俊鎭?/p>
濡傛灉鍑芥暟鎵ц鎴愬姛鍒欎細榪斿洖0銆?/p>
娉ㄩ噴4錛?/p>
鏈鍚庡簲璇ュ仛鐨勪竴浜涙竻鐞嗗伐浣溿?/p>