锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品在这里,欧美在线影院,欧美高清在线http://www.shnenglu.com/walkspeed/category/3643.htmlzh-cnThu, 22 May 2008 21:01:48 GMTThu, 22 May 2008 21:01:48 GMT60鎺ュ彈鍣紞榪炴帴鍣紙Acceptor-Connector錛夋ā寮?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/02/27/19031.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 27 Feb 2007 13:47:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/02/27/19031.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/19031.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/02/27/19031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/19031.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/19031.html</trackback:ping><description><![CDATA[     鎽樿: 9.1 鎰忓浘 銆 鎺ュ彈鍣紞榪炴帴鍣ㄨ璁℃ā寮忥紙Acceptor-Connector錛変嬌鍒嗗竷寮忕郴緇熶腑鐨勮繛鎺ュ緩绔嬪強鏈嶅姟鍒濆鍖栦笌涓鏃︽湇鍔″垵濮嬪寲鍚庢墍鎵ц鐨勫鐞嗗幓鑰﹀悎銆傝繖鏍風殑鍘昏﹀悎閫氳繃涓夌緇勪歡鏉ュ畬鎴愶細acceptor銆乧onnector鍜宻ervice handler錛堟湇鍔″鐞嗗櫒錛夈傝繛鎺ュ櫒涓誨姩鍦板緩绔嬪埌榪滃湴鎺ュ彈鍣ㄧ粍浠剁殑榪炴帴錛屽茍鍒濆鍖栨湇鍔″鐞嗗櫒鏉ュ鐞嗗湪榪炴帴涓婁氦...  <a href='http://www.shnenglu.com/walkspeed/archive/2007/02/27/19031.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/walkspeed/aggbug/19031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-02-27 21:47 <a href="http://www.shnenglu.com/walkspeed/archive/2007/02/27/19031.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ACE鐨勬帴鍙楀櫒錛圓cceptor錛夊拰榪炴帴鍣紙Connector錛夛細榪炴帴寤虹珛妯″紡http://www.shnenglu.com/walkspeed/archive/2007/02/27/19030.htmlwalkspeedwalkspeedTue, 27 Feb 2007 13:40:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/02/27/19030.htmlhttp://www.shnenglu.com/walkspeed/comments/19030.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/02/27/19030.html#Feedback1http://www.shnenglu.com/walkspeed/comments/commentRss/19030.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/19030.html闃呰鍏ㄦ枃

walkspeed 2007-02-27 21:40 鍙戣〃璇勮
]]>
杞澆涓鐗囧叧浜庡墠鎽勫櫒錛圥roactor錛夌殑鏂囩珷http://www.shnenglu.com/walkspeed/archive/2007/02/27/19029.htmlwalkspeedwalkspeedTue, 27 Feb 2007 13:17:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/02/27/19029.htmlhttp://www.shnenglu.com/walkspeed/comments/19029.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/02/27/19029.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/19029.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/19029.html 絎?/b> 8 绔?/b> 鍓嶆憚鍣紙 Proactor 錛夛細鐢ㄤ簬涓哄紓姝ヤ簨浠跺璺垎紱誨拰鍒嗘淳澶勭悊鍣ㄧ殑瀵硅薄琛屼負妯″紡
Irfan Pyarali 聽 Tim Harrison聽聽 Douglas C. Schmidt聽聽 Thomas D. Jordan
鎽?/b> 瑕?/b>
鐜頒唬鎿嶄綔緋葷粺涓哄紑鍙戝茍鍙戝簲鐢ㄦ彁渚涗簡澶氱鏈哄埗銆傚悓姝ュ綰跨▼鏄竴縐嶆祦琛岀殑鏈哄埗錛岀敤浜庡紑鍙戝悓鏃舵墽琛屽涓搷浣滅殑搴旂敤銆備絾鏄紝綰跨▼甯稿父鏈夊緢楂樼殑鎬ц兘寮閿錛屽茍涓旈渶瑕佸鍚屾妯″紡鍜屽師鐞嗘湁娣卞叆鐨勪簡瑙c傚洜姝わ紝鏈夎秺鏉ヨ秺澶氱殑鎿嶄綔緋葷粺鏀寔寮傛鏈哄埗錛屽湪鍑忓皯澶氱嚎紼嬬殑澶ч噺寮閿鍜屽鏉傛х殑鍚屾椂錛屾彁渚涗簡騫跺彂鐨勫ソ澶勩?/i>
鏈鏂囦腑浠嬬粛鐨勫墠鎽勫櫒錛圥roactor 錛夋ā寮忔弿榪版庢牱鏋勯犲簲鐢ㄥ拰緋葷粺錛屼互鏈夋晥鍦板埄鐢ㄦ搷浣滅郴緇熸敮鎸佺殑寮傛鏈哄埗銆傚綋搴旂敤璋冪敤寮傛鎿嶄綔鏃訛紝OS 浠h〃搴旂敤鎵ц姝ゆ搷浣溿傝繖浣垮緱搴旂敤鍙互璁╁涓搷浣滃悓鏃惰繍琛岋紝鑰屽張涓嶉渶瑕佸簲鐢ㄦ嫢鏈夌浉搴旀暟鐩殑綰跨▼銆傚洜姝わ紝閫氳繃浣跨敤鏇村皯鐨勭嚎紼嬪拰鏈夋晥鍒╃敤OS 瀵瑰紓姝ユ搷浣滅殑鏀寔錛屽墠鎽勫櫒妯″紡綆鍖栦簡騫跺彂緙栫▼錛屽茍鏀瑰杽浜嗘ц兘銆?/i>
8.1 鎰忓浘
鍓嶆憚鍣ㄦā寮忔敮鎸佸涓簨浠跺鐞嗗櫒鐨勫璺垎紱誨拰鍒嗘淳錛岃繖浜涘鐞嗗櫒鐢卞紓姝ヤ簨浠剁殑瀹屾垚鏉ヨЕ鍙戙傞氳繃闆嗘垚瀹屾垚浜嬩歡錛坈ompletion event錛夌殑澶氳礬鍒嗙鍜岀浉搴旂殑浜嬩歡澶勭悊鍣ㄧ殑鍒嗘淳錛岃妯″紡綆鍖栦簡寮傛搴旂敤鐨勫紑鍙戙?/div>
8.2 鍔ㄦ満
榪欎竴閮ㄥ垎鎻愪緵浣跨敤鍓嶆憚鍣ㄦā寮忕殑涓婁笅鏂囧拰鍔ㄦ満銆?/div>
8.2.1 涓婁笅鏂囧拰鍘嬪姏
鍓嶆憚鍣ㄦā寮忓簲璇ヨ鐢ㄤ簬搴旂敤闇瑕佸茍鍙戞墽琛屾搷浣滅殑鎬ц兘濂藉銆佸張涓嶆兂鍙楀埌鍚屾澶氱嚎紼嬫垨鍙嶅簲寮忕紪紼嬬殑綰︽潫鏃躲備負璇存槑榪欎簺濂藉錛岃鎯充竴涓渶瑕佸茍鍙戞墽琛屽涓搷浣滅殑緗戠粶搴旂敤銆備緥濡傦紝涓涓珮鎬ц兘Web鏈嶅姟鍣ㄥ繀欏誨茍鍙戝鐞嗗彂閫佽嚜澶氫釜瀹㈡埛鐨凥TTP璇鋒眰[1, 2]銆傚浘8-1 鏄劇ず浜哤eb嫻忚鍣ㄥ拰Web鏈嶅姟鍣ㄤ箣闂寸殑鍏稿瀷浜や簰銆傚綋鐢ㄦ埛鎸囩ず嫻忚鍣ㄦ墦寮涓涓猆RL鏃訛紝嫻忚鍣ㄥ彂閫佷竴涓狧TTP GET璇鋒眰緇橶eb鏈嶅姟鍣ㄣ傛敹鍒拌姹傦紝鏈嶅姟鍣ㄥ氨瑙f瀽騫舵牎楠岃姹傦紝騫跺皢鎸囧畾鐨勬枃浠跺彂鍥炵粰嫻忚鍣ㄣ?/div>
鍥?-1 鍏稿瀷鐨刉eb鏈嶅姟鍣ㄩ氫俊杞歡浣撶郴緇撴瀯
寮鍙戦珮鎬ц兘Web鏈嶅姟鍣ㄨ姹傛秷闄や互涓嬪帇鍔涳細
  • 騫跺彂鎬?/i>錛氭湇鍔″櫒蹇呴』鍚屾椂鎵ц澶氫釜瀹㈡埛璇鋒眰錛?
  • 鏁堢巼錛氭湇鍔″櫒蹇呴』鏈灝忓寲鍝嶅簲寤惰繜銆佹渶澶у寲鍚炲悙閲忥紝騫墮伩鍏嶄笉蹇呰鍦頒嬌鐢–PU錛?
  • 緙栫▼綆鍗曟?/i>錛氭湇鍔″櫒鐨勮璁″簲璇ョ畝鍖栭珮鏁堢殑騫跺彂絳栫暐鐨勪嬌鐢紱
  • 鍙傞厤鎬?/i>錛氬簲璇ヤ嬌緇ф壙鏂扮殑鎴栨敼榪涚殑浼犺緭鍗忚錛堟瘮濡侶TTP 1.1[3]錛夋墍甯︽潵鐨勭淮鎶や唬浠鋒渶灝忓寲銆?
Web鏈嶅姟鍣ㄥ彲浠ヤ嬌鐢ㄨ嫢騫插茍鍙戠瓥鐣ユ潵瀹炵幇錛屽寘鎷涓悓姝ョ嚎紼嬨佸弽搴斿紡鍚屾浜嬩歡鍒嗘淳鍜屽墠鎽勫紡寮傛浜嬩歡鍒嗘淳銆備笅闈紝鎴戜滑媯鏌ヤ紶緇熸柟娉曠殑緙虹偣錛屽茍瑙i噴鍓嶆憚鍣ㄦā寮忔槸鎬庢牱鎻愪緵涓縐嶅己澶х殑鎶鏈紝涓洪珮鎬ц兘騫跺彂搴旂敤鑰屾敮鎸侀珮鏁堛佺伒媧葷殑寮傛浜嬩歡鍒嗘淳絳栫暐鐨勩?/div>
8.2.2 浼犵粺騫跺彂妯″瀷鐨勫父瑙侀櫡闃卞拰緙洪櫡
鍚屾鐨勫綰跨▼鍜屽弽搴斿紡緙栫▼鏄疄鐜板茍鍙戠殑甯哥敤鏂規硶銆傝繖涓閮ㄥ垎鎻忚堪榪欎簺緙栫▼妯″瀷鐨勭己鐐廣?/div>
8.2.2.1 閫氳繃澶氫釜鍚屾綰跨▼瀹炵幇鐨勫茍鍙?/b>
鎴栬鏈涓虹洿瑙傜殑瀹炵幇騫跺彂Web鏈嶅姟鍣ㄧ殑閫斿緞鏄嬌鐢?i>鍚屾鐨勫綰跨▼銆傚湪姝ゆā鍨嬩腑錛屽涓湇鍔″櫒綰跨▼鍚屾椂澶勭悊鏉ヨ嚜澶氫釜瀹㈡埛鐨凥TTP GET璇鋒眰銆傛瘡涓嚎紼嬪悓姝ュ湴鎵ц榪炴帴寤虹珛銆丠TTP璇鋒眰璇誨彇銆佽姹傝В鏋愬拰鏂囦歡浼犺緭鎿嶄綔銆備綔涓虹粨鏋滐紝姣忎釜鎿嶄綔閮介樆濉炵洿鍒板畬鎴愩?/div>
鍚屾綰跨▼鐨勪富瑕佷紭鐐規槸搴旂敤浠g爜鐨勭畝鍖栥傜壒鍒槸錛學eb鏈嶅姟鍣ㄤ負鏈嶅姟瀹㈡埛A鐨勮姹傛墍鎵ц鐨勬搷浣滃湪寰堝ぇ紼嬪害涓婄嫭绔嬩簬涓烘湇鍔″鎴稡鐨勮姹傛墍闇鐨勬搷浣溿傚洜鑰岋紝寰堝鏄撳湪鍒嗙鐨勭嚎紼嬩腑瀵逛笉鍚岀殑璇鋒眰榪涜鏈嶅姟錛屽洜涓哄湪綰跨▼涔嬮棿鍏變韓鐨勭姸鎬佹暟閲忓緢灝戯紱榪欎篃鏈灝忓寲浜嗗鍚屾鐨勯渶瑕併傝屼笖錛屽湪鍒嗙鐨勭嚎紼嬩腑鎵ц搴旂敤閫昏緫涔熶嬌寰楀紑鍙戣呭彲浠ヤ嬌鐢ㄧ洿瑙傜殑欏哄簭鍛戒護鍜岄樆濉炴搷浣溿?/div>
鍥?-2 澶氱嚎紼媁eb鏈嶅姟鍣ㄤ綋緋葷粨鏋?/div>
鍥?-2鏄劇ず浣跨敤鍚屾綰跨▼鏉ヨ璁$殑Web鏈嶅姟鍣ㄦ庢牱騫跺彂鍦板鐞嗗涓鎴瘋姹傘傝鍥炬樉紺虹殑Sync Acceptor瀵硅薄灝佽鏈嶅姟鍣ㄧ鐢ㄤ簬鍚屾鎺ュ彈緗戠粶榪炴帴鐨勬満鍒躲備嬌鐢ㄢ淭hread Per Connection鈥濆茍鍙戞ā鍨嬶紝鍚勪釜綰跨▼涓烘湇鍔TTP GET璇鋒眰鎵鎵ц鐨勪竴緋誨垪姝ラ鍙鎬葷粨濡備笅錛?/div>
  1. 姣忎釜綰跨▼鍚屾鍦伴樆濉炲湪accept socket璋冪敤涓紝絳夊緟瀹㈡埛榪炴帴璇鋒眰錛?
  2. 瀹㈡埛榪炴帴鍒版湇鍔″櫒錛岃繛鎺ヨ鎺ュ彈錛?
  3. 鏂板鎴風殑HTTP璇鋒眰琚悓姝ュ湴浠庣綉緇滆繛鎺ヤ腑璇誨彇錛?
  4. 璇鋒眰琚В鏋愶紱
  5. 鎵璇鋒眰鐨勬枃浠惰鍚屾鍦拌鍙栵紱
  6. 鏂囦歡琚悓姝ュ湴鍙戦佺粰瀹㈡埛銆?
闄勫綍A.1涓湁涓涓皢鍚屾綰跨▼妯″瀷搴旂敤浜嶹eb鏈嶅姟鍣ㄧ殑C++浠g爜渚嬪瓙銆?/div>
濡備笂鎵榪幫紝姣忎釜騫跺彂鍦拌繛鎺ョ殑瀹㈡埛鐢變竴涓笓鐢ㄧ殑鏈嶅姟鍣ㄧ嚎紼嬫湇鍔°傚湪緇х畫涓哄叾浠朒TTP璇鋒眰鏈嶅姟涔嬪墠錛岃綰跨▼鍚屾鍦板畬鎴愪竴涓璇鋒眰鐨勬搷浣溿傚洜姝わ紝瑕佸湪鏈嶅姟澶氫釜瀹㈡埛鏃舵墽琛屽悓姝/O錛學eb鏈嶅姟鍣ㄥ繀欏繪淳鐢熷涓嚎紼嬨傚敖綆¤繖縐嶅悓姝ョ嚎紼嬫ā寮忔槸鐩磋鐨勶紝涓旇兘澶熺浉瀵歸珮鏁堝湴鏄犲皠鍒板CPU騫沖彴涓婏紝瀹冭繕鏄湁浠ヤ笅緙虹偣錛?/div>
綰跨▼絳栫暐涓庡茍鍙戠瓥鐣ヨ绱ц﹀悎錛?/b>榪欑浣撶郴緇撴瀯瑕佹眰姣忎釜鐩歌繛瀹㈡埛閮芥湁涓涓笓鐢ㄧ殑綰跨▼銆傞氳繃閽堝鍙敤璧勬簮錛堟瘮濡備嬌鐢ㄧ嚎紼嬫睜鏉ュ搴擟PU鐨勬暟鐩級銆佽屼笉鏄琚茍鍙戞湇鍔$殑瀹㈡埛鐨勬暟鐩潵璋冩暣鍏剁嚎紼嬬瓥鐣ワ紝鍙兘浼氭洿濂藉湴浼樺寲涓涓茍鍙戝簲鐢紱
鏇村ぇ鐨勫悓姝ュ鏉傛э細綰跨▼鍙兘浼氬鍔犲簭鍒楀寲瀵規湇鍔″櫒鐨勫叡浜祫婧愶紙姣斿緙撳瓨鏂囦歡鍜學eb欏甸潰鐐瑰嚮鏃ュ織錛夌殑璁塊棶鎵蹇呴渶鐨勫悓姝ユ満鍒剁殑澶嶆潅鎬э紱
鏇村鐨勬ц兘寮閿錛?/b>鐢變簬涓婁笅鏂囧垏鎹€佸悓姝ュ拰CPU闂寸殑鏁版嵁縐誨姩[4]錛岀嚎紼嬬殑鎵ц鍙兘寰堜綆鏁堬紱
涓嶅彲縐繪鎬э細綰跨▼鏈夊彲鑳藉湪鏈変簺騫沖彴涓婁笉鍙敤銆傝屼笖錛屾牴鎹鍗犲厛寮忓拰闈炲崰鍏堝紡綰跨▼鐨勬敮鎸侊紝OS騫沖彴涔嬮棿鐨勫樊寮傞潪甯稿ぇ銆傚洜鑰岋紝寰堥毦鏋勫緩鑳藉璺ㄥ鉤鍙扮粺涓榪愪綔鐨勫綰跨▼鏈嶅姟鍣ㄣ?/div>
浣滀負榪欎簺緙虹偣鐨勭粨鏋滐紝澶氱嚎紼嬪父甯鎬笉鏄紑鍙戝茍鍙慦eb鏈嶅姟鍣ㄧ殑鏈涓洪珮鏁堢殑銆佷篃涓嶆槸鏈涓嶅鏉傜殑瑙e喅鏂規銆?/div>
8.2.2.2 閫氳繃鍙嶅簲寮忓悓姝ヤ簨浠跺垎媧懼疄鐜扮殑騫跺彂
鍙︿竴縐嶅疄鐜板悓姝eb鏈嶅姟鍣ㄧ殑甯哥敤鏂規硶鏄嬌鐢?i>鍙嶅簲寮忎簨浠跺垎媧?/i>妯″瀷銆傚弽搴斿爢錛圧eactor錛夋ā寮忔弿榪板簲鐢ㄦ庢牱灝咵vent Handler鐧昏鍒癐nitiation Dispatcher銆侷nitiation Dispatcher閫氱煡Event Handler浣曟椂鑳藉彂璧蜂竴欏規搷浣滆屼笉闃誨銆?/div>
鍗曠嚎紼嬪茍鍙慦eb鏈嶅姟鍣ㄥ彲浠ヤ嬌鐢ㄥ弽搴斿紡浜嬩歡鍒嗘淳妯″瀷錛屽畠鍦ㄤ竴涓簨浠跺驚鐜腑絳夊緟Reactor閫氱煡瀹冨彂璧烽傚綋鐨勬搷浣溿俉eb鏈嶅姟鍣ㄤ腑鍙嶅簲寮忔搷浣滅殑涓涓緥瀛愭槸Acceptor錛堟帴鍙楀櫒錛塠6]鍒癐nitiation Dispatcher鐨勭櫥璁般傚綋鏁版嵁鍦ㄧ綉緇滆繛鎺ヤ笂鍒拌揪鏃訛紝鍒嗘淳鍣ㄥ洖璋傾cceptor錛屽悗鑰呮帴鍙楃綉緇滆繛鎺ワ紝騫跺垱寤篐TTP Handler銆備簬鏄繖涓狧TTP Handler灝辯櫥璁板埌Reactor錛屼互鍦╓eb鏈嶅姟鍣ㄧ殑鍗曠嚎紼嬫帶鍒朵腑澶勭悊鍦ㄩ偅涓繛鎺ヤ笂鍒版潵鐨刄RL璇鋒眰銆?/div>
鍥?-3鍜屽浘8-4鏄劇ず浣跨敤鍙嶅簲寮忎簨浠跺垎媧捐璁$殑Web鏈嶅姟鍣ㄦ庢牱澶勭悊澶氫釜瀹㈡埛銆傚浘8-3鏄劇ず褰撳鎴瘋繛鎺ュ埌Web鏈嶅姟鍣ㄦ椂鎵閲囧彇鐨勬楠ゃ傚浘8-4鏄劇ずWeb鏈嶅姟鍣ㄦ庢牱澶勭悊瀹㈡埛璇鋒眰銆傚浘8-3鐨勪竴緋誨垪姝ラ鍙鎬葷粨濡備笅錛?/div>
鍥?-3 瀹㈡埛榪炴帴鍒板弽搴斿紡Web鏈嶅姟鍣?/div>
鍥?-4 瀹㈡埛鍙戦丠TTP璇鋒眰鍒板弽搴斿紡Web鏈嶅姟鍣?/div>
  1. Web鏈嶅姟鍣ㄥ皢Acceptor鐧昏鍒癐nitiation Dispatcher錛屼互鎺ュ彈鏂拌繛鎺ワ紱
  2. Web鏈嶅姟鍣ㄨ皟鐢↖nitiation Dispatcher鐨勪簨浠跺驚鐜紱
  3. 瀹㈡埛榪炴帴鍒癢eb鏈嶅姟鍣紱
  4. Initiation Dispatcher灝嗘柊榪炴帴璇鋒眰閫氱煡Acceptor錛屽悗鑰呮帴鍙楁柊榪炴帴錛?
  5. Acceptor鍒涘緩HTTP Handler錛屼互鏈嶅姟鏂板鎴鳳紱
  6. HTTP Handler灝嗚繛鎺ョ櫥璁板埌Initiation Dispatcher錛屼互璇誨彇瀹㈡埛璇鋒眰鏁版嵁錛堝氨鏄錛屽湪榪炴帴鍙樺緱鈥滆灝辯華鈥濇椂錛夛紱
  7. HTTP Handler鏈嶅姟鏉ヨ嚜鏂板鎴風殑璇鋒眰銆?
鍥?-4鏄劇ず鍙嶅簲寮廤eb鏈嶅姟鍣ㄤ負鏈嶅姟HTTP GET璇鋒眰鎵閲囧彇鐨勪竴緋誨垪姝ラ銆傝榪囩▼鎻忚堪濡備笅錛?/div>
  1. 瀹㈡埛鍙戦丠TTP GET璇鋒眰錛?
  2. 褰撳鎴瘋姹傛暟鎹埌杈炬湇鍔″櫒鏃訛紝Initiation Dispatcher閫氱煡HTTP Handler錛?
  3. 璇鋒眰浠ラ潪闃誨鏂瑰紡琚鍙栵紝浜庢槸濡傛灉鎿嶄綔浼氬鑷磋皟鐢ㄧ嚎紼嬮樆濉烇紝璇繪搷浣滃氨榪斿洖EWOULDBLOCK錛堟楠?鍜?灝嗛噸澶嶇洿鍒拌姹傝瀹屽叏璇誨彇錛夛紱
  4. HTTP Handler瑙f瀽HTTP璇鋒眰錛?
  5. 鎵璇鋒眰鐨勬枃浠朵粠鏂囦歡緋葷粺涓鍚屾璇誨彇錛?
  6. 涓哄彂閫佹枃浠舵暟鎹紙灝辨槸璇達紝褰撹繛鎺ュ彉寰椻滃啓灝辯華鈥濇椂錛夛紝HTTP Handler灝嗚繛鎺ョ櫥璁板埌Initiation Dispatcher錛?
  7. 褰揟CP榪炴帴鍙樺緱鍐欏氨緇椂錛孖nitiation Dispatcher閫氱煡HTTP Handler錛?
  8. HTTP Handler浠ラ潪闃誨鏂瑰紡灝嗘墍璇鋒眰鏂囦歡鍙戦佺粰瀹㈡埛錛屼簬鏄鏋滄搷浣滀細瀵艱嚧璋冪敤綰跨▼闃誨錛屽啓鎿嶄綔灝辮繑鍥濫WOULDBLOCK錛堟楠?鍜?灝嗛噸澶嶇洿鍒版暟鎹瀹屽叏閫掗侊級銆?
闄勫綍A.2涓湁涓涓皢鍙嶅簲寮忎簨浠跺垎媧炬ā鍨嬪簲鐢ㄤ簬Web鏈嶅姟鍣ㄧ殑C++浠g爜渚嬪瓙銆?/div>
鍥犱負Initiation Dispatcher榪愯鍦ㄥ崟綰跨▼涓紝緗戠粶I/O鎿嶄綔浠ラ潪闃誨鏂瑰紡榪愯鍦≧eactor鐨勬帶鍒朵箣涓嬨傚鏋滃綋鍓嶆搷浣滅殑榪涘害鍋滄浜嗭紝鎿嶄綔灝辮杞墜緇橧nitiation Dispatcher錛岀敱瀹冪洃鎺х郴緇熸搷浣滅殑鐘舵併傚綋鎿嶄綔鍙互鍐嶅害鍓嶈繘鏃訛紝閫傚綋鐨凟vent Handler浼氳閫氱煡銆?/div>
鍙嶅簲寮忔ā寮忕殑涓昏浼樼偣鏄彲縐繪鎬э紝綺楃矑搴﹀茍鍙戞帶鍒跺甫鏉ョ殑浣庡紑閿錛堝氨鏄錛屽崟綰跨▼涓嶉渶瑕佸悓姝ユ垨涓婁笅鏂囧垏鎹級錛屼互鍙婇氳繃浣垮簲鐢ㄩ昏緫涓庡垎媧炬満鍒跺幓鑰﹀悎鎵鑾峰緱鐨勬ā鍧楁с備絾鏄紝璇ユ柟娉曟湁浠ヤ笅緙虹偣錛?/div>
澶嶆潅鐨勭紪紼嬶細濡備粠鍓嶉潰鐨勫垪琛ㄦ墍鐪嬪埌鐨勶紝紼嬪簭鍛樺繀欏葷紪鍐欏鏉傜殑閫昏緫錛屼互淇濊瘉鏈嶅姟鍣ㄤ笉浼氬湪鏈嶅姟涓涓壒瀹氬鎴鋒椂闃誨銆?/div>
緙轟箯澶氱嚎紼嬬殑OS 鏀寔錛?/b>澶у鏁版搷浣滅郴緇熼氳繃select緋葷粺璋冪敤[7]鏉ュ疄鐜板弽搴斿紡鍒嗘淳妯″瀷銆備絾鏄紝select涓嶅厑璁稿浜庝竴涓殑綰跨▼鍦ㄥ悓涓涓弿榪扮闆嗕笂絳夊緟銆傝繖浣垮緱鍙嶅簲寮忔ā鍨嬩笉閫傜敤浜庨珮鎬ц兘搴旂敤錛屽洜涓哄畠娌℃湁鏈夋晥鍦板埄鐢ㄧ‖浠剁殑騫惰鎬с?/div>
鍙繍琛屼換鍔$殑璋冨害錛?/b>鍦ㄦ敮鎸佸崰鍏堝紡綰跨▼鐨勫悓姝ュ綰跨▼浣撶郴緇撴瀯涓紝灝嗗彲榪愯綰跨▼璋冨害騫舵椂鍒嗭紙time-slice錛夊埌鍙敤CPU涓婃槸鎿嶄綔緋葷粺鐨勮矗浠匯傝繖鏍風殑璋冨害鏀寔鍦ㄥ弽搴斿紡浣撶郴緇撴瀯涓笉鍙敤錛屽洜涓哄湪搴旂敤涓彧鏈変竴涓嚎紼嬨傚洜姝わ紝緋葷粺鐨勫紑鍙戣呭繀欏誨皬蹇冨湴鍦ㄦ墍鏈夎繛鎺ュ埌Web鏈嶅姟鍣ㄧ殑瀹㈡埛涔嬮棿灝嗙嚎紼嬪垎鏃躲傝繖鍙兘閫氳繃鎵ц鐭寔緇椂闂淬侀潪闃誨鐨勬搷浣滄潵瀹屾垚銆?/div>
浣滀負榪欎簺緙虹偣鐨勭粨鏋滐紝褰撶‖浠跺茍琛屽彲鐢ㄦ椂錛屽弽搴斿紡浜嬩歡鍒嗘淳涓嶆槸鏈涓洪珮鏁堢殑妯″瀷銆傜敱浜庨渶瑕侀伩鍏嶄嬌鐢ㄩ樆濉濱/O錛岃妯″紡榪樻湁鐫鐩稿杈冮珮鐨勭紪紼嬪鏉傚害銆?/div>
8.2.3 瑙e喅鏂規錛氶氳繃鍓嶆憚寮忔搷浣滃疄鐜扮殑騫跺彂
褰揙S騫沖彴鏀寔寮傛鎿嶄綔鏃訛紝涓縐嶉珮鏁堣屾柟渚跨殑瀹炵幇楂樻ц兘Web鏈嶅姟鍣ㄧ殑鏂規硶鏄嬌鐢?i>鍓嶆憚寮忎簨浠跺垎媧?/i>銆備嬌鐢ㄥ墠鎽勫紡浜嬩歡鍒嗘淳妯″瀷璁捐鐨刉eb鏈嶅姟鍣ㄩ氳繃涓鎴栧涓嚎紼嬫帶鍒舵潵澶勭悊寮傛鎿嶄綔鐨勫畬鎴愩傝繖鏍鳳紝閫氳繃闆嗘垚瀹屾垚浜嬩歡澶氳礬鍒嗙錛?/i>completion event demultiplexing錛夊拰浜嬩歡澶勭悊鍣ㄥ垎媧撅紝鍓嶆憚鍣ㄦā寮忕畝鍖栦簡寮傛鐨刉eb鏈嶅姟鍣?/i>銆?/div>
寮傛鐨刉eb鏈嶅姟鍣ㄥ皢榪欐牱鏉ュ埄鐢ㄥ墠鎽勫櫒妯″紡錛氶鍏堣Web鏈嶅姟鍣ㄥ悜OS鍙戝嚭寮傛鎿嶄綔錛屽茍灝嗗洖璋冩柟娉曠櫥璁板埌Completion Dispatcher錛堝畬鎴愬垎媧懼櫒錛夛紝鍚庤呭皢鍦ㄦ搷浣滃畬鎴愭椂閫氱煡Web鏈嶅姟鍣ㄣ備簬鏄疧S浠h〃Web鏈嶅姟鍣ㄦ墽琛屾搷浣滐紝騫墮殢鍗沖湪涓涓懆鐭ョ殑鍦版柟灝嗙粨鏋滄帓闃熴侰ompletion Dispatcher璐熻矗浣垮畬鎴愰氱煡鍑洪槦錛屽茍鎵ц閫傚綋鐨勩佸惈鏈夊簲鐢ㄧ壒鏈夌殑Web鏈嶅姟鍣ㄤ唬鐮佺殑鍥炶皟銆?/div>
鍥?-5 瀹㈡埛榪炴帴鍒板熀浜庡墠鎽勫櫒鐨刉eb鏈嶅姟鍣?/div>
鍥?-6 瀹㈡埛鍙戦佽姹傜粰鍩轟簬鍓嶆憚鍣ㄧ殑Web鏈嶅姟鍣?/div>
鍥?-5鍜屽浘8-6鏄劇ず浣跨敤鍓嶆憚寮忎簨浠跺垎媧捐璁$殑Web鏈嶅姟鍣ㄦ庢牱鍦ㄤ竴鎴栧涓嚎紼嬩腑騫跺彂鍦板鐞嗗涓鎴楓傚浘8-5鏄劇ず褰撳鎴瘋繛鎺ュ埌Web鏈嶅姟鍣ㄦ椂鎵閲囧彇鐨勪竴緋誨垪姝ラ銆?/div>
  1. Web鏈嶅姟鍣ㄦ寚紺篈cceptor鍙戣搗寮傛鎺ュ彈錛?
  2. 鎺ュ彈鍣ㄩ氳繃OS鍙戣搗寮傛鎺ュ彈錛屽皢鍏惰嚜韜綔涓篊ompletion Handler鍜孋ompletion Dispatcher鐨勫紩鐢ㄤ紶閫掞紱騫跺皢鐢ㄤ簬鍦ㄥ紓姝ユ帴鍙楀畬鎴愭椂閫氱煡Acceptor錛?
  3. Web鏈嶅姟鍣ㄨ皟鐢–ompletion Dispatcher鐨勪簨浠跺驚鐜紱
  4. 瀹㈡埛榪炴帴鍒癢eb鏈嶅姟鍣紱
  5. 褰撳紓姝ユ帴鍙楁搷浣滃畬鎴愭椂錛屾搷浣滅郴緇熼氱煡Completion Dispatcher錛?
  6. Completion Dispatcher閫氱煡鎺ュ彈鍣紱
  7. Acceptor鍒涘緩HTTP Handler錛?
  8. HTTP Handler鍙戣搗寮傛鎿嶄綔錛屼互璇誨彇鏉ヨ嚜瀹㈡埛鐨勮姹傛暟鎹紝騫跺皢鍏惰嚜韜綔涓篊ompletion Handler鍜孋ompletion Dispatcher鐨勫紩鐢ㄤ紶閫掞紱騫跺皢鐢ㄤ簬鍦ㄥ紓姝ヨ鍙栧畬鎴愭椂閫氱煡HTTP Handler銆?
鍥?-6 鏄劇ず鍓嶆憚寮廤eb鏈嶅姟鍣ㄤ負鏈嶅姟HTTP GET璇鋒眰鎵閲囧彇鐨勬楠ゃ傝繖浜涙楠よВ閲婂涓嬶細
  1. 瀹㈡埛鍙戦丠TTP GET璇鋒眰錛?
  2. 璇誨彇鎿嶄綔瀹屾垚錛屾搷浣滅郴緇熼氱煡Completion Dispatcher錛?
  3. Completion Dispatcher閫氱煡HTTP Handler錛堟楠?鍜?灝嗛噸澶嶇洿鍒版暣涓姹傝鎺ユ敹錛夛紱
  4. HTTP Handler瑙f瀽璇鋒眰錛?
  5. HTTP Handler鍚屾鍦拌鍙栨墍璇鋒眰鐨勬枃浠訛紱
  6. HTTP Handler鍙戣搗寮傛鎿嶄綔錛屼互鎶婃枃浠舵暟鎹啓鍒板鎴瘋繛鎺ワ紝騫跺皢鍏惰嚜韜綔涓篊ompletion Handler鍜孋ompletion Dispatcher鐨勫紩鐢ㄤ紶閫掞紱騫跺皢鐢ㄤ簬鍦ㄥ紓姝ュ啓鍏ュ畬鎴愭椂閫氱煡HTTP Handler銆?
  7. 褰撳啓鎿嶄綔瀹屾垚鏃訛紝鎿嶄綔緋葷粺閫氱煡Completion Dispatcher錛?
  8. 闅忓悗Completion Dispatcher閫氱煡Completion Handler錛堟楠?-8灝嗛噸澶嶇洿鍒版枃浠惰瀹屽叏閫掗侊級銆?
8.8涓湁涓涓皢鍓嶆憚寮忎簨浠跺垎媧炬ā鍨嬪簲鐢ㄤ簬Web鏈嶅姟鍣ㄧ殑C++浠g爜渚嬪瓙銆?/div>
浣跨敤鍓嶆憚鍣ㄦā寮忕殑涓昏浼樼偣鏄彲浠ュ惎鍔ㄥ涓茍鍙戞搷浣滐紝騫跺彲騫惰榪愯錛岃屼笉瑕佹眰搴旂敤蹇呴』鎷ユ湁澶氫釜綰跨▼銆傛搷浣滆搴旂敤寮傛鍦板惎鍔紝瀹冧滑鍦∣S鐨処/O瀛愮郴緇熶腑榪愯鐩村埌瀹屾垚銆傚彂璧鋒搷浣滅殑綰跨▼鐜板湪鍙互鏈嶅姟鍙﹀鐨勮姹備簡銆?/div>
渚嬪錛屽湪涓婇潰鐨勪緥瀛愪腑錛孋ompletion Dispatcher鍙互鏄崟綰跨▼鐨勩傚綋HTTP璇鋒眰鍒拌揪鏃訛紝鍗曚釜Completion Dispatcher綰跨▼瑙f瀽璇鋒眰錛岃鍙栨枃浠訛紝騫跺彂閫佸搷搴旂粰瀹㈡埛銆傚洜涓哄搷搴旀槸琚紓姝ュ彂閫佺殑錛屽涓搷搴斿氨鏈夊彲鑳藉悓鏃惰鍙戦併傝屼笖錛屽悓姝ョ殑鏂囦歡璇誨彇鍙互琚紓姝ョ殑鏂囦歡璇誨彇鍙栦唬錛屼互榪涗竴姝ュ鍔犲茍鍙戠殑娼滃姏銆傚鏋滄枃浠惰鍙栨槸琚紓姝ュ畬鎴愮殑錛孒TTP Handler鎵鎵ц鐨勫敮涓鐨勫悓姝ユ搷浣滃氨鍙墿涓嬩簡HTTP鍗忚璇鋒眰瑙f瀽銆?/div>
鍓嶆憚寮忔ā鍨嬬殑涓昏緙虹偣鏄紪紼嬮昏緫鑷沖皯鍜屽弽搴斿紡妯″瀷涓鏍峰鏉傘傝屼笖錛屽墠鎽勫櫒妯″紡鍙兘浼氶毦浠ヨ皟璇曪紝鍥犱負寮傛鎿嶄綔甯稿父鏈夌潃涓嶅彲棰勬祴鍜屼笉鍙噸澶嶇殑鎵ц搴忓垪錛岃繖灝變嬌鍒嗘瀽鍜岃皟璇曞鏉傚寲浜嗐?.7鎻忚堪鎬庢牱搴旂敤鍏朵粬妯″紡錛堟瘮濡傚紓姝ュ畬鎴愪護鐗孾8]錛夋潵綆鍖栧紓姝ュ簲鐢ㄧ紪紼嬫ā鍨嬨?/div>
8.3 閫傜敤鎬?/b>
褰撳叿鏈変互涓嬩竴欏規垨澶氶」鏉′歡鏃朵嬌鐢ㄥ墠鎽勫櫒妯″紡錛?/div>
  • 搴旂敤闇瑕佹墽琛屼竴涓垨澶氫釜涓嶉樆濉炶皟鐢ㄧ嚎紼嬬殑寮傛鎿嶄綔錛?
  • 褰撳紓姝ユ搷浣滃畬鎴愭椂搴旂敤蹇呴』琚氱煡錛?
  • 搴旂敤闇瑕佺嫭绔嬩簬瀹冪殑I/O妯″瀷鏀瑰彉瀹冪殑騫跺彂絳栫暐錛?
  • 閫氳繃浣夸緷璧栦簬搴旂敤鐨勯昏緫涓庡簲鐢ㄦ棤鍏崇殑搴曞眰鏋勯犲幓鑰﹀悎錛屽簲鐢ㄥ皢浠庝腑鑾風泭錛?
  • 褰撲嬌鐢ㄥ綰跨▼鏂規硶鎴栧弽搴斿紡鍒嗘淳鏂規硶鏃訛紝搴旂敤鐨勬墽琛屽皢寰堜綆鏁堬紝鎴栨槸涓嶈兘婊¤凍鎬ц兘闇姹傘?
8.4 緇撴瀯鍜屽弬涓庤?/b>
鍦ㄥ浘8-7涓嬌鐢∣MT琛ㄧず娉曟紨紺轟簡鍓嶆憚鍣ㄦā寮忕殑緇撴瀯銆?/div>
鍓嶆憚鍣ㄦā寮忎腑鐨勫叧閿弬涓庤呭寘鎷細
鍓嶆憚鍙戣搗鍣?/b>錛圥roactive Initiator銆俉eb鏈嶅姟鍣ㄥ簲鐢ㄧ殑涓葷嚎紼嬶級錛?/div>
  • Proactive Initiator鏄簲鐢ㄤ腑浠諱綍鍙戣搗Asynchronous Operation錛堝紓姝ユ搷浣滐級鐨勫疄浣撱傚畠灝咰ompletion Handler鍜孋ompletion Dispatcher鐧昏鍒癆synchronous Operation Processor錛堝紓姝ユ搷浣滃鐞嗗櫒錛夛紝姝ゅ鐞嗗櫒鍦ㄦ搷浣滃畬鎴愭椂閫氱煡鍓嶆憚鍙戣搗鍣ㄣ?
瀹屾垚澶勭悊鍣?/b>錛圕ompletion Handler銆侫cceptor鍜孒TTP Handler錛夛細
  • 鍓嶆憚鍣ㄦā寮忓皢搴旂敤鎵瀹炵幇鐨凜ompletion Handler鎺ュ彛鐢ㄤ簬Asynchronous Operation瀹屾垚閫氱煡銆?
寮傛鎿嶄綔錛圓synchronous Operation銆侫sync_Read銆丄sync_Write鍜孉sync_Accept鏂規硶錛夛細
  • Asynchronous Operation琚敤浜庝唬琛ㄥ簲鐢ㄦ墽琛岃姹傦紙姣斿I/O鍜屽畾鏃跺櫒鎿嶄綔錛夈傚綋搴旂敤璋冪敤Asynchronous Operation鏃訛紝鎿嶄綔鐨勬墽琛?i>娌℃湁鍊熺敤搴旂敤鐨勭嚎紼嬫帶鍒躲傚洜姝わ紝浠庡簲鐢ㄧ殑瑙掑害鏉ョ湅錛屾搷浣滄槸琚?i>寮傛鍦?/i>鎵ц鐨勩傚綋Asynchronous Operation瀹屾垚鏃訛紝Asynchronous Operation Processor灝嗗簲鐢ㄩ氱煡濮旀墭緇機ompletion Dispatcher銆?
寮傛鎿嶄綔澶勭悊鍣?/b>錛圓synchronous Operation Processor銆傛搷浣滅郴緇燂級錛?/div>
  • Asynchronous Operation鏄敱Asynchronous Operation Processor鏉ヨ繍琛岀洿鑷沖畬鎴愮殑銆傝緇勪歡閫氬父鐢監S瀹炵幇銆?
瀹屾垚鍒嗘淳鍣?/b>錛圕ompletion Dispatcher銆侼otification Queue錛夛細
  • Completion Dispatcher璐熻矗鍦ˋsynchronous Operation瀹屾垚鏃跺洖璋冨簲鐢ㄧ殑Completion Handler銆傚綋Asynchronous Operation Processor瀹屾垚寮傛鍙戣搗鐨勬搷浣滄椂錛孋ompletion Dispatcher浠h〃搴旂敤鎵ц搴旂敤鍥炶皟銆?
鍥?-7 鍓嶆憚鍣ㄦā寮忎腑鐨勫弬涓庤?/div>
8.5 鍗忎綔
鏈夎嫢騫茶壇濂藉畾涔夌殑姝ラ琚敤浜庢墍鏈堿synchronous Operation銆傚湪楂樻按騫崇殑鎶借薄涓婏紝搴旂敤寮傛鍦板彂璧鋒搷浣滐紝騫跺湪鎿嶄綔瀹屾垚鏃惰閫氱煡銆傚浘8-8鏄劇ず鍦ㄦā寮忓弬涓庤呬箣闂村繀瀹氬彂鐢熺殑涓嬪垪浜や簰錛?/div>
  1. 鍓嶆憚鍙戣搗鍣ㄥ彂璧鋒搷浣滐細涓烘墽琛屽紓姝ユ搷浣滐紝搴旂敤鍦ˋsynchronous Operation Processor涓婂彂璧鋒搷浣溿備緥濡傦紝Web鏈嶅姟鍣ㄥ彲鑳借姹侽S鍦ㄧ綉緇滀笂浣跨敤鐗瑰畾鐨剆ocket榪炴帴浼犺緭鏂囦歡銆傝璇鋒眰榪欐牱鐨勬搷浣滐紝Web鏈嶅姟鍣ㄥ繀欏繪寚瀹氳浣跨敤鍝竴涓枃浠跺拰緗戠粶榪炴帴銆傝屼笖錛學eb鏈嶅姟鍣ㄥ繀欏繪寚瀹氾紙1錛夊綋鎿嶄綔瀹屾垚鏃墮氱煡鍝竴涓狢ompletion Handler錛屼互鍙婏紙2錛変竴鏃︽枃浠惰浼犺緭錛屽摢涓涓狢ompletion Dispatcher搴旇鎵ц鍥炶皟銆?
  2. 寮傛鎿嶄綔澶勭悊鍣ㄦ墽琛屾搷浣滐細褰撳簲鐢ㄥ湪Asynchronous Operation Processor涓婅皟鐢ㄦ搷浣滄椂錛屽畠鐩稿浜庡叾浠栧簲鐢ㄦ搷浣滃紓姝ュ湴榪愯榪欎簺鎿嶄綔銆傜幇浠f搷浣滅郴緇燂紙姣斿Solaris鍜學indows NT錛夊湪鍐呮牳涓彁渚涘紓姝ョ殑I/O瀛愮郴緇熴?
  3. 寮傛鎿嶄綔澶勭悊鍣ㄩ氱煡瀹屾垚鍒嗘淳鍣細褰撴搷浣滃畬鎴愭椂錛孉synchronous Operation Processor鍙栧緱鍦ㄦ搷浣滆鍙戣搗鏃舵寚瀹氱殑Completion Handler鍜孋ompletion Dispatcher銆傞殢鍚嶢synchronous Operation Processor灝咥synchronous Operation鐨勭粨鏋滃拰Completion Handler浼犻掔粰Completion Dispatcher錛屼互鐢ㄤ簬鍥炶皟銆備緥濡傦紝濡傛灉鏂囦歡宸茶寮傛浼犺緭錛孉synchronous Operation Processor鍙互鎶ュ憡瀹屾垚鐘舵侊紙姣斿鎴愬姛鎴栧け璐ワ級錛屼互鍙婂啓鍏ョ綉緇滆繛鎺ョ殑瀛楄妭鏁般?
  4. 瀹屾垚鍒嗘淳鍣ㄩ氱煡搴旂敤錛?/b>Completion Dispatcher鍦–ompletion Handler涓婅皟鐢ㄥ畬鎴愭寕閽╋紝灝嗙敱搴旂敤鎸囧畾鐨勪換浣曞畬鎴愭暟鎹紶閫掔粰瀹冦備緥濡傦紝濡傛灉寮傛璇誨彇瀹屾垚錛岄氬父涓涓寚鍚戞柊鍒拌揪鏁版嵁鐨勬寚閽堝皢浼氳浼犻掔粰Completion Handler銆?
鍥?-8 鍓嶆憚鍣ㄦā寮忕殑浜や簰鍥?/div>
8.6 鏁堟灉
榪欎竴閮ㄥ垎璇﹁堪浣跨敤鍓嶆憚鍣ㄦā寮忕殑鏁堟灉銆?/div>
8.6.1 濂藉
鍓嶆憚鍣ㄦā寮忔彁渚涗互涓嬪ソ澶勶細
澧炲己浜嬪姟鍒嗙錛?/b>鍓嶆憚鍣ㄦā寮忎嬌搴旂敤鏃犲叧鐨勫紓姝ユ満鍒朵笌搴旂敤鐗規湁鐨勫姛鑳藉幓鑰﹀悎銆傚簲鐢ㄦ棤鍏崇殑鏈哄埗鎴愪負鍙鐢ㄧ粍浠訛紝鐭ラ亾鎬庢牱澶氳礬鍒嗙涓嶢synchronous Operation鐩稿叧鑱旂殑瀹屾垚浜嬩歡錛屽茍鍒嗘淳閫傚綋鐨勭敱Completion Handler瀹氫箟鐨勫洖璋冩柟娉曘傚悓鏍峰湴錛屽簲鐢ㄧ壒鏈夌殑鍔熻兘鐭ラ亾鎬庢牱鎵ц鐗瑰畾綾誨瀷鐨勬湇鍔★紙姣斿HTTP澶勭悊錛夈?/div>
鏀瑰杽搴旂敤閫昏緫鍙Щ妞嶆э細閫氳繃鍏佽鎺ュ彛鐙珛浜庢墽琛屼簨浠跺璺垎紱葷殑搴曞眰OS璋冪敤鑰屽鐢紝瀹冩敼鍠勪簡搴旂敤鐨勫彲縐繪鎬с傝繖浜涚郴緇熻皟鐢ㄦ嫻嬪茍鎶ュ憡鍙兘鍚屾椂鍙戠敓鍦ㄥ涓簨浠舵簮涔嬩笂鐨勪簨浠躲備簨浠舵簮鍙互鏄疘/O绔彛銆佸畾鏃跺櫒銆佸悓姝ュ璞°佷俊鍙鳳紝絳夌瓑銆傚湪瀹炴椂POSIX騫沖彴涓婏紝寮傛I/O鍑芥暟鐢盿io API鏃廩9]鎻愪緵銆傚湪Windows NT涓紝I/O瀹屾垚绔彛鍜岄噸鍙犲紡錛坥verlapped錛塈/O琚敤浜庡疄鐜板紓姝/O[10]銆?/div>
瀹屾垚鍒嗘淳鍣ㄥ皝瑁呬簡騫跺彂鏈哄埗錛?/b>浣緾ompletion Dispatcher涓嶢synchronous Operation Processor鍘昏﹀悎鐨勪竴涓ソ澶勬槸搴旂敤鍙互閫氳繃澶氱騫跺彂絳栫暐鏉ラ厤緗瓹ompletion Dispatcher錛岃屼笉浼氬獎鍝嶅叾浠栧弬涓庤呫傚8.7鎵璁ㄨ鐨勶紝Completion Dispatcher鍙閰嶇疆浣跨敤鍖呮嫭鍗曠嚎紼嬪拰綰跨▼姹犳柟妗堝湪鍐呯殑鑻ュ共騫跺彂絳栫暐銆?/div>
綰跨▼絳栫暐琚笌騫跺彂絳栫暐鍘昏﹀悎錛?/b>鍥犱負Asynchronous Operation Processor浠h〃Proactive Initiator瀹屾垚鍙兘闀挎椂闂磋繍琛岀殑鎿嶄綔錛屽簲鐢ㄤ笉浼氳榪淳鐢熺嚎紼嬫潵澧炲姞騫跺彂銆傝繖浣垮緱搴旂敤鍙互鐙珛浜庡畠鐨勭嚎紼嬬瓥鐣ユ敼鍙樺畠鐨勫茍鍙戠瓥鐣ャ備緥濡傦紝Web鏈嶅姟鍣ㄥ彲鑳藉彧鎯蟲瘡涓狢PU鏈変竴涓嚎紼嬶紝浣嗗張鎯沖悓鏃舵湇鍔℃洿澶氭暟鐩殑瀹㈡埛銆?/div>
鎻愰珮鎬ц兘錛?/b>澶氱嚎紼嬫搷浣滅郴緇熸墽琛屼笂涓嬫枃鍒囨崲錛屼互鍦ㄥ涓嚎紼嬫帶鍒朵腑杞崲銆傝櫧鐒舵墽琛屼竴嬈′笂涓嬫枃鍒囨崲鐨勬椂闂翠繚鎸佺浉褰撶殑鎭掑畾錛屽鏋淥S涓婁笅鏂囪鍒囨崲鍒扮┖闂茬嚎紼嬬殑璇濓紝鍦ㄥぇ閲忕嚎紼嬮棿杞崲鐨勬繪椂闂村彲浠ユ樉钁楀湴闄嶄綆搴旂敤鎬ц兘銆備緥濡傦紝綰跨▼鍙互杞OS浠ユ煡鐪嬪畬鎴愮姸鎬侊紝鑰岃繖鏄綆鏁堢巼鐨勩傞氳繃鍙縺媧婚偅浜涙湁浜嬩歡瑕佸鐞嗙殑鍚堢悊鐨勭嚎紼嬫帶鍒訛紝鍓嶆憚鍣ㄦā寮忚兘澶熼伩鍏嶄笂涓嬫枃鍒囨崲鐨勪唬浠楓備緥濡傦紝濡傛灉娌℃湁寰呭鐞嗙殑GET璇鋒眰錛學eb鏈嶅姟鍣ㄤ笉闇瑕佸惎鐢℉TTP Handler銆?/div>
搴旂敤鍚屾鐨勭畝鍖栵細鍙Completion Handler涓嶆淳鐢熷彟澶栫殑綰跨▼鎺у埗錛屽彲浠ヤ笉鑰冭檻銆佹垨鍙冭檻灝戣鍚屾闂鑰岀紪鍐欏簲鐢ㄩ昏緫銆侰ompletion Handler鍙緙栧啓涓哄氨濂藉儚瀹冧滑瀛樺湪浜庝竴涓紶緇熺殑鍗曠嚎紼嬬幆澧冧腑涓鏍楓備緥濡傦紝Web鏈嶅姟鍣ㄧ殑HTTP GET澶勭悊鍣ㄥ彲浠ラ氳繃Async Read鎿嶄綔錛堟瘮濡俉indows NT TransmitFile鍑芥暟[1]錛夋潵璁塊棶紓佺洏銆?/div>
8.6.2 緙虹偣
鍓嶆憚鍣ㄦā寮忔湁浠ヤ笅緙虹偣錛?/div>
闅句互璋冭瘯錛?/b>浠ュ墠鎽勫櫒妯″紡緙栧啓鐨勫簲鐢ㄥ彲鑳介毦浠ヨ皟璇曪紝鍥犱負鍙嶅悜鐨勬帶鍒舵祦鍦ㄦ瀯鏋跺熀紜緇撴瀯鍜屽簲鐢ㄧ壒鏈夌殑澶勭悊鍣ㄤ笂鐨勫洖璋冩柟娉曚箣闂存潵鍥炴尟鑽°傝繖澧炲姞浜嗗湪璋冭瘯鍣ㄤ腑瀵規瀯鏋剁殑榪愯鏃惰涓虹殑鈥滃崟姝ヨ窡韙濈殑鍥伴毦搴︼紝鍥犱負搴旂敤寮鍙戣呭彲鑳戒笉浜嗚В鎴栦笉鑳借幏寰楁瀯鏋剁殑浠g爜銆傝繖涓庤瘯鍥捐皟璇曚嬌鐢↙EX鍜孻ACC緙栧啓鐨勭紪璇戝櫒鐨勮瘝娉曞垎鏋愬櫒鍜岃В鏋愬櫒鏃舵墍閬囧埌鐨勯棶棰樻槸綾諱技鐨勩傚湪榪欎簺搴旂敤涓紝褰撶嚎紼嬫帶鍒舵槸鍦ㄧ敤鎴峰畾涔夌殑鍔ㄤ綔渚嬬▼涓椂錛岃皟璇曟槸鐩稿綋鐩存帴鐨勩備絾鏄竴鏃︾嚎紼嬫帶鍒惰繑鍥炲埌鎵鐢熸垚鐨勬湁闄愮‘瀹氳嚜鍔ㄦ満錛圖eterministic Finite Automate錛孌FA錛夐鏋舵椂錛屽氨寰堥毦璺熶綇紼嬪簭閫昏緫浜嗐?/div>
璋冨害鍜屾帶鍒舵湭瀹屾垚鎿嶄綔錛?/b>Proactive Initiator鍙兘娌℃湁瀵笰synchronous Operation鐨勬墽琛岄『搴忕殑鎺у埗銆傚洜姝わ紝Asynchronous Operation Processor蹇呴』琚皬蹇冭璁★紝浠ユ敮鎸丄synchronous Operation鐨勪紭鍏堢駭鍜屽彇娑堝鐞嗐?/div>
8.7 瀹炵幇
鍓嶆憚鍣ㄦā寮忓彲浠ラ氳繃璁稿鏂瑰紡瀹炵幇銆傝繖涓閮ㄥ垎璁ㄨ瀹炵幇鍓嶆憚鍣ㄦā寮忔墍娑夊強鐨勬楠ゃ?/div>
8.7.1 瀹炵幇寮傛鎿嶄綔澶勭悊鍣?/b>
瀹炵幇鍓嶆憚鍣ㄦā寮忕殑絎竴姝ユ槸鏋勫緩Asynchronous Operation Processor銆傝緇勪歡璐熻矗浠h〃搴旂敤寮傛鍦版墽琛屾搷浣溿傚洜姝わ紝瀹冪殑涓ら」涓昏璐d換鏄緭鍑篈synchronous Operation API鍜屽疄鐜癆synchronous Operation Engine浠ュ畬鎴愬伐浣溿?/div>
8.7.1.1 瀹氫箟寮傛鎿嶄綔 API
Asynchronous Operation Processor蹇呴』鎻愪緵API銆佸厑璁稿簲鐢ㄨ姹侫synchronous Operation銆傚湪璁捐榪欎簺API鏃舵湁鑻ュ共鍘嬪姏闇瑕佽冭檻錛?/div>
鍙Щ妞嶆э細姝PI涓嶅簲綰︽潫搴旂敤鎴栧畠鐨凱roactive Initiator浣跨敤鐗瑰畾鐨勫鉤鍙般?/div>
鐏墊椿鎬э細甯稿父錛屽紓姝PI鍙互涓鴻澶氱被鍨嬬殑鎿嶄綔鍏變韓銆備緥濡傦紝寮傛I/O鎿嶄綔甯稿父琚敤浜庡湪澶氱浠嬭川錛堟瘮濡傜綉緇滃拰鏂囦歡錛変笂鎵цI/O銆傝璁℃敮鎸佽繖鏍風殑澶嶇敤鐨凙PI鍙兘鏄湁鐩婄殑銆?/div>
鍥炶皟錛?/b>褰撴搷浣滆璋冪敤鏃訛紝Proactive Initiator蹇呴』鐧昏鍥炶皟銆傚疄鐜板洖璋冪殑涓縐嶅父鐢ㄦ柟娉曟槸璁╄皟鐢ㄥ璞★紙瀹㈡埛錛夎緭鍑烘帴鍙c佽璋冪敤鑰呯煡閬擄紙鏈嶅姟鍣級銆傚洜姝わ紝Proactive Initiator蹇呴』閫氱煡Asynchronous Operation Processor錛屽綋鎿嶄綔瀹屾垚鏃訛紝鍝竴涓狢ompletion Handler搴旇鍥炶皟銆?/div>
瀹屾垚鍒嗘淳鍣細鍥犱負搴旂敤鍙互浣跨敤澶氫釜Completion Dispatcher錛孭roactive Initiator榪樺繀欏繪寚紺虹敱鍝竴涓狢ompletion Dispatcher鏉ユ墽琛屽洖璋冦?/div>
緇欏畾鎵鏈夎繖浜涢棶棰橈紝鑰冭檻涓嬮潰鐨勭敤浜庡紓姝ヨ鍐欑殑API銆侫synch_Stream綾繪槸鐢ㄤ簬鍙戣搗寮傛璇誨啓鐨勫伐鍘傘備竴鏃︽瀯閫狅紝鍙互浣跨敤姝ょ被鏉ュ惎鍔ㄥ涓紓姝ヨ鍐欍傚綋寮傛璇誨彇瀹屾垚鏃訛紝Asynch_Stream::Read_Result灝嗛氳繃Completion_Handler涓婄殑handler_read鍥炶皟鏂規硶琚洖浼犵粰handler銆傜被浼煎湴錛屽綋寮傛鍐欏叆瀹屾垚鏃訛紝Asynch_Stream::Write_Result灝嗛氳繃Completion_Handler涓婄殑handler_write鍥炶皟鏂規硶琚洖浼犵粰handler銆?/div>
class Asynch_Stream
// = TITLE
// A Factory for initiating reads
// and writes asynchronously.
{
// Initializes the factory with information
// which will be used with each asynchronous
// call. <handler> is notified when the
// operation completes. The asynchronous
// operations are performed on the <handle>
// and the results of the operations are
// sent to the <Completion_Dispatcher>.
Asynch_Stream (Completion_Handler &handler,
HANDLE handle,
Completion_Dispatcher *);
// This starts off an asynchronous read.
// Upto <bytes_to_read> will be read and
// stored in the <message_block>.
int read (Message_Block &message_block,
u_long bytes_to_read,
const void *act = 0);
// This starts off an asynchronous write.
// Upto <bytes_to_write> will be written
// from the <message_block>.
int write (Message_Block &message_block,
u_long bytes_to_write,
const void *act = 0);
...
};
8.7.1.2 瀹炵幇寮傛鎿嶄綔寮曟搸
Asynchronous Operation Processor蹇呴』鍚湁寮傛鎵ц鎿嶄綔鐨勬満鍒躲傛崲鍙ヨ瘽璇達紝褰撳簲鐢ㄧ嚎紼嬭皟鐢ˋsynchronous Operation鏃訛紝蹇呴』涓嶅熺敤搴旂敤鐨勭嚎紼嬫帶鍒惰屾墽琛屾鎿嶄綔銆傚垢濂斤紝鐜頒唬鎿嶄綔緋葷粺鎻愪緵浜嗙敤浜嶢synchronous Operation鐨勬満鍒訛紙渚嬪錛孭OSIX 寮傛I/O鍜學inNT閲嶅彔寮廔/O錛夈傚湪榪欐牱鐨勬儏鍐典笅錛屽疄鐜版ā寮忕殑榪欎竴閮ㄥ垎鍙渶瑕佺畝鍗曞湴灝嗗鉤鍙癆PI鏄犲皠鍒頒笂闈㈡弿榪扮殑Asynchronous Operation API銆?/div>
濡傛灉OS騫沖彴涓嶆彁渚涘Asynchronous Operation鐨勬敮鎸侊紝鏈夎嫢騫插疄鐜版妧鏈彲鐢ㄤ簬鏋勫緩Asynchronous Operation Engine銆傛垨璁告渶涓虹洿瑙傜殑瑙e喅鏂規鏄嬌鐢ㄤ笓鐢ㄧ嚎紼嬫潵涓哄簲鐢ㄦ墽琛孉synchronous Operation銆傝瀹炵幇綰跨▼鍖栫殑Asynchronous Operation Engine錛屾湁涓変釜涓昏姝ラ錛?/div>
  1. 鎿嶄綔璋冪敤錛?/b>鍥犱負鎿嶄綔灝嗗湪涓庤繘琛岃皟鐢ㄧ殑搴旂敤綰跨▼涓嶅悓鐨勭嚎紼嬫帶鍒朵腑鎵ц錛屽繀瀹氫細鍙戠敓鏌愮綾誨瀷鐨勭嚎紼嬪悓姝ャ備竴縐嶆柟娉曟槸涓烘瘡涓搷浣滄淳鐢熶竴涓嚎紼嬨傛洿涓哄父鐢ㄧ殑鏂規硶鏄負Asynchronous Operation Processor鑰岀鐞嗕竴涓笓鐢ㄧ嚎紼嬫睜銆傝鏂規硶鍙兘闇瑕佸簲鐢ㄧ嚎紼嬪湪緇х畫榪涜鍏朵粬搴旂敤璁$畻涔嬪墠灝嗘搷浣滆姹傛帓闃熴?
  2. 鎿嶄綔鎵ц錛?/b>鏃㈢劧鎿嶄綔灝嗗湪涓撶敤綰跨▼涓墽琛岋紝鎵浠ュ畠鍙互鎵ц鈥滈樆濉炩濇搷浣滐紝鑰屼笉浼氱洿鎺ラ樆紕嶅簲鐢ㄧ殑榪涘睍銆備緥濡傦紝鍦ㄦ彁渚涘紓姝/O璇誨彇鏈哄埗鏃訛紝涓撶敤綰跨▼鍙互鍦ㄤ粠socket鎴栨枃浠跺彞鏌勪腑璇繪椂闃誨銆?
  3. 鎿嶄綔瀹屾垚錛?/b>褰撴搷浣滃畬鎴愭椂錛屽簲鐢ㄥ繀欏昏閫氱煡鍒般傜壒鍒槸錛屼笓鐢ㄧ嚎紼嬪繀欏誨皢搴旂敤鐗規湁鐨勯氱煡濮旀墭緇機ompletion Dispatcher銆傝繖瑕佹眰鍦ㄧ嚎紼嬮棿榪涜鍙﹀鐨勫悓姝ャ?
8.7.2 瀹炵幇瀹屾垚鍒嗘淳鍣?/b>
褰揅ompletion Dispatcher浠嶢synchronous Operation Processor鎺ユ敹鍒版搷浣滃畬鎴愰氱煡鏃訛紝瀹冧細鍥炶皟涓庡簲鐢ㄥ璞$浉鍏寵仈鐨凜ompletion Handler銆傚疄鐜癈ompletion Dispatcher娑夊強涓や釜闂錛氾紙1錛夊疄鐜板洖璋冧互鍙婏紙2錛夊畾涔夌敤浜庢墽琛屽洖璋冪殑騫跺彂絳栫暐銆?/div>
8.7.2.1 瀹炵幇鍥炶皟
Completion Dispatcher蹇呴』瀹炵幇涓縐嶆満鍒訛紝Completion Handler閫氳繃瀹冭璋冪敤銆傝繖瑕佹眰Proactive Initiator鍦ㄥ彂璧鋒搷浣滄椂鎸囧畾涓涓洖璋冦備笅闈㈡槸甯哥敤鐨勫洖璋冨彲閫夋柟妗堬細
鍥炶皟綾伙細Completion Handler杈撳嚭鎺ュ彛銆佽Completion Dispatcher鐭ラ亾銆傚綋鎿嶄綔瀹屾垚鏃訛紝Completion Dispatcher鍥炶皟姝ゆ帴鍙d腑鐨勬柟娉曪紝騫跺皢宸插畬鎴愭搷浣滅殑鏈夊叧淇℃伅浼犻掔粰瀹冿紙姣斿浠庣綉緇滆繛鎺ヤ腑璇誨彇鐨勫瓧鑺傛暟錛夈?/div>
鍑芥暟鎸囬拡錛?/b>Completion Dispatcher閫氳繃鍥炶皟鍑芥暟鎸囬拡鏉ヨ皟鐢–ompletion Handler銆傝鏂規硶鏈夋晥鍦版墦鐮翠簡Completion Dispatcher鍜孋ompletion Handler涔嬮棿鐨勭煡璇嗕緷璧栥傝繖鏈変袱涓ソ澶勶細
  1. Completion Handler涓嶄細琚揩杈撳嚭鐗瑰畾鐨勬帴鍙o紱浠ュ強
  2. 鍦–ompletion Dispatcher鍜孋ompletion Handler涔嬮棿涓嶉渶瑕佹湁緙栬瘧鏃朵緷璧栥?
浼氬悎鐐癸細Proactive Initiator鍙互璁劇珛浜嬩歡瀵硅薄鎴栨潯浠跺彉閲忥紝鐢ㄤ綔Completion Dispatcher鍜孋ompletion Handler涔嬮棿鐨勪細鍚堢偣銆傝繖鍦–ompletion Handler鏄疨roactive Initiator鏃舵渶涓哄父瑙併傚湪Asynchronous Operation榪愯鑷沖畬鎴愮殑鍚屾椂錛孋ompletion Handler澶勭悊鍏朵粬鐨勬椿鍔ㄣ侰ompletion Handler灝嗗湪浼氬悎鐐瑰懆鏈熸у湴媯鏌ュ畬鎴愮姸鎬併?/div>
8.7.2.2 瀹氫箟瀹屾垚鍒嗘淳鍣ㄥ茍鍙戠瓥鐣?/b>
褰撴搷浣滃畬鎴愭椂錛孉synchronous Operation Processor灝嗕細閫氱煡Completion Dispatcher銆傚湪榪欐椂錛孋ompletion Dispatcher鍙互鍒╃敤涓嬮潰鐨勫茍鍙戠瓥鐣ヤ腑鐨勪竴縐嶆潵鎵ц搴旂敤鍥炶皟錛?/div>
鍔ㄦ佺嚎紼嬪垎媧撅細Completion Dispatcher鍙負姣忎釜Completion Handler鍔ㄦ佸垎閰嶄竴涓嚎紼嬨傚姩鎬佺嚎紼嬪垎媧懼彲閫氳繃澶у鏁板綰跨▼鎿嶄綔緋葷粺鏉ュ疄鐜般傚湪鏈変簺騫沖彴涓婏紝鐢變簬鍒涘緩鍜岄攢姣佺嚎紼嬭祫婧愮殑寮閿錛岃繖鍙兘鏄墍鍒楀嚭鐨凜ompletion Dispatcher瀹炵幇鎶鏈腑鏈涓轟綆鏁堢殑涓縐嶏紝
鍚庡弽搴斿紡鍒嗘淳錛圥ost-reactive dispatching 錛夛細Completion Dispatcher鍙互鍙戜俊鍙風粰Proactive Initiation鎵璁劇珛鐨勪簨浠跺璞℃垨鏉′歡鍙橀噺銆傚敖綆¤疆璇㈠拰媧劇敓闃誨鍦ㄤ簨浠跺璞′笂鐨勫瓙綰跨▼閮芥槸鍙夌殑鏂規錛屾渶涓洪珮鏁堢殑鍚庡弽搴斿紡鍒嗘淳鏂規硶鏄皢浜嬩歡鐧昏鍒癛eactor銆傚悗鍙嶅簲寮忓垎媧懼彲浠ラ氳繃POSIX瀹炴椂鐜涓殑aio_suspend鍜學in32鐜涓殑WaitForMultipleObjects鏉ュ疄鐜般?/div>
Call-through 鍒嗘淳錛?/b>鏉ヨ嚜Asynchronous Operation Processor鐨勭嚎紼嬫帶鍒跺彲琚獵ompletion Dispatcher鍊熺敤錛屼互鎵цCompletion Handler銆傝繖縐嶁滃懆鏈熷伔鍙栤濈瓥鐣ュ彲浠ラ氳繃鍑忓皯絀洪棽綰跨▼鐨勫獎鍝嶈寖鍥存潵鎻愰珮鎬ц兘銆傚湪涓浜涜佹搷浣滅郴緇熶細灝嗕笂涓嬫枃鍒囨崲鍒扮┖闂茬嚎紼嬨佸張鍙槸浠庡畠浠垏鎹㈠嚭鍘葷殑鎯呭喌涓嬶紝榪欑鏂規硶鏈夌潃鏀跺洖鈥滃け鍘葷殑鈥濇椂闂寸殑宸ㄥぇ娼滃姏銆?/div>
Call-through鍒嗘淳鍦╓indows NT涓彲浠ヤ嬌鐢≧eadFileEx鍜學riteFileEx Win32鍑芥暟鏉ュ疄鐜般備緥濡傦紝綰跨▼鎺у埗鍙互浣跨敤榪欎簺璋冪敤鏉ョ瓑寰呬俊鍙烽噺琚疆浣嶃傚綋瀹冪瓑寰呮椂錛岀嚎紼嬮氱煡OS瀹冭繘鍏ヤ簡涓縐嶇О涓衡滃彲鎶ヨ絳夊緟鐘舵佲濓紙alterable wait state錛夌殑鐗規畩鐘舵併傚湪榪欐椂錛孫S鍙互鍗犳湁瀵圭瓑寰呬腑鐨勭嚎紼嬫帶鍒剁殑鏍堝拰鐩稿叧璧勬簮鐨勬帶鍒訛紝浠ユ墽琛孋ompletion Handler銆?/div>
綰跨▼姹犲垎媧撅細鐢盋ompletion Dispatcher鎷ユ湁鐨勭嚎紼嬫睜鍙鐢ㄤ簬Completion Handler鐨勬墽琛屻傚湪姹犱腑鐨勬瘡涓嚎紼嬫帶鍒跺凡琚姩鎬佸湴鍒嗛厤鍒板彲鐢ㄧ殑CPU銆傜嚎紼嬫睜鍒嗘淳鍙氳繃Windows NT鐨処/O瀹屾垚绔彛鏉ュ疄鐜般?/div>
鍦ㄨ冭檻涓婇潰鎻忚堪鐨凜ompletion Dispatcher鎶鏈殑閫傜敤鎬ф椂錛岃冭檻琛?-1涓墍紺虹殑OS鐜鍜岀墿鐞嗙‖浠剁殑鍙兘緇勫悎聽 錛?br />

綰跨▼妯″瀷
緋葷粺綾誨瀷
鍗曞鐞嗗櫒
澶氬鐞嗗櫒
鍗曠嚎紼?/div>
A
B
澶氱嚎紼?/div>
C
D
琛?-1 Completion Dispatcher騫跺彂絳栫暐
濡傛灉浣犵殑OS鍙敮鎸佸悓姝/O錛岄偅灝卞弬瑙佸弽搴斿爢妯″紡[5]銆備絾鏄紝澶у鏁扮幇浠f搷浣滅郴緇熼兘鏀寔鏌愮綾誨瀷鐨勫紓姝/O銆?/div>
鍦ㄨ〃8-1鐨凙鍜孊緇勫悎涓紝鍋囧畾浣犱笉絳夊緟浠諱綍淇″彿閲忔垨浜掓枼浣擄紝鍚庡弽搴旀柟寮忕殑寮傛I/O寰堝彲鑳芥槸鏈濂界殑銆傚惁鍒欙紝Call-through瀹炵幇鎴栬鏇磋兘鍥炲簲浣犵殑闂銆傚湪C緇勫悎涓紝浣跨敤Call-through鏂規硶銆傚湪D緇勫悎涓紝浣跨敤綰跨▼姹犳柟娉曘傚湪瀹炶返涓紝緋葷粺鍖栫殑緇忛獙嫻嬮噺瀵逛簬閫夋嫨鏈涓哄悎閫傜殑鍙夋柟妗堟潵璇存槸蹇呴渶鐨勩?/div>
8.7.3 瀹炵幇瀹屾垚澶勭悊鍣?/b>
Completion Handler鐨勫疄鐜板甫鏉ヤ互涓嬭冭檻銆?/div>
8.7.3.1 鐘舵佸畬鏁存?/b>
Completion Handler鍙兘闇瑕佺淮鎶ゅ叧浜庣壒瀹氳姹傜殑鐘舵佷俊鎭備緥濡傦紝OS鍙互閫氱煡Web鏈嶅姟鍣紝鍙湁涓閮ㄥ垎鏂囦歡宸茶鍐欏埌緗戠粶閫氫俊绔彛銆備綔涓虹粨鏋滐紝Completion Handler鍙兘闇瑕侀噸鏂板彂鍑鴻姹傦紝鐩村埌鏂囦歡琚畬鍏ㄥ啓鍑猴紝鎴栬繛鎺ュ彉寰楁棤鏁堛傚洜姝わ紝瀹冨繀欏葷煡閬撳師鍏堟寚瀹氱殑鏂囦歡錛岃繕鍓╁灝戝瓧鑺傝鍐欙紝浠ュ強鍦ㄥ墠涓涓姹傚紑濮嬫椂鏂囦歡鎸囬拡鐨勪綅緗?/div>
娌℃湁闅愬惈鐨勯檺鍒舵潵闃繪Proactive Initiator灝嗗涓狝synchronous Operation璇鋒眰鍒嗛厤緇欏崟涓狢ompletion Handler銆傚洜姝わ紝Completion Handler蹇呴』鍦ㄥ畬鎴愰氱煡閾句腑涓涓鈥滅郴涓娾濊姹傜壒鏈夌殑鐘舵佷俊鎭備負瀹屾垚姝ゅ伐浣滐紝Completion Handler鍙互鍒╃敤寮傛瀹屾垚浠ょ墝錛圓synchronous Completion Token錛夋ā寮廩8]銆?/div>
8.7.3.2 璧勬簮綆$悊
涓庡湪浠諱綍澶氱嚎紼嬬幆澧冧腑涓鏍鳳紝浣跨敤鍓嶆憚鍣ㄦā寮忕殑Completion Handler榪樻槸瑕佺敱瀹冭嚜宸辨潵紜繚瀵瑰叡浜祫婧愮殑璁塊棶鏄嚎紼嬪畨鍏ㄧ殑銆備絾鏄紝Completion Handler涓嶈兘璺ㄨ秺澶氫釜瀹屾垚閫氱煡鎸佹湁鍏變韓璧勬簮銆傚惁鍒欙紝灝辨湁鍙戠敓鈥滅敤槨愬摬瀛﹀闂鈥濈殑鍗遍櫓[11]銆?/div>
璇ラ棶棰樺湪浜庝竴涓悎鐞嗙殑綰跨▼鎺у埗姘鎬箙絳夊緟涓涓俊鍙烽噺琚疆浣嶆椂鎵浜х敓鐨勬閿併傞氳繃璁炬兂涓涓敱涓緹ゅ摬瀛﹀鍑哄腑鐨勫浼氬彲浠ユ紨紺鴻繖涓闂銆傜敤槨愯呭洿緇曚竴涓渾妗屽氨搴э紝鍦ㄦ瘡涓摬瀛﹀涔嬮棿鍙湁涓鏀瀛愩傚綋鍝插瀹惰寰楅ゥ楗挎椂錛屼粬蹇呴』鑾峰彇鍦ㄤ粬宸﹁竟鍜屽湪浠栧彸杈圭殑絳峰瓙鎵嶈兘鐢ㄩ銆備竴鏃﹀摬瀛﹀鑾峰緱涓鏀瀛愶紝涓嶅埌鍚冮ケ浠栦滑灝變笉浼氭斁涓嬪畠銆傚鏋滄墍鏈夊摬瀛﹀閮芥嬁璧峰湪浠栦滑鍙寵竟鐨勭瀛愶紝灝變細鍙戠敓姝婚攣錛屽洜涓轟粬浠皢姘歌繙涔熶笉鍙兘鎷垮埌宸﹁竟鐨勭瀛愩?/div>
8.7.3.3 鍗犲厛寮忕瓥鐣ワ紙Preemptive Policy錛?/b>
Completion Dispatcher綾誨瀷鍐沖畾鍦ㄦ墽琛屾椂涓涓狢ompletion Handler鏄惁鍙崰鍏堛傚綋涓庡姩鎬佺嚎紼嬪拰綰跨▼姹犲垎媧懼櫒鐩歌繛鏃訛紝Completion Handler鑷劧鍙崰鍏堛備絾鏄紝褰撲笌鍚庡弽搴斿紡Completion Dispatcher鐩歌繛鏃訛紝Completion Handler騫舵病鏈夊鍏朵粬Completion Handler鐨勫崰鍏堟潈銆傚綋鐢盋all-through鍒嗘淳鍣ㄩ┍鍔ㄦ椂錛孋ompletion Handler鐩稿浜庡湪鍙姤璀︾瓑寰呯姸鎬佺殑綰跨▼鎺у埗涔熸病鏈夊崰鍏堟潈銆?/div>
涓鑸岃█錛屽鐞嗗櫒涓嶅簲璇ユ墽琛屾寔緇椂闂撮暱鐨勫悓姝ユ搷浣滐紝闄ら潪浣跨敤浜嗗涓畬鎴愮嚎紼嬶紝鍥犱負搴旂敤鐨勬諱綋鍝嶅簲鎬у皢浼氳鏄捐憲鍦伴檷浣庛傝繖鏍風殑鍗遍櫓鍙互閫氳繃澧炲己鐨勭紪紼嬭緇冩潵闄嶄綆銆備緥濡傦紝鎵鏈塁ompletion Handler琚姹傜敤浣淧roactive Initiator錛岃屼笉鏄幓鎵ц鍚屾鎿嶄綔銆?/div>
8.8 紺轟緥浠g爜
榪欎竴閮ㄥ垎鏄劇ず鎬庢牱浣跨敤鍓嶆憚鍣ㄦā寮忔潵寮鍙慦eb鏈嶅姟鍣ㄣ傝渚嬪瓙鍩轟簬ACE鏋勬灦[4]涓殑鍓嶆憚鍣ㄥ疄鐜般?/div>
褰撳鎴瘋繛鎺ュ埌Web鏈嶅姟鍣ㄦ椂錛孒TTP_Handler鐨刼pen鏂規硶琚皟鐢ㄣ備簬鏄湇鍔″櫒灝遍氳繃鍦ˋsynchronous Operation瀹屾垚鏃跺洖璋冪殑瀵硅薄錛堝湪姝や緥涓槸this鎸囬拡錛夈佺敤浜庝紶杈撴暟鎹殑緗戠粶榪炴帴錛屼互鍙婁竴鏃︽搷浣滃畬鎴愭椂浣跨敤鐨凜ompletion Dispatcher錛坧roactor_錛夋潵鍒濆鍖栧紓姝/O瀵硅薄銆傞殢鍚庤鎿嶄綔寮傛鍦板惎鍔紝鑰屾湇鍔″櫒榪斿洖浜嬩歡寰幆銆?/div>
褰揂sync read鎿嶄綔瀹屾垚鏃訛紝鍒嗘淳鍣ㄥ洖璋僅TTP_Handler::handle_read_stream銆傚鏋滄湁瓚沖鐨勬暟鎹紝瀹㈡埛璇鋒眰灝辮瑙f瀽銆傚鏋滄暣涓鎴瘋姹傝繕鏈畬鍏ㄥ埌杈撅紝鍙︿竴涓鎿嶄綔灝變細琚紓姝ュ湴鍙戣搗銆?/div>
鍦ㄥGET璇鋒眰鐨勫搷搴斾腑錛屾湇鍔″櫒瀵規墍璇鋒眰鏂囦歡榪涜鍐呭瓨鏄犲皠錛屽茍灝嗘枃浠舵暟鎹紓姝ュ湴鍐欏線瀹㈡埛銆傚綋鍐欐搷浣滃畬鎴愭椂錛屽垎媧懼櫒鍥炶皟HTTP_Handler::handle_write_stream錛屼粠鑰岄噴鏀懼姩鎬佸垎閰嶇殑璧勬簮銆?/div>
闄勫綍涓惈鏈変袱涓叾浠栫殑浠g爜瀹炰緥錛屼嬌鐢ㄥ悓姝ョ殑綰跨▼妯″瀷鍜屽悓姝ョ殑錛堥潪闃誨錛夊弽搴斿紡妯″瀷瀹炵幇Web鏈嶅姟鍣ㄣ?/div>
class HTTP_Handler
: public Proactor::Event_Handler
// = TITLE
// Implements the HTTP protocol
// (asynchronous version).
//
// = PATTERN PARTICIPANTS
// Proactive Initiator = HTTP_Handler
// Asynch Op = Network I/O
// Asynch Op Processor = OS
// Completion Dispatcher = Proactor
// Completion Handler = HTPP_Handler
{
public:
void open (Socket_Stream *client)
{
// Initialize state for request
request_.state_ = INCOMPLETE;
// Store reference to client.
client_ = client;
// Initialize asynch read stream
stream_.open (*this, client_->handle (), proactor_);
// Start read asynchronously.
stream_.read (request_.buffer (),
request_.buffer_size ());
}
// This is called by the Proactor
// when the asynch read completes
void handle_read_stream(u_long bytes_transferred)
{
if (request_.enough_data(bytes_transferred))
parse_request ();
else
// Start reading asynchronously.
stream_.read (request_.buffer (),
request_.buffer_size ());
}
void parse_request (void)
{
// Switch on the HTTP command type.
switch (request_.command ())
{
// Client is requesting a file.
case HTTP_Request::GET:
// Memory map the requested file.
file_.map (request_.filename ());
// Start writing asynchronously.
stream_.write (file_.buffer (), file_.buffer_size ());
break;
// Client is storing a file
// at the server.
case HTTP_Request::PUT:
// ...
}
}
void handle_write_stream(u_long bytes_transferred)
{
if (file_.enough_data(bytes_transferred))
// Success....
else
// Start another asynchronous write
stream_.write (file_.buffer (), file_.buffer_size ());
}
private:
// Set at initialization.
Proactor *proactor_;
// Memory-mapped file_;
Mem_Map file_;
// Socket endpoint.
Socket_Stream *client_;
// HTTP Request holder
HTTP_Request request_;
// Used for Asynch I/O
Asynch_Stream stream_;
};
8.9 宸茬煡搴旂敤
涓嬮潰鏄竴浜涜騫挎硾璁拌澆鐨勫墠鎽勫櫒鐨勪嬌鐢細
Windows NT涓殑I/O瀹屾垚绔彛錛?/b>Windows NT鎿嶄綔緋葷粺瀹炵幇浜嗗墠鎽勫櫒妯″紡銆俉indows NT鏀寔澶氱Asynchronous Operation錛屾瘮濡傛帴鍙楁柊緗戠粶榪炴帴銆佽鍐欐枃浠跺拰socket錛屼互鍙婇氳繃緗戠粶榪炴帴浼犺緭鏂囦歡銆傛搷浣滅郴緇熷氨鏄疉synchronous Operation Processor銆傛搷浣滅粨鏋滃湪I/O瀹屾垚绔彛錛堝畠鎵紨Completion Dispatcher鐨勮鑹詫級涓婃帓闃熴?/div>
寮傛I/O鎿嶄綔鐨刄NIX AIO鏃忥細鍦ㄦ湁浜涘疄鏃禤OSIX騫沖彴涓婏紝鍓嶆憚鍣ㄦā寮忔槸鐢盿io API鏃廩9]鏉ュ疄鐜扮殑銆傝繖浜汷S鐗規ч潪甯哥被浼間簬涓婇潰鎻忚堪鐨刉indows NT鐨勭壒鎬с備竴涓尯鍒槸UNIX淇″彿鍙敤浜庡疄鐜扮湡姝e紓姝ョ殑Completion Dispatcher錛圵indows NT API涓嶆槸鐪熸寮傛鐨勶級銆?/div>
ACE Proactor錛?/b>ACE鑷傞厤閫氫俊鐜 [4]瀹炵幇浜嗗墠鎽勫櫒緇勪歡錛屽畠灝佽Windows NT涓婄殑I/O瀹屾垚绔彛錛屼互鍙奝OSIX騫沖彴涓婄殑aio API銆侫CE鍓嶆憚鍣ㄦ娊璞℃彁渚沇indows NT鎵鏀寔鐨勬爣鍑咰 API鐨凮O鎺ュ彛銆傝繖涓瀹炵幇鐨勬簮鐮佸彲浠嶢CE緗戠珯http://www.cs.wustl.edu/~schmidt/ACE.html鑾峰彇銆?/div>
Windows NT涓殑寮傛榪囩▼璋冪敤錛圓synchronous Procedure Call錛夛細鏈変簺緋葷粺錛堟瘮濡俉indows NT錛夋敮鎸佸紓姝ヨ繃紼嬭皟鐢紙APC錛夈侫PC鏄湪鐗瑰畾綰跨▼鐨勪笂涓嬫枃涓紓姝ユ墽琛岀殑鍑芥暟銆傚綋APC琚帓闃熷埌綰跨▼鏃訛紝緋葷粺鍙戝嚭杞歡涓柇銆備笅涓嬈$嚎紼嬭璋冨害鏃訛紝瀹冨皢榪愯璇PC銆傛搷浣滅郴緇熸墍鍙戝嚭鐨凙PC琚О涓?i>鍐呮牳妯″紡APC銆傚簲鐢ㄦ墍鍙戝嚭鐨凙PC琚О涓?i>鐢ㄦ埛妯″紡APC銆?/div>
8.10 鐩稿叧妯″紡
鍥?-9婕旂ず涓庡墠鎽勫櫒鐩稿叧鐨勬ā寮忋?/div>
鍥?-9 鍓嶆憚鍣ㄦā寮忕殑鐩稿叧妯″紡
寮傛瀹屾垚浠ょ墝錛圓CT錛夋ā寮廩8]閫氬父涓庡墠鎽勫櫒妯″紡緇撳悎浣跨敤銆傚綋Asynchronous Operation瀹屾垚鏃訛紝搴旂敤鍙兘闇瑕佹瘮綆鍗曠殑閫氱煡鏇村鐨勪俊鎭潵閫傚綋鍦板鐞嗕簨浠躲傚紓姝ュ畬鎴愪護鐗屾ā寮忓厑璁稿簲鐢ㄥ皢鐘舵侀珮鏁堝湴涓嶢synchronous Operation鐨勫畬鎴愮浉鍏寵仈銆?/div>
鍓嶆憚鍣ㄦā寮忚繕涓庤瀵熻咃紙Observer錛夋ā寮廩12]錛堝湪鍏朵腑錛屽綋鍗曚釜涓婚鍙樺姩鏃訛紝鐩稿叧瀵硅薄涔熶細鑷姩鏇存柊錛夋湁鍏熾傚湪鍓嶆憚鍣ㄦā寮忎腑錛屽綋鏉ヨ嚜澶氫釜鏉ユ簮鐨勪簨浠跺彂鐢熸椂錛屽鐞嗗櫒琚嚜鍔ㄥ湴閫氱煡銆備竴鑸岃█錛屽墠鎽勫櫒妯″紡琚敤浜庡紓姝ュ湴灝嗗涓緭鍏ユ簮澶氳礬鍒嗙緇欎笌瀹冧滑鐩稿叧鑱旂殑浜嬩歡澶勭悊鍣紝鑰岃瀵熻呴氬父浠呬笌鍗曚釜浜嬩歡婧愮浉鍏寵仈銆?/div>
鍓嶆憚鍣ㄦā寮忓彲琚涓烘槸鍚屾鍙嶅簲鍫嗘ā寮廩5]鐨勪竴縐?i>寮傛鐨?/i>鍙樹綋銆傚弽搴斿爢妯″紡璐熻矗澶氫釜浜嬩歡澶勭悊鍣ㄧ殑澶氳礬鍒嗙鍜屽垎媧撅紱瀹冧滑鍦ㄥ彲浠?i>鍚屾鍦板彂璧?/i>鎿嶄綔鑰屼笉浼氶樆濉炴椂琚Е鍙戙傜浉鍙嶏紝鍓嶆憚鍣ㄦā寮忎篃鏀寔澶氫釜浜嬩歡澶勭悊鍣ㄧ殑澶氳礬鍒嗙鍜屽垎媧撅紝浣嗗畠浠槸琚?i>寮傛浜嬩歡鐨勫畬鎴?/i>瑙﹀彂鐨勩?/div>
涓誨姩瀵硅薄錛圓ctive Object錛夋ā寮廩13]浣挎柟娉曟墽琛屼笌鏂規硶璋冪敤鍘昏﹀悎銆傚墠鎽勫櫒妯″紡涔熸槸綾諱技鐨勶紝鍥犱負Asynchronous Operation Processor浠h〃搴旂敤鐨凱roactive Initiator鏉ユ墽琛屾搷浣溿傚氨鏄錛屼袱縐嶆ā寮忛兘鍙敤浜庡疄鐜癆synchronous Operation銆傚墠鎽勫櫒妯″紡甯稿父鐢ㄤ簬鏇夸唬涓誨姩瀵硅薄妯″紡錛屼互浣跨郴緇熷茍鍙戠瓥鐣ヤ笌綰跨▼妯″瀷鍘昏﹀悎銆?/div>
鍓嶆憚鍣ㄥ彲琚疄鐜頒負鍗曚綋錛圫ingleton錛塠12]銆傝繖瀵逛簬鍦ㄥ紓姝ュ簲鐢ㄤ腑錛屽皢浜嬩歡澶氳礬鍒嗙鍜屽畬鎴愬垎媧鵑泦涓埌鍗曚竴鐨勫湴鏂規潵璇存槸鏈夌敤鐨勩?/div>
璐d換閾撅紙Chain of Responsibility錛孋OR錛夋ā寮廩12]浣夸簨浠跺鐞嗗櫒涓庝簨浠舵簮鍘昏﹀悎銆傚湪Proactive Initiator涓嶤ompletion Handler鐨勯殧紱諱笂錛屽墠鎽勫櫒妯″紡涔熸槸綾諱技鐨勩備絾鏄紝鍦–OR涓紝浜嬩歡婧愰鍏堜笉鐭ラ亾鍝竴涓鐞嗗櫒灝嗚鎵ц錛堝鏋滄湁鐨勮瘽錛夈傚湪鍓嶆憚鍣ㄤ腑錛孭roactive Initiator瀹屽叏鐭ラ亾鐩爣澶勭悊鍣ㄣ備絾鏄紝閫氳繃寤虹珛涓涓狢ompletion Handler錛堝畠鏄敱澶栭儴宸ュ巶鍔ㄦ侀厤緗殑璐d換閾劇殑鍏ュ彛錛夛紝榪欎袱縐嶆ā寮忓彲琚粨鍚堝湪涓璧鳳細銆?/div>
8.11 緇撴潫璇?/b>
鍓嶆憚鍣ㄦā寮忓寘鍚簡涓縐嶅己澶х殑璁捐鑼冨紡錛屾敮鎸侀珮鎬ц兘騫跺彂搴旂敤鐨勯珮鏁堣岀伒媧葷殑浜嬩歡鍒嗘淳絳栫暐銆傚墠鎽勫櫒妯″紡鎻愪緵騫跺彂鎵ц鎿嶄綔鐨勬ц兘鍔╃泭錛岃屽張涓嶅己榪紑鍙戣呬嬌鐢ㄥ悓姝ュ綰跨▼鎴栧弽搴斿紡緙栫▼銆?/div>
鍙傝冩枃鐚?/b>
[1] J. Hu, I. Pyarali, and D. C. Schmidt, 鈥淢easuring the Impact of Event Dispatching and Concurrency Models on Web Server Performance Over High-speed Networks,鈥?in Proceedings of the 2nd Global Internet Conference, IEEE, November 1997.
[2] J. Hu, I. Pyarali, and D. C. Schmidt, 鈥淎pplying the Proactor Pattern to High-Performance Web Servers,鈥?in Proceedings of the 10th International Conference on Parallel and Distributed Computing and Systems, IASTED, Oct. 1998.
[3] J. C. Mogul, 鈥淭he Case for Persistent-connection HTTP,鈥?in Proceedings of ACMSIGCOMM 鈥?5 Conference in Computer Communication Review, (Boston, MA, USA), pp. 299鈥?14, ACM Press, August 1995.
[4] D. C. Schmidt, 鈥淎CE: an Object-Oriented Framework for Developing Distributed Applications,鈥?in Proceedings of the 6th USENIX C++ Technical Conference, (Cambridge, Massachusetts), USENIX Association, April 1994.
[5] D. C. Schmidt, 鈥淩eactor: An Object Behavioral Pattern for Concurrent Event Demultiplexing and Event Handler Dispatching,鈥?in Pattern Languages of Program Design (J. O. Coplien and D. C. Schmidt, eds.), pp. 529鈥?45, Reading, MA: Addison-Wesley, 1995.
[6] D. C. Schmidt, 鈥淎cceptor and Connector: Design Patterns for Initializing Communication Services,鈥?in Pattern Languages of Program Design (R. Martin, F. Buschmann, and D. Riehle, eds.), Reading, MA: Addison-Wesley, 1997.
[7] M. K. McKusick, K. Bostic, M. J. Karels, and J. S. Quarterman, The Design and Implementation of the 4.4BSD Operating System. Addison Wesley, 1996.
[8] I. Pyarali, T. H. Harrison, and D. C. Schmidt, 鈥淎synchronous Completion Token: an Object Behavioral Pattern for Efficient Asynchronous Event Handling,鈥?in Pattern Languages of Program Design (R. Martin, F. Buschmann, and D. Riehle, eds.), Reading, MA: Addison-Wesley, 1997.
[9] 鈥淚nformation Technology 鈥?Portable Operating System Interface (POSIX) 鈥?Part 1: System Application: Program Interface (API) [C Language],鈥?1995.
[10] Microsoft Developers Studio, Version 4.2 - Software Development Kit, 1996.
[11] E. W. Dijkstra, 鈥淗ierarchical Ordering of Sequential Processes,鈥?Acta Informatica, vol. 1, no. 2, pp. 115鈥?38, 1971.
[12] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software. Reading, MA: Addison-Wesley, 1995.
[13] R. G. Lavender and D. C. Schmidt, 鈥淎ctive Object: an Object Behavioral Pattern for Concurrent Programming,鈥?in Proceedings of the 2nd Annual Conference on the Pattern Languages of Programs, (Monticello, Illinois), pp. 1鈥?, September 1995.
闄勫綍A 鍙夊疄鐜?/b>
鏈檮褰曟榪扮敤浜庡紑鍙戝墠鎽勫櫒妯″紡鐨勫彲閫夊疄鐜扮殑浠g爜銆備笅闈紝鎴戜滑媯鏌ヤ嬌鐢ㄥ綰跨▼鐨勫悓姝/O鍜屼嬌鐢ㄥ崟綰跨▼鐨勫弽搴斿紡I/O銆?/div>
A.1 澶氫釜鍚屾綰跨▼
涓嬮潰鐨勪唬鐮佹樉紺烘庢牱浣跨敤綰跨▼姹犲悓姝/O鏉ュ紑鍙慦eb鏈嶅姟鍣ㄣ傚綋瀹㈡埛榪炴帴鍒版湇鍔″櫒鏃訛紝姹犱腑鐨勪竴涓嚎紼嬫帴鍙楄繛鎺ワ紝騫惰皟鐢℉TTP_Handler涓殑open鏂規硶銆傞殢鍚庢湇鍔″櫒鍚屾鍦頒粠緗戠粶榪炴帴璇誨彇璇鋒眰銆傚綋璇繪搷浣滃畬鎴愭椂錛屽鎴瘋姹傞殢涔嬭瑙f瀽銆傚湪瀵笹ET璇鋒眰鐨勫搷搴斾腑錛屾湇鍔″櫒瀵規墍璇鋒眰鏂囦歡榪涜鍐呭瓨鏄犲皠錛屽茍灝嗘枃浠舵暟鎹悓姝ュ湴鍐欏線瀹㈡埛銆傛敞鎰忛樆濉濱/O鏄庢牱浣縒eb鏈嶅姟鍣ㄨ兘澶熼伒寰?.2.1涓墍姒傝堪鐨勬楠ょ殑銆?/div>
class HTTP_Handler
// = TITLE
// Implements the HTTP protocol
// (synchronous threaded version).
//
// = DESCRIPTION
// This class is called by a
// thread in the Thread Pool.
{
public:
void open (Socket_Stream *client)
{
HTTP_Request request;
// Store reference to client.
client_ = client;
// Synchronously read the HTTP request
// from the network connection and
// parse it.
client_->recv (request);
parse_request (request);
}
void parse_request (HTTP_Request &request)
{
// Switch on the HTTP command type.
switch (request.command ())
{
// Client is requesting a file.
case HTTP_Request::GET:
// Memory map the requested file.
Mem_Map input_file;
input_file.map (request.filename());
// Synchronously send the file
// to the client. Block until the
// file is transferred.
client_->send (input_file.data (),
input_file.size ());
break;
// Client is storing a file at
// the server.
case HTTP_Request::PUT:
// ...
}
}
private:
// Socket endpoint.
Socket_Stream *client_;
// ...
};
A.2 鍗曠嚎紼嬪弽搴斿紡浜嬩歡鍒嗘淳
涓嬮潰鐨勪唬鐮佹樉紺烘庢牱灝嗗弽搴斿爢妯″紡鐢ㄤ簬寮鍙慦eb鏈嶅姟鍣ㄣ傚綋瀹㈡埛榪炴帴鍒版湇鍔″櫒鏃訛紝HTTP_Handler::open鏂規硶琚皟鐢ㄣ傛湇鍔″櫒鐧昏I/O鍙ユ焺鍜屽湪緗戠粶鍙ユ焺鈥滆灝辯華鈥滄椂鍥炶皟鐨勫璞★紙鍦ㄦ渚嬩腑鏄痶his鎸囬拡錛夈傜劧鍚庢湇鍔″櫒榪斿洖浜嬩歡寰幆銆?/div>
褰撹姹傛暟鎹埌杈炬湇鍔″櫒鏃訛紝reactor_鍥炶皟HTTP_Handler::handle_input鏂規硶銆傚鎴鋒暟鎹互闈為樆濉炴柟寮忚璇誨彇銆傚鏋滄湁瓚沖鐨勬暟鎹紝瀹㈡埛璇鋒眰灝辮瑙f瀽銆傚鏋滄暣涓鎴瘋姹傝繕娌℃湁鍒拌揪錛屽簲鐢ㄥ氨榪斿洖鍙嶅簲鍫嗕簨浠跺驚鐜?/div>
鍦ㄥGET璇鋒眰鐨勫搷搴斾腑錛屾湇鍔″櫒瀵規墍璇鋒眰鐨勬枃浠惰繘琛屽唴瀛樻槧灝勶紱騫跺湪鍙嶅簲鍫嗕笂鐧昏錛屼互鍦ㄧ綉緇滆繛鎺ュ彉涓衡滃啓灝辯華鈥濇椂琚氱煡銆傚綋鍚戣繛鎺ュ啓鍏ユ暟鎹笉浼氶樆濉炶皟鐢ㄧ嚎紼嬫椂錛宺eactor_灝卞洖璋僅TTP_Handler::handler_output鏂規硶銆傚綋鎵鏈夋暟鎹兘宸插彂閫佺粰瀹㈡埛鏃訛紝緗戠粶榪炴帴琚叧闂?/div>
class HTTP_Handler :
public Reactor::Event_Handler
// = TITLE
// Implements the HTTP protocol
// (synchronous reactive version).
//
// = DESCRIPTION
// The Event_Handler base class
// defines the hooks for
// handle_input()/handle_output().
//
// = PATTERN PARTICIPANTS
// Reactor = Reactor
// Event Handler = HTTP_Handler
{
public:
void open (Socket_Stream *client)
{
// Initialize state for request
request_.state_ = INCOMPLETE;
// Store reference to client.
client_ = client;
// Register with the reactor for reading.
reactor_->register_handler
(client_->handle (),
this,
Reactor::READ_MASK);
}
// This is called by the Reactor when
// we can read from the client handle.
void handle_input (void)
{
int result = 0;
// Non-blocking read from the network
// connection.
do
result = request_.recv (client_->handle ());
while (result != SOCKET_ERROR && request_.state_ == INCOMPLETE);
// No more progress possible,
// blocking will occur
if (request_.state_ == INCOMPLETE && errno == EWOULDBLOCK)
reactor_->register_handler
(client_->handle (),
this,
Reactor::READ_MASK);
else
// We now have the entire request
parse_request ();
}
void parse_request (void)
{
// Switch on the HTTP command type.
switch (request_.command ())
{
// Client is requesting a file.
case HTTP_Request::GET:
// Memory map the requested file.
file_.map (request_.filename ());
// Transfer the file using Reactive I/O.
handle_output ();
break;
// Client is storing a file at
// the server.
case HTTP_Request::PUT:
// ...
}
}
void handle_output (void)
{
// Asynchronously send the file
// to the client.
if (client_->send (file_.data (),
file_.size ())
== SOCKET_ERROR
&& errno == EWOULDBLOCK)
// Register with reactor...
else
// Close down and releas

resources.

handle_close ();
}
private:
// Set at initialization.
Reactor *reactor_;
// Memory-mapped file_;
Mem_Map file_;
// Socket endpoint.
Socket_Stream *client_;
// HTTP Request holder.
HTTP_Request request_;
};

鏈枃杞澆鑷矨CE寮鍙戣呯綉绔?浣滆咃細Irfan Pyarali Tim Harrison


walkspeed 2007-02-27 21:17 鍙戣〃璇勮
]]>ACE涓綉緇滈氳緙栫▼鍩烘湰鏋舵瀯http://www.shnenglu.com/walkspeed/archive/2007/02/25/18969.htmlwalkspeedwalkspeedSun, 25 Feb 2007 11:30:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/02/25/18969.htmlhttp://www.shnenglu.com/walkspeed/comments/18969.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/02/25/18969.html#Feedback5http://www.shnenglu.com/walkspeed/comments/commentRss/18969.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/18969.html聽聽聽 ACE_INET_Addr綾伙紝鍖呰浜嗙綉緇滃湴鍧
聽聽聽 ACE_SOCK_Connector綾伙紝鎵紨涓誨姩榪炴帴瑙掕壊錛屽彂璧烽氳榪炴帴銆傝繛鎺ュ埌榪滅鐨勬湇鍔°?br />聽聽聽 ACE_SOCK_Acceptor綾伙紝鎵紨琚姩榪炴帴瑙掕壊錛岀瓑寰呰繛鎺ャ傜瓑寰呰繙绔鎴風殑璇鋒眰銆?br />聽聽聽 ACE_SOCK_Stream綾伙紝鎵紨鏁版嵁閫氳瑙掕壊錛屽彂閫佸拰鎺ユ敹鏁版嵁銆傚畬鎴愬鎴蜂笌鏈嶅姟涔嬮棿鐨勯氳銆?br />聽聽聽
聽聽聽 鍒╃敤ACE搴撴潵寮鍙戠綉緇滈氳紼嬪簭鏄緢綆鍗曠殑錛屼竴涓熀鏈▼搴忓彧鐢ㄥ埌浠ヤ笂鎻愬埌鐨勫嚑涓被錛屽氨
鍙互瀹屾垚涓涓熀浜庡鎴風銆佹湇鍔″櫒绔ā鍨嬬殑緗戠粶搴旂敤鐨勫紑鍙戙傚紑鍙戣呮棤闇浜嗚ВSocket鍦ㄤ笉鍚屽鉤
鍙頒笂鐨勫疄鐜幫紝璁板繂浼楀騫剁浉浜掑叧鑱旂殑Socket APIs銆?/p>

聽聽聽 涓涓嬩互涓涓狧ello World紼嬪簭涓烘紨紺恒?br />聽聽聽
聽聽聽 瀹㈡埛绔▼搴忋傚彂閫佷竴涓狧ello World鍒拌繙绔殑鏈嶅姟鍣紝騫舵帴鏀舵湇鍔″櫒榪斿洖鐨勪俊鎭紝灝嗕俊鎭?br />鎵撳嵃鍦ㄥ睆騫曚笂銆?/p>

#include <iostream>
#include <string>

#include <ace/ACE.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>

int main( int argc, char* argv[] )
{
聽ACE::init();//鍒濆鍖朅CE搴擄紝鍦╳indows涓嬩竴瀹氳

聽std::string str = "hello world";

聽//璁劇疆鏈嶅姟鍣ㄥ湴鍧
聽//絎竴涓弬鏁版槸绔彛錛岀浜屼釜鏄痠p鍦板潃錛屼篃鍙互鏄煙鍚嶃?br />聽//鍙互鍏堝畾涔変竴涓湴鍧瀵硅薄錛屽啀鐢ˋCE_INET_Addr鐨剆et鍑芥暟鏉ヨ瀹氥?br />聽//鍦板潃鐨勯厤緗緢澶氾紝鍏蜂綋鐨勫弬鐓ф枃妗?br />聽ACE_INET_Addr peer_addr( 5050, "127.0.0.1" );
聽ACE_SOCK_Stream peer_stream;//瀹氫箟涓涓氳闃熷艦

聽ACE_SOCK_Connector peer_connector;//瀹氫箟涓涓富鍔ㄨ繛鎺ュ璞?br />聽peer_connector.connect( peer_stream, peer_addr );//鍙戣搗涓涓繛鎺?/p>

聽peer_stream.send( str.c_str(), str.length() );//鍙戦佹暟鎹埌鏈嶅姟鍣?/p>

聽str.erase();
聽str.resize( sizeof( "hello world" ) );
聽peer_stream.recv( (void*)str.c_str(), str.length() );//鎺ユ敹鏉ヨ嚜鏈嶅姟鍣ㄧ殑淇℃伅

聽std::cout << "from server message : " << str << std::endl;

聽聽聽 ACE::fini();
聽return 0;
}

聽聽聽 鏈嶅姟鍣ㄧ浠g爜銆傛帴鏀朵竴涓繙绔殑榪炴帴錛屽皢鎺ユ敹鍒扮殑淇℃伅鎵撳嵃鍦ㄥ睆騫曚笂錛屽茍灝嗘帴鏀跺埌鐨勪俊
鎭繑鍥炵粰瀹㈡埛绔?br />#include <iostream>
#include <string>

#include <ace/ACE.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/SOCK_Stream.h>

int main( int argc, char* argv[] )
{
聽ACE::init();

聽std::string str;
聽str.resize( sizeof( "hello world" ) );

聽//璁劇疆鏈嶅姟鍣ㄥ湴鍧
聽ACE_INET_Addr peer_addr( 5050, "127.0.0.1" );

聽ACE_SOCK_Stream peer_stream;

聽//鍒涘緩琚姩榪炴帴瑙掕壊瀵硅薄
聽ACE_SOCK_Acceptor peer_acceptor;
聽//寮鍚鍔ㄨ繛鎺ュ璞★紝灝嗗璞$粦瀹氬埌涓涓湴鍧涓?br />聽peer_acceptor.open( peer_addr );

聽//絳夊緟榪炴帴
聽peer_acceptor.accept( peer_stream );

聽//鏁版嵁閫氳
聽peer_stream.recv( (void*)str.c_str(), str.length() );
聽std::cout << "from client message : " << str << std::endl;
聽peer_stream.send( str.c_str(), str.length() );

聽ACE::fini();
聽return 0;
}
脳脳脳脳浠ヤ笂浠g爜闇瑕丄CE搴撴墠鑳借繍杞椕椕椕?br />聽聽聽
聽聽聽 鍒╃敤ACE緙栫▼鐨勫熀鏈鏋躲?br />聽聽聽 瀹㈡埛绔?br />聽聽聽 1 鍒涘緩鍦板潃瀵硅薄銆傦紙ACE_INET_Addr錛?br />聽聽聽 2 鍒涘緩涓誨姩榪炴帴瀵硅薄銆傦紙ACE_SOCK_Connector錛?br />聽聽聽 3 鍒涘緩鏁版嵁閫氳瀵硅薄銆傦紙ACE_SOCK_Stream錛?br />聽聽聽 4 璁劇疆鏈嶅姟鍣ㄥ湴鍧銆傦紙ACE_INET_Addr::set錛?br />聽聽聽 5 灝嗘暟鎹氳瀵硅薄鍜屽湴鍧浣滀負鍙傛暟浼犵粰涓誨姩榪炴帴瀵硅薄錛屽彂璧蜂富鍔ㄨ繛鎺ワ紙ACE_SOCK_Connector::connect錛?br />聽聽聽 6 鍒╃敤閫氳瀵硅薄鎺ユ敹鍜屽彂閫佹暟鎹傦紙ACE_SOCK_Stream::recv鍜孉CE_SOCK_Stream::send錛?br />聽聽聽
聽聽聽 鏈嶅姟鍣ㄧ
聽聽聽 1 鍒涘緩鍦板潃瀵硅薄銆傦紙ACE_INET_Addr錛?br />聽聽聽 2 鍒涘緩琚姩榪炴帴瀵硅薄銆傦紙ACE_SOCK_Connector錛?br />聽聽聽 3 鍒涘緩鏁版嵁閫氳瀵硅薄銆傦紙ACE_SOCK_Stream錛?br />聽聽聽 4 璁劇疆鏈嶅姟鍣ㄥ湴鍧銆傦紙ACE_INET_Addr::set錛?br />聽聽聽 5 灝嗗湴鍧浣滀負鍙傛暟浼犵粰琚姩榪炴帴瀵硅薄錛屽惎鍔ㄦ帴鏀訛紙ACE_SOCK_Acceptor::open錛?br />聽聽聽 6 灝嗘暟鎹氳瀵硅薄浼犵粰琚姩榪炴帴瀵硅薄錛屽惎鍔ㄦ帴鏀訛紝鎺ュ彈榪炴帴錛圓CE_SOCK_Connector::accept錛?br />聽聽聽 7 鍒╃敤閫氳瀵硅薄鎺ユ敹鍜屽彂閫佹暟鎹傦紙ACE_SOCK_Stream::recv鍜孉CE_SOCK_Stream::send錛?/p>

walkspeed 2007-02-25 19:30 鍙戣〃璇勮
]]>
ACE涓璖ocket IPC閫氳鍖呰綾繪棌http://www.shnenglu.com/walkspeed/archive/2007/02/24/18942.htmlwalkspeedwalkspeedSat, 24 Feb 2007 06:15:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/02/24/18942.htmlhttp://www.shnenglu.com/walkspeed/comments/18942.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/02/24/18942.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/18942.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/18942.html o_ACE IPC.jpg

聽聽聽 ACE_IPC_SAP綾繪槸IPC綾繪棌鐨勫熀綾伙紝灝佽浜嗗彞鏌勶紝鎻愪緵浜嗚闂彞鏌勭殑鍩烘湰鎺ュ彛錛屽熀鏈粨鏋?br />濡備笅
class ACE_IPC_SAP
{
public:
聽 int enable (int value) const;
聽 int disable (int value) const;

聽 ACE_HANDLE get_handle (void) const;
聽 void set_handle (ACE_HANDLE handle);

protected:
聽 ACE_IPC_SAP (void);
聽 ~ACE_IPC_SAP (void);

private:
聽 ACE_HANDLE handle_;
};

聽聽聽 ACE_SOCK綾繪槸浣跨敤Socket鐨勫熀綾伙紝鎵鏈変嬌鐢⊿ocket閫氳鐨勭被閮戒粠榪欎釜綾繪淳鐢熴傛湰綾葷殑鍔?br />鑳藉寘鎷?br />聽聽聽 1 鍒涘緩鍜岄攢姣丼ocket鍙ユ焺
聽聽聽 2 鑾峰彇鏈湴鍜岃繙绔殑緗戠粶鍦板潃
聽聽聽 3 璁劇疆鍜岃鍙朣ocket閫夐」銆?br />鍩烘湰緇撴瀯濡備笅
class ACE_SOCK : public ACE_IPC_SAP
{
public:
聽 //璁劇疆Socket鐨勫睘鎬э紝鍖呰浜唖etsockopt緋葷粺鍑芥暟
聽 int set_option (int level,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int option,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void *optval,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int optlen) const;
聽 //鑾峰彇Socket鐨勫睘鎬э紝鍖呰浜唃etsockopt緋葷粺鍑芥暟
聽 int get_option (int level,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int option,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 void *optval,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int *optlen) const;
聽 //鑾峰緱鏈湴鍦板潃
聽 int get_local_addr (ACE_Addr &) const;
聽 //鑾峰彇榪滅鍦板潃
聽 int get_remote_addr (ACE_Addr &) const;
聽 //鍏抽棴Socket
聽 int close (void);
聽 //鎵撳紑涓涓猄ocket錛屾病鏈塓os
聽 int open (int type,
聽聽聽聽聽聽聽聽聽聽聽 int protocol_family,
聽聽聽聽聽聽聽聽聽聽聽 int protocol,
聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr);
聽 //鎵撳紑涓涓猄ocket錛屾湁Qos
聽 int open (int type,
聽聽聽聽聽聽聽聽聽聽聽 int protocol_family,
聽聽聽聽聽聽聽聽聽聽聽 int protocol,
聽聽聽聽聽聽聽聽聽聽聽 ACE_Protocol_Info *protocolinfo,
聽聽聽聽聽聽聽聽聽聽聽 ACE_SOCK_GROUP g,
聽聽聽聽聽聽聽聽聽聽聽 u_long flags,
聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr);

protected:
聽 ACE_SOCK (int type,
聽聽聽聽聽聽聽聽聽聽聽 int protocol_family,
聽聽聽聽聽聽聽聽聽聽聽 int protocol = 0,
聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr = 0);
聽 ACE_SOCK (int type,
聽聽聽聽聽聽聽聽聽聽聽 int protocol_family,
聽聽聽聽聽聽聽聽聽聽聽 int protocol,
聽聽聽聽聽聽聽聽聽聽聽 ACE_Protocol_Info *protocolinfo,
聽聽聽聽聽聽聽聽聽聽聽 ACE_SOCK_GROUP g,
聽聽聽聽聽聽聽聽聽聽聽 u_long flags,
聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr);
聽 ACE_SOCK (void);
聽 ~ACE_SOCK (void);
};

聽聽聽 ACE_SOCK_IO綾伙紝鍖呰浜哠ocket鏁版嵁閫氳鐨勫熀鏈柟娉曘傛湰綾繪彁渚涚殑鍔熻兘
聽聽聽 1 鏀寔鏁版嵁鐨勫彂閫佸拰鎺ユ敹
聽聽聽 2 鏀寔鍒嗘暎璇繪搷浣?br />聽聽聽 3 鏀寔闆嗕腑鍐欐搷浣?br />聽聽聽 4 鏀寔闃誨錛岄潪闃誨錛屽畾鏃?I/O鎿嶄綔
鍩烘湰緇撴瀯濡備笅
class ACE_SOCK_IO : public ACE_SOCK
{
public:
聽 ACE_SOCK_IO (void);
聽 ~ACE_SOCK_IO (void);

聽 //鎺ユ敹鏁版嵁
聽 ssize_t recv (void *buf,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t n,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0) const;
聽 //鍒嗘暎璇繪搷浣?br />聽 ssize_t recv (iovec iov[],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t n,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0) const;
聽 //鍙戦佹暟鎹犅犅犅犅犅犅犅犅犅犅犅犅?
聽 ssize_t send (const void *buf,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t n,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0) const;
聽 //闆嗕腑鍐欐搷浣?br />聽 ssize_t send (const iovec iov[],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t n,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0) const;
};

聽聽聽 ACE_SOCK_Stream綾伙紝緇ф壙ACE_SOCK_IO綾匯傚湪ACE_SOCK_IO綾繪彁渚涚殑鍔熻兘涓婏紝娣誨姞浜嗗彂閫?br />鍜屾帴鏀跺垰濂絥涓瓧鑺傜殑鑳藉姏銆傚熀鏈粨鏋勫涓?br />class ACE_Export ACE_SOCK_Stream : public ACE_SOCK_IO
{
public:
聽 ACE_SOCK_Stream (void);
聽 ACE_SOCK_Stream (ACE_HANDLE h);
聽 ~ACE_SOCK_Stream (void);

聽 //鍒氬ソ璇誨彇n涓瓧鑺傜殑鏁版嵁
聽 ssize_t recv_n (void *buf,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t len,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t *bytes_transferred = 0) const;
聽 //鍒嗘暎璇誨垰濂絥涓瓧鑺傛搷浣?br />聽 ssize_t recvv_n (iovec iov[],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int iovcnt,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t *bytes_transferred = 0) const;
聽 //鍒氬ソ鍙戦乶涓瓧鑺傜殑鏁版嵁
聽 ssize_t send_n (const void *buf,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t len,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t *bytes_transferred = 0) const;
聽 //闆嗕腑鍐欏垰濂絥涓瓧鑺傛搷浣?br />聽 ssize_t sendv_n (const iovec iov[],
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int iovcnt,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 size_t *bytes_transferred = 0) const;

聽 int close_reader (void);
聽 int close_writer (void);

聽 int close (void);

聽 typedef ACE_INET_Addr PEER_ADDR;
};

聽聽聽 ACE_SOCK_Acceptor綾繪槸涓涓伐鍘傜被錛岀敤鏉ヨ鍔ㄤ駭鐢熶竴涓柊鐨勯氳绔偣銆傛彁渚涘涓嬭兘鍔?br />聽聽聽 1 鎺ユ敹瀵圭瓑绔殑榪炴帴
聽聽聽 2 榪炴帴鍙互閫氳繃闃誨銆侀潪闃誨鎴栧畾鏃舵柟寮忔帴鍙椼?br />鍩烘湰緇撴瀯濡備笅
class ACE_Export ACE_SOCK_Acceptor : public ACE_SOCK
{
public:

聽 ACE_SOCK_Acceptor (void);
聽 ACE_SOCK_Acceptor (const ACE_Addr &local_sap,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int protocol_family = PF_UNSPEC,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int backlog = ACE_DEFAULT_BACKLOG,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int protocol = 0);
聽 ~ACE_SOCK_Acceptor (void);

聽 //鎵撳紑涓涓洃鍚?br />聽 int open (const ACE_Addr &local_sap,
聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr = 0,
聽聽聽聽聽聽聽聽聽聽聽 int protocol_family = PF_UNSPEC,
聽聽聽聽聽聽聽聽聽聽聽 int backlog = ACE_DEFAULT_BACKLOG,
聽聽聽聽聽聽聽聽聽聽聽 int protocol = 0);

聽 int close (void);
聽 //鎺ュ彈涓涓絳夌鐨勮繛鎺ワ紝浜х敓涓涓氳
聽 int accept (ACE_SOCK_Stream &new_stream,
聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_Addr *remote_addr = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽 int restart = 1,
聽聽聽聽聽聽聽聽聽聽聽聽聽 int reset_new_handle = 0) const;
};

聽聽聽 ACE_SOCK_Connector綾繪槸涓涓伐鍘傜被錛岀敤鏉ヤ富鍔ㄥ緩绔嬩竴涓柊鐨勯氳绔傛彁渚涚殑鍔熻兘濡備笅
聽聽聽 1 鍙戣搗涓涓埌瀵圭瓑鎺ュ彈鑰呯殑榪炴帴錛屽茍鍦ㄨ繛鎺ュ悗浜х敓涓涓氳瀵硅薄
聽聽聽 2 榪炴帴鍙互閫氳繃闃誨銆侀潪闃誨鎴栧畾鏃舵柟寮忓彂璧?br />鍩烘湰緇撴瀯濡備笅
class ACE_SOCK_Connector
{
public:
聽 ACE_SOCK_Connector (void);
聽 ACE_SOCK_Connector (ACE_SOCK_Stream &new_stream,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Addr &remote_sap,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Addr &local_sap = ACE_Addr::sap_any,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int flags = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int perms = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int protocol = 0);

聽 //鍙戣搗涓涓繛鎺?br />聽 int connect (ACE_SOCK_Stream &new_stream,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Addr &remote_sap,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Addr &local_sap = ACE_Addr::sap_any,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int reuse_addr = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int flags = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int perms = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int protocol = 0);

聽 ~ACE_SOCK_Connector (void);

聽 int complete (ACE_SOCK_Stream &new_stream,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_Addr *remote_sap = 0,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 const ACE_Time_Value *timeout = 0);
};

聽聽聽 浠ヤ笂鐨勭被緇撴瀯鏄畝鍖栫殑錛屼互紿佸嚭閲嶇偣鍔熻兘銆傝瀹屽叏浜嗚В姣忎釜綾伙紝鐪嬫簮浠g爜銆?/p>

walkspeed 2007-02-24 14:15 鍙戣〃璇勮
]]>
ACE_WFMO_Reactor澶氳礬鍒嗛厤涓誨共閮ㄥ垎灝忕粨http://www.shnenglu.com/walkspeed/archive/2007/02/22/18906.htmlwalkspeedwalkspeedThu, 22 Feb 2007 03:46:00 GMThttp://www.shnenglu.com/walkspeed/archive/2007/02/22/18906.htmlhttp://www.shnenglu.com/walkspeed/comments/18906.htmlhttp://www.shnenglu.com/walkspeed/archive/2007/02/22/18906.html#Feedback0http://www.shnenglu.com/walkspeed/comments/commentRss/18906.htmlhttp://www.shnenglu.com/walkspeed/services/trackbacks/18906.html聽聽聽 澶氳礬鍒嗛厤鐨勫叆鍙e嚱鏁癶andle_events錛屽湪妗嗘灦鐨勫疄鐜版帴鍙g被涓畾涔?br />聽聽聽 澶氳礬鍒嗛厤鐨勪富浣撳疄鐜板嚱鏁癳vent_handling,鍦ˋCE_WFMO_Reactor涓畾涔夛紝浼?br />瀹炵幇浠g爜濡備笅
int ACE_WFMO_Reactor::event_handling (ACE_Time_Value *max_wait_time,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int alertable)
{
聽 int result = 0;

聽 do
聽 {
聽聽聽聽聽 //絳夊緟鍦ㄥ彞鏌勯泦涓婂彂鐢熺殑浜嬩歡
聽聽聽聽聽 //wait_for_multiple_events鐨勫叿浣撳疄鐜版槸浣跨敤
聽聽聽聽聽 //WaitForMultipleObjectsEx鍑芥暟
聽聽聽聽聽 DWORD wait_status = this->wait_for_multiple_events (timeout,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 alertable);
聽聽聽聽聽 //鍒嗗彂浜嬩歡
聽聽聽聽聽 result = this->safe_dispatch (wait_status);
聽 }while (result == 0);

聽 return result;
}

聽聽聽 鍒嗗彂鐨勪富浣撳嚱鏁版槸dispatch_handles,鍦ˋCE_WFMO_Reactor涓畾涔夛紝浼疄鐜?br />浠g爜濡備笅
int ACE_WFMO_Reactor::dispatch_handles (DWORD wait_status)
{
聽 DWORD dispatch_slot = 0;

聽 //媧誨姩鐨勫彞鏌勬繪暟
聽 DWORD max_handlep1 = this->handler_rep_.max_handlep1 ();

聽 //鏌ユ壘瑕佸垎鍙戠殑鍙ユ焺鐨勭儲寮?br />聽 for (int number_of_handlers_dispatched = 1;;++number_of_handlers_dispatched)
聽 {
聽聽聽聽聽 //璁$畻鏈変簨浠跺彂鐢燂紝瑕佸垎鍙戠殑鍙ユ焺绱㈠紩
聽聽聽聽聽 dispatch_slot += wait_status - WAIT_OBJECT_0;
聽聽聽聽聽 //鍒嗗彂緇欑浉搴旂殑浜嬩歡澶勭悊瀵硅薄
聽聽聽聽聽 if (this->dispatch_handler (dispatch_slot, max_handlep1) == -1)
聽聽聽聽聽聽聽 return -1;

聽聽聽聽聽 ++dispatch_slot;

聽聽聽聽聽 if (dispatch_slot >= max_handlep1)
聽聽聽聽聽聽聽 return number_of_handlers_dispatched;//鍒嗗彂浜嗗嚑涓簨浠?/p>

聽聽聽聽聽 //媯鏌ュ墿涓嬬殑鍙ユ焺涓湁娌℃湁鏈変簨浠跺彂鐢熺殑
聽聽聽聽聽 wait_status = this->poll_remaining_handles (dispatch_slot);
聽聽聽聽聽 switch (wait_status)
聽聽聽聽聽 {
聽聽聽聽聽聽聽 case WAIT_FAILED: // Failure.
聽聽聽聽聽聽聽聽聽 ACE_OS::set_errno_to_last_error ();
聽聽聽聽聽聽聽聽聽 /* FALLTHRU */
聽聽聽聽聽聽聽 case WAIT_TIMEOUT:
聽聽聽聽聽聽聽聽聽 // There are no more handles ready, we can return.
聽聽聽聽聽聽聽聽聽 return number_of_handlers_dispatched;//鍒嗗彂浜嗗嚑涓簨浠?br />聽聽聽聽聽 }
聽 }
}

聽聽聽 鎵懼埌鍏蜂綋浜嬩歡澶勭悊瀵硅薄涓諱綋鍑芥暟complex_dispatch_hander,鍦ˋCE_WFMO_Reactor
涓畾涔夛紝涓轟唬鐮佸涓?br />int ACE_WFMO_Reactor::complex_dispatch_handler (DWORD slot,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_HANDLE event_handle)
{
聽 //鎵懼埌褰撳墠鐨勫垎鍙戠殑淇℃伅
聽 ACE_WFMO_Reactor_Handler_Repository::Current_Info &current_info =
聽聽聽 this->handler_rep_.current_info ()[slot];

聽 WSANETWORKEVENTS events;
聽 ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;
聽 if (::WSAEnumNetworkEvents ((SOCKET) current_info.io_handle_,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handle,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 &events) == SOCKET_ERROR)
聽聽聽 problems = ACE_Event_Handler::ALL_EVENTS_MASK;
聽 else
聽 {
聽聽聽聽聽 //鍙戠敓鐨勪簨浠朵簬瑕佹嫻嬬殑浜嬩歡鏄惁鐩稿悓錛岀浉鍚屽氨鍒嗗彂
聽聽聽聽聽 events.lNetworkEvents &= current_info.network_events_;
聽聽聽聽聽 while (events.lNetworkEvents != 0)
聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽 ACE_Event_Handler *event_handler = current_info.event_handler_;

聽聽聽聽聽聽聽聽聽 //璋冪敤浜嬩歡澶勭悊瀵硅薄錛岃繘琛屼簨浠跺鐞?br />聽聽聽聽聽聽聽聽聽 problems |= this->upcall (current_info.event_handler_,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 current_info.io_handle_,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 events);

聽聽聽聽聽聽聽聽聽 if (this->handler_rep_.scheduled_for_deletion (slot))
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽 }
聽 }

聽 return 0;
}



walkspeed 2007-02-22 11:46 鍙戣〃璇勮
]]>
ACE_WFMO_Reactor瀵逛簨浠剁殑絳夊緟鍜屽垎鍙戠殑涓諱綋浠g爜鐨勬暣鐞?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/02/22/18904.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Thu, 22 Feb 2007 02:54:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/02/22/18904.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/18904.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/02/22/18904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/18904.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/18904.html</trackback:ping><description><![CDATA[ <p>1<br />int ACE_WFMO_Reactor::handle_events (ACE_Time_Value &how_long)<br />{<br />聽 return this->event_handling (&how_long, FALSE);<br />}</p> <p>2<br />// Waits for and dispatches all events.聽 Returns -1 on error, 0 if<br />// max_wait_time expired, or the number of events that were dispatched.<br />int ACE_WFMO_Reactor::event_handling (ACE_Time_Value *max_wait_time,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 int alertable)<br />{<br />聽 ACE_TRACE ("ACE_WFMO_Reactor::event_handling");</p> <p>聽 // Make sure we are not closed<br />聽 if (!this->open_for_business_ || this->deactivated_)<br />聽聽聽聽聽 return -1;</p> <p>聽 // Stash the current time -- the destructor of this object will<br />聽 // automatically compute how much time elapsed since this method was<br />聽 // called.<br />聽 ACE_Countdown_Time countdown (max_wait_time);</p> <p>聽 int result;<br />聽 <br />聽 do<br />聽 {<br />聽聽聽聽聽 // Check to see if it is ok to enter ::WaitForMultipleObjects<br />聽聽聽聽聽 // This will acquire <this->lock_> on success On failure, the<br />聽聽聽聽聽 // lock will not be acquired<br />聽聽聽聽聽 <br />聽聽聽聽聽 result = this->ok_to_wait (max_wait_time, alertable);<br />聽聽聽聽聽 if (result != 1)<br />聽聽聽聽聽聽聽 return result;</p> <p>聽聽聽聽聽 // Increment the number of active threads<br />聽聽聽聽聽 ++this->active_threads_;</p> <p>聽聽聽聽聽 // Release the <lock_><br />聽聽聽聽聽 this->lock_.release ();</p> <p>聽聽聽聽聽 // Update the countdown to reflect time waiting to play with the<br />聽聽聽聽聽 // mut and event.<br />聽聽聽聽聽 <br />聽聽聽聽聽 countdown.update ();</p> <p>聽聽聽聽聽 // Calculate timeout<br />聽聽聽聽聽 int timeout = this->calculate_timeout (max_wait_time);</p> <p>聽聽聽聽聽 // Wait for event to happen<br />聽聽聽聽聽 DWORD wait_status = this->wait_for_multiple_events (timeout,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 alertable);</p> <p>聽聽聽聽聽 // Upcall<br />聽聽聽聽聽 result = this->safe_dispatch (wait_status);<br />聽聽聽聽聽 if (0 == result)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 // wait_for_multiple_events timed out without dispatching<br />聽聽聽聽聽聽聽聽聽 // anything.聽 Because of rounding and conversion errors and<br />聽聽聽聽聽聽聽聽聽 // such, it could be that the wait loop timed out, but<br />聽聽聽聽聽聽聽聽聽 // the timer queue said it wasn't quite ready to expire a<br />聽聽聽聽聽聽聽聽聽 // timer. In this case, max_wait_time won't have quite been<br />聽聽聽聽聽聽聽聽聽 // reduced to 0, and we need to go around again. If max_wait_time<br />聽聽聽聽聽聽聽聽聽 // is all the way to 0, just return, as the entire time the<br />聽聽聽聽聽聽聽聽聽 // caller wanted to wait has been used up.<br />聽聽聽聽聽聽聽聽聽 countdown.update ();聽聽聽聽 // Reflect time waiting for events<br />聽聽聽聽聽聽聽聽聽 <br />聽聽聽聽聽聽聽聽聽 if (0 == max_wait_time || max_wait_time->usec () == 0)<br />聽聽聽聽聽聽聽聽聽聽聽 break;<br />聽聽聽聽聽 }<br />聽 }while (result == 0);</p> <p>聽 return result;<br />}</p> <p>3<br />int ACE_WFMO_Reactor::safe_dispatch (DWORD wait_status)<br />{<br />聽 int result = -1;<br />聽 ACE_SEH_TRY<br />聽 {<br />聽聽聽聽聽 result = this->dispatch (wait_status);<br />聽 }<br />聽 ACE_SEH_FINALLY<br />聽 {<br />聽聽聽聽聽 this->update_state ();<br />聽 }</p> <p>聽 return result;<br />}</p> <p>4<br />int ACE_WFMO_Reactor::dispatch (DWORD wait_status)<br />{<br />聽 int handlers_dispatched = 0;</p> <p>聽 // Expire timers<br />聽 handlers_dispatched += this->expire_timers ();</p> <p>聽 switch (wait_status)<br />聽 {<br />聽 case WAIT_FAILED: // Failure.<br />聽聽聽聽聽 ACE_OS::set_errno_to_last_error ();<br />聽聽聽聽聽 return -1;</p> <p>聽 case WAIT_TIMEOUT: // Timeout.<br />聽聽聽聽聽 errno = ETIME;<br />聽聽聽聽聽 return handlers_dispatched;</p> <p>聽 default:聽 // Dispatch.<br />聽聽聽聽聽 // We'll let dispatch worry about abandoned mutes.<br />聽聽聽聽聽 handlers_dispatched += this->dispatch_handles (wait_status);<br />聽聽聽聽聽 return handlers_dispatched;<br />聽 }<br />}</p> <p>5<br />// Dispatches any active handles from <handles_[slot]> to<br />// <handles_[max_handlep1_]>, polling through our handle set looking<br />// for active handles.</p> <p>int ACE_WFMO_Reactor::dispatch_handles (DWORD wait_status)<br />{<br />聽 // dispatch_slot is the absolute slot.聽 Only += is used to<br />聽 // increment it.<br />聽 DWORD dispatch_slot = 0;</p> <p>聽 // Cache this value, this is the absolute value.<br />聽 DWORD max_handlep1 = this->handler_rep_.max_handlep1 ();</p> <p>聽 // nCount starts off at <max_handlep1>, this is a transient count of<br />聽 // handles last waited on.<br />聽 DWORD nCount = max_handlep1;</p> <p>聽 for (int number_of_handlers_dispatched = 1;;++number_of_handlers_dispatched)<br />聽 {<br />聽聽聽聽聽 const bool ok = (wait_status >= WAIT_OBJECT_0 && wait_status <= (WAIT_OBJECT_0 + nCount));</p> <p>聽聽聽聽聽 if (ok)<br />聽聽聽聽聽聽聽 dispatch_slot += wait_status - WAIT_OBJECT_0;<br />聽聽聽聽聽 else<br />聽聽聽聽聽聽聽 // Otherwise, a handle was abandoned.<br />聽聽聽聽聽聽聽 dispatch_slot += wait_status - WAIT_ABANDONED_0;</p> <p>聽聽聽聽聽 // Dispatch handler<br />聽聽聽聽聽 if (this->dispatch_handler (dispatch_slot, max_handlep1) == -1)<br />聽聽聽聽聽聽聽 return -1;</p> <p>聽聽聽聽聽 // Increment slot<br />聽聽聽聽聽 ++dispatch_slot;</p> <p>聽聽聽聽聽 // We're done.<br />聽聽聽聽聽 if (dispatch_slot >= max_handlep1)<br />聽聽聽聽聽聽聽 return number_of_handlers_dispatched;</p> <p>聽聽聽聽聽 // Readjust nCount<br />聽聽聽聽聽 nCount = max_handlep1 - dispatch_slot;</p> <p>聽聽聽聽聽 // Check the remaining handles<br />聽聽聽聽聽 wait_status = this->poll_remaining_handles (dispatch_slot);<br />聽聽聽聽聽 switch (wait_status)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽 case WAIT_FAILED: // Failure.<br />聽聽聽聽聽聽聽聽聽 ACE_OS::set_errno_to_last_error ();<br />聽聽聽聽聽聽聽聽聽 /* FALLTHRU */<br />聽聽聽聽聽聽聽 case WAIT_TIMEOUT:<br />聽聽聽聽聽聽聽聽聽 // There are no more handles ready, we can return.<br />聽聽聽聽聽聽聽聽聽 return number_of_handlers_dispatched;<br />聽聽聽聽聽 }<br />聽 }<br />}</p> <p>6<br />int ACE_WFMO_Reactor::dispatch_handler (DWORD slot,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 DWORD max_handlep1)<br />{<br />聽 // Check if there are window messages that need to be dispatched<br />聽 if (slot == max_handlep1)<br />聽聽聽 return this->dispatch_window_messages ();</p> <p>聽 // Dispatch the handler if it has not been scheduled for deletion.<br />聽 // Note that this is a very week test if there are multiple threads<br />聽 // dispatching this slot as no locks are held here. Generally, you<br />聽 // do not want to do something like deleting the this pointer in<br />聽 // handle_close() if you have registered multiple times and there is<br />聽 // more than one thread in WFMO_Reactor->handle_events().<br />聽 else if (!this->handler_rep_.scheduled_for_deletion (slot))<br />聽 {<br />聽聽聽聽聽 ACE_HANDLE event_handle = *(this->handler_rep_.handles () + slot);</p> <p>聽聽聽聽聽 if (this->handler_rep_.current_info ()[slot].io_entry_)<br />聽聽聽聽聽聽聽 return this->complex_dispatch_handler (slot,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handle);<br />聽聽聽聽聽 else<br />聽聽聽聽聽聽聽 return this->simple_dispatch_handler (slot,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handle);<br />聽 }<br />聽 else<br />聽聽聽 // The handle was scheduled for deletion, so we will skip it.<br />聽聽聽 return 0;<br />}</p> <p>7<br />int ACE_WFMO_Reactor::complex_dispatch_handler (DWORD slot,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_HANDLE event_handle)<br />{<br />聽 // This dispatch is used for I/O entires.</p> <p>聽 ACE_WFMO_Reactor_Handler_Repository::Current_Info &current_info =<br />聽聽聽 this->handler_rep_.current_info ()[slot];</p> <p>聽 WSANETWORKEVENTS events;<br />聽 ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;<br />聽 if (::WSAEnumNetworkEvents ((SOCKET) current_info.io_handle_,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handle,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 &events) == SOCKET_ERROR)<br />聽聽聽 problems = ACE_Event_Handler::ALL_EVENTS_MASK;<br />聽 else<br />聽 {<br />聽聽聽聽聽 // Prepare for upcalls. Clear the bits from <events> representing<br />聽聽聽聽聽 // events the handler is not interested in. If there are any left,<br />聽聽聽聽聽 // do the upcall(s). upcall will replace events.lNetworkEvents<br />聽聽聽聽聽 // with bits representing any functions that requested a repeat<br />聽聽聽聽聽 // callback before checking handles again. In this case, continue<br />聽聽聽聽聽 // to call back unless the handler is unregistered as a result of<br />聽聽聽聽聽 // one of the upcalls. The way this is written, the upcalls will<br />聽聽聽聽聽 // keep being done even if one or more upcalls reported problems.<br />聽聽聽聽聽 // In practice this may turn out not so good, but let's see. If any<br />聽聽聽聽聽 // problems, please notify Steve Huston <<a href="mailto:shuston@riverace.com">shuston@riverace.com</a>><br />聽聽聽聽聽 // before or after you change this code.<br />聽聽聽聽聽 events.lNetworkEvents &= current_info.network_events_;<br />聽聽聽聽聽 while (events.lNetworkEvents != 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_Event_Handler *event_handler = current_info.event_handler_;</p> <p>聽聽聽聽聽聽聽聽聽 int reference_counting_required =<br />聽聽聽聽聽聽聽聽聽聽聽 event_handler->reference_counting_policy ().value () ==<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_Event_Handler::Reference_Counting_Policy::ENABLED;</p> <p>聽聽聽聽聽聽聽聽聽 // Call add_reference() if needed.<br />聽聽聽聽聽聽聽聽聽 if (reference_counting_required)<br />聽聽聽聽聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handler->add_reference ();<br />聽聽聽聽聽聽聽聽聽 }</p> <p>聽聽聽聽聽聽聽聽聽 // Upcall<br />聽聽聽聽聽聽聽聽聽 problems |= this->upcall (current_info.event_handler_,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 current_info.io_handle_,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 events);</p> <p>聽聽聽聽聽聽聽聽聽 // Call remove_reference() if needed.<br />聽聽聽聽聽聽聽聽聽 if (reference_counting_required)<br />聽聽聽聽聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 event_handler->remove_reference ();<br />聽聽聽聽聽聽聽聽聽 }</p> <p>聽聽聽聽聽聽聽聽聽 if (this->handler_rep_.scheduled_for_deletion (slot))<br />聽聽聽聽聽聽聽聽聽聽聽 break;<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (problems != ACE_Event_Handler::NULL_MASK<br />聽聽聽聽聽 && !this->handler_rep_.scheduled_for_deletion (slot)聽 )<br />聽聽聽 this->handler_rep_.unbind (event_handle, problems);</p> <p>聽 return 0;<br />}</p> <p>8<br />ACE_Reactor_Mask ACE_WFMO_Reactor::upcall (ACE_Event_Handler *event_handler,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_HANDLE io_handle,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 WSANETWORKEVENTS &events)<br />{<br />聽 // This method figures out what exactly has happened to the socket<br />聽 // and then calls appropriate methods.<br />聽 ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;</p> <p>聽 // Go through the events and do the indicated upcalls. If the handler<br />聽 // doesn't want to be called back, clear the bit for that event.<br />聽 // At the end, set the bits back to <events> to request a repeat call.</p> <p>聽 long actual_events = events.lNetworkEvents;<br />聽 int action;</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_WRITE))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_output (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_WRITE);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::WRITE_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_CONNECT))<br />聽 {<br />聽聽聽聽聽 if (events.iErrorCode[FD_CONNECT_BIT] == 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 // Successful connect<br />聽聽聽聽聽聽聽聽聽 action = event_handler->handle_output (io_handle);<br />聽聽聽聽聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_CONNECT);<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::CONNECT_MASK);<br />聽聽聽聽聽聽聽聽聽 }<br />聽聽聽聽聽 }<br />聽聽聽聽聽 // Unsuccessful connect<br />聽聽聽聽聽 else<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 action = event_handler->handle_input (io_handle);<br />聽聽聽聽聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_CONNECT);<br />聽聽聽聽聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::CONNECT_MASK);<br />聽聽聽聽聽聽聽聽聽 }<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_OOB))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_exception (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_OOB);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::EXCEPT_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_READ))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_input (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_READ);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::READ_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_CLOSE)<br />聽聽聽聽聽 && ACE_BIT_DISABLED (problems, ACE_Event_Handler::READ_MASK))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_input (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_CLOSE);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::READ_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_ACCEPT))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_input (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_ACCEPT);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::ACCEPT_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_QOS))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_qos (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_QOS);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::QOS_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 if (ACE_BIT_ENABLED (actual_events, FD_GROUP_QOS))<br />聽 {<br />聽聽聽聽聽 action = event_handler->handle_group_qos (io_handle);<br />聽聽聽聽聽 if (action <= 0)<br />聽聽聽聽聽 {<br />聽聽聽聽聽聽聽聽聽 ACE_CLR_BITS (actual_events, FD_GROUP_QOS);<br />聽聽聽聽聽聽聽聽聽 if (action == -1)<br />聽聽聽聽聽聽聽聽聽聽聽 ACE_SET_BITS (problems, ACE_Event_Handler::GROUP_QOS_MASK);<br />聽聽聽聽聽 }<br />聽 }</p> <p>聽 events.lNetworkEvents = actual_events;<br />聽 return problems;<br />}</p> <img src ="http://www.shnenglu.com/walkspeed/aggbug/18904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-02-22 10:54 <a href="http://www.shnenglu.com/walkspeed/archive/2007/02/22/18904.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ACE妗嗘灦鐨勪笁澶ч儴鍒?/title><link>http://www.shnenglu.com/walkspeed/archive/2007/02/20/18876.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 20 Feb 2007 04:28:00 GMT</pubDate><guid>http://www.shnenglu.com/walkspeed/archive/2007/02/20/18876.html</guid><wfw:comment>http://www.shnenglu.com/walkspeed/comments/18876.html</wfw:comment><comments>http://www.shnenglu.com/walkspeed/archive/2007/02/20/18876.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/walkspeed/comments/commentRss/18876.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/walkspeed/services/trackbacks/18876.html</trackback:ping><description><![CDATA[聽聽聽聽聽聽聽 ACE榪欎釜寮婧愰」鐩殑浠g爜鐨勯噺鏄緢澶х殑銆傚浜庣郴緇熺紪紼嬨佺綉緇滅紪紼嬫槸闈炲父鐨勬湁鐢紝浣嗘槸瀵瑰叾浠嬬粛鐨勪功鍜岃祫鏂欐槸闈炲父鐨勫皯銆傝鎯充簡瑙e拰寰堝ソ鐨勪嬌鐢紝灝卞繀欏昏鑷繁鍘葷湅婧愪唬鐮佷簡銆傦紙濂藉湪榪樻湁涓夋湰涔︼紝搴撲腑鐨勪簨渚嬭繕鏄瘮杈冪殑澶氾級<br />聽聽聽聽聽聽聽 ACE搴撲腑鐨勪唬鐮佸ぇ浣撳彲浠ュ垎涓轟笁澶ч儴鍒?br />聽聽聽聽聽聽聽 1聽 OS Adaptation錛堟搷浣滅郴緇熼傞厤錛夐儴鍒嗐傝繖閮ㄥ垎涓昏鏄睆钄藉悇鎿嶄綔緋葷粺鐨凙PI鐨勪笉鍚岋紝灝嗙郴緇熻皟鐢ㄦ帴鍙g粺涓鍒癈錛嬶紜鍑芥暟鐨勬帴鍙o紝浠ュ疄鐜板鉤鍙扮殑鍙Щ妞嶃?br />聽聽聽聽聽聽聽 2聽 C++ Wrapper Facade錛圕++澶栧寘錛夐儴鍒嗐傝繖閮ㄥ垎涓昏鏄皢鐩鎬簰鍏寵仈鐨勬搷浣滃拰鏁版嵁緇撴瀯灝佽鍒癈++綾諱腑錛屾彁渚涚粺涓鐨勬帴鍙c傛彁渚涘己綾誨瀷鐨勬嫻嬶紝闄嶄綆涓嶅繀瑕佺殑璁や負閿欒銆傚埄鐢–++澶氭併佺戶鎵跨瓑鑳藉姏錛屽艦鎴愪竴涓灦鏋勶紝浣挎湰鍦扮殑銆佽繙绔殑鎿嶄綔緇熶竴鍦ㄤ竴涓浉鍚屾帴鍙e拰浣跨敤絳栫暐涓嬨?br />聽聽聽聽聽聽聽 3聽 Framework錛堟鏋訛級閮ㄥ垎銆備負涓緇勭浉鍏崇殑搴旂敤鎻愪緵鍙鐢ㄧ殑鏋舵瀯銆傚紑鍙戣呭湪紜畾浜嗗簲鐢ㄥ悗錛岄夋嫨鍙敤鐨勬灦鏋勫紑鍙戝簲鐢ㄧ▼搴忥紝涓嶇敤鑰冭檻騫沖彴鍜屽簳灞傛満鍒躲傚揩閫熺殑寮鍙戙?br />聽聽聽聽聽聽聽 絎竴閮ㄥ垎闈㈠澶ч噺鐨勫簳灞傜殑緇嗚妭錛岃屼笖鐩爣鏄鉤鍙扮殑縐繪錛屽鏋滃騫沖彴鐨勭Щ妞嶆劅鍏磋叮鐨勫厔寮熷濡瑰彲浠ョ湅鐪嬨備竴鑸儏鍐典笅娌′粈涔堢湅鐨勫繀瑕併?br />聽聽聽聽聽聽聽 絎簩閮ㄥ垎鍜岀涓夐儴鍒嗗鎴戜滑鐨勫簲鐢ㄥ拰瀛︿範濡備綍鍒╃敤C++鏉ヨ璁$▼搴忛潪甯哥殑鏈変環鍊鹼紝瑕佸鐪嬨傜粏蹇冩彛鎽╋紝鐗瑰埆鏄厤涓婅璁$殑闂錛堝畯瑙傜殑鍜屽井瑙傜殑錛夈?img src ="http://www.shnenglu.com/walkspeed/aggbug/18876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/walkspeed/" target="_blank">walkspeed</a> 2007-02-20 12:28 <a href="http://www.shnenglu.com/walkspeed/archive/2007/02/20/18876.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://www.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://taotuango.com" target="_blank">在线观看久久av</a>| <a href="http://4534com.com" target="_blank">老色批av在线精品</a>| <a href="http://221080.com" target="_blank">国产精品乱码</a>| <a href="http://176sfsf.com" target="_blank">亚洲视频一区二区</a>| <a href="http://337105.com" target="_blank">一本久道久久综合中文字幕</a>| <a href="http://060607.com" target="_blank">你懂的国产精品</a>| <a href="http://www17727.com" target="_blank">亚洲人成欧美中文字幕</a>| <a href="http://actskynet.com" target="_blank">亚洲国产精品久久久久婷婷884</a>| <a href="http://2ejj.com" target="_blank">午夜精品一区二区三区在线视</a>| <a href="http://yw9677.com" target="_blank">国产精品久久久久一区二区</a>| <a href="http://096577.com" target="_blank">午夜精品区一区二区三</a>| <a href="http://4008305555.com" target="_blank">午夜精品久久</a>| <a href="http://400206.com" target="_blank">一区二区三区在线视频播放</a>| <a href="http://jav1111.com" target="_blank">欧美激情成人在线</a>| <a href="http://www33444.com" target="_blank">欧美精品日韩一区</a>| <a href="http://609005.com" target="_blank">欧美亚洲在线</a>| <a href="http://dtwave-ind.com" target="_blank">久久午夜羞羞影院免费观看</a>| <a href="http://by5130.com" target="_blank">亚洲美女福利视频网站</a>| <a href="http://343119.com" target="_blank">亚洲午夜精品久久</a>| <a href="http://aidingcai.com" target="_blank">黄色一区二区三区</a>| <a href="http://1397h.com" target="_blank">亚洲精品一区在线</a>| <a href="http://97seee.com" target="_blank">国产午夜精品视频</a>| <a href="http://www49966.com" target="_blank">亚洲激情一区二区三区</a>| <a href="http://4446666.com" target="_blank">国产精品激情电影</a>| <a href="http://xinghejiuye.com" target="_blank">狂野欧美一区</a>| <a href="http://580078.com" target="_blank">国产精品久久久999</a>| <a href="http://354eee.com" target="_blank">久久亚洲综合色</a>| <a href="http://caerusmdx.com" target="_blank">欧美日韩精品综合</a>| <a href="http://707377c.com" target="_blank">久久免费观看视频</a>| <a href="http://www-333304.com" target="_blank">欧美色区777第一页</a>| <a href="http://www456456.com" target="_blank">久久艳片www.17c.com</a>| <a href="http://www-23918.com" target="_blank">欧美喷水视频</a>| <a href="http://iotbzw.com" target="_blank">另类尿喷潮videofree</a>| <a href="http://l5076.com" target="_blank">欧美吻胸吃奶大尺度电影</a>| <a href="http://aass123.com" target="_blank">久久免费的精品国产v∧</a>| <a href="http://by3787.com" target="_blank">欧美色大人视频</a>| <a href="http://wwwmm131.com" target="_blank">欧美国产欧美亚州国产日韩mv天天看完整</a>| <a href="http://ykk7.com" target="_blank">欧美日韩国产首页</a>| <a href="http://aiqianfang.com" target="_blank">美女日韩在线中文字幕</a>| <a href="http://caokk1.com" target="_blank">国产精品久久久久久影视</a>| <a href="http://507139.com" target="_blank">欧美aa国产视频</a>| <a href="http://788111c.com" target="_blank">亚洲精品久久久久久久久久久久久</a>| <a href="http://0070571.com" target="_blank">国产精品乱码人人做人人爱</a>| <a href="http://tom3958.com" target="_blank">欧美激情黄色片</a>| <a href="http://hafenchen.com" target="_blank">国内外成人在线</a>| <a href="http://avtbr123.com" target="_blank">一区二区av</a>| <a href="http://qiaoka526.com" target="_blank">亚洲麻豆av</a>| <a href="http://fobdoer.com" target="_blank">老司机精品视频一区二区三区</a>| <a href="http://www72227.com" target="_blank">欧美一区二区三区精品</a>| <a href="http://1515t.com" target="_blank">欧美日韩成人综合天天影院</a>| <a href="http://qqszdq.com" target="_blank">免费在线看一区</a>| <a href="http://scratbag.com" target="_blank">国产在线视频欧美</a>| <a href="http://8x588.com" target="_blank">亚洲欧美综合网</a>| <a href="http://312012.com" target="_blank">性欧美精品高清</a>| <a href="http://18av-2.com" target="_blank">欧美午夜在线视频</a>| <a href="http://v58q.com" target="_blank">夜夜嗨av色一区二区不卡</a>| <a href="http://boocnn.com" target="_blank">亚洲国产精品一区二区尤物区 </a>| <a href="http://lyminghang.com" target="_blank">久久偷窥视频</a>| <a href="http://495177.com" target="_blank">国产午夜精品久久久久久久</a>| <a href="http://3644688.com" target="_blank">日韩视频免费大全中文字幕</a>| <a href="http://xianjiacf.com" target="_blank">亚洲日本黄色</a>| <a href="http://xhs015.com" target="_blank">免费在线观看精品</a>| <a href="http://kkwwxx.com" target="_blank">欧美国产视频在线</a>| <a href="http://9uu91.com" target="_blank">亚洲国产专区</a>| <a href="http://59199m.com" target="_blank">欧美高清视频一区</a>| <a href="http://www-n77.com" target="_blank">91久久久久久国产精品</a>| <a href="http://340996.com" target="_blank">亚洲精品一区在线</a>| <a href="http://52wenxiu.com" target="_blank">欧美精品1区2区</a>| <a href="http://qdzhudai.com" target="_blank">亚洲精品久久久久久下一站 </a>| <a href="http://22400com.com" target="_blank">欧美日韩成人在线播放</a>| <a href="http://www-438686.com" target="_blank">亚洲精品久久久蜜桃</a>| <a href="http://duoying668.com" target="_blank">日韩视频精品在线</a>| <a href="http://xvideoav99.com" target="_blank">欧美大片在线看免费观看</a>| <a href="http://fxsdcj.com" target="_blank">亚洲国产精品精华液网站</a>| <a href="http://xxdd51.com" target="_blank">最新日韩精品</a>| <a href="http://9niuw.com" target="_blank">欧美日韩在线高清</a>| <a href="http://155fck.com" target="_blank">亚洲小视频在线观看</a>| <a href="http://wzlingfeng.com" target="_blank">欧美一级久久久</a>| <a href="http://www-4890.com" target="_blank">国产在线精品二区</a>| <a href="http://dh03.com" target="_blank">久久久久久久性</a>| <a href="http://9797690.com" target="_blank">亚洲大胆视频</a>| <a href="http://xhs015.com" target="_blank">亚洲深夜影院</a>| <a href="http://660507ww.com" target="_blank">国产日韩欧美成人</a>| <a href="http://fanwenok.com" target="_blank">久久美女性网</a>| <a href="http://7777731.com" target="_blank">亚洲激情国产</a>| <a href="http://xw4433.com" target="_blank">午夜精品成人在线</a>| <a href="http://227c7.com" target="_blank">精品成人a区在线观看</a>| <a href="http://hjaa7.com" target="_blank">免费黄网站欧美</a>| <a href="http://poqsoft.com" target="_blank">99riav国产精品</a>| <a href="http://budanbao.com" target="_blank">久久精品国产亚洲一区二区</a>| <a href="http://mmpzyw.com" target="_blank">尤妮丝一区二区裸体视频</a>| <a href="http://heshundadi.com" target="_blank">欧美国产乱视频</a>| <a href="http://ddh345.com" target="_blank">亚洲视频www</a>| <a href="http://ccc982.com" target="_blank">美女久久网站</a>| <a href="http://488089.com" target="_blank">一级日韩一区在线观看</a>| <a href="http://caosee.com" target="_blank">国产欧美va欧美va香蕉在</a>| <a href="http://082235.com" target="_blank">久久精品国内一区二区三区</a>| <a href="http://99chiji1.com" target="_blank">亚洲国产精品久久久久久女王</a>| <a href="http://kongtou8.com" target="_blank">在线综合欧美</a>| <a href="http://4438x28.com" target="_blank">黑人操亚洲美女惩罚</a>| <a href="http://041935.com" target="_blank">欧美激情综合五月色丁香</a>| <a href="http://www-136hk.com" target="_blank">亚洲图片欧洲图片日韩av</a>| <a href="http://cnxwlm.com" target="_blank">久久综合一区</a>| <a href="http://xwsj2020.com" target="_blank">亚洲伊人久久综合</a>| <a href="http://域名" target="_blank">亚洲国产精品va在线看黑人动漫</a>| <a href="http://xshgwy.com" target="_blank">欧美日本不卡高清</a>| <a href="http://shanghaijiagu.com" target="_blank">欧美在线观看网址综合</a>| <a href="http://9113c.com" target="_blank">亚洲欧洲在线免费</a>| <a href="http://submro.com" target="_blank">一区视频在线播放</a>| <a href="http://submro.com" target="_blank">国产精品国产三级国产aⅴ入口</a>| <a href="http://261262.com" target="_blank">校园春色综合网</a>| <a href="http://www330088.com" target="_blank">亚洲日本一区二区三区</a>| <a href="http://www033459.com" target="_blank">久久不射网站</a>| <a href="http://roujizz.com" target="_blank">亚洲天堂男人</a>| <a href="http://67idid.com" target="_blank">91久久精品www人人做人人爽</a>| <a href="http://leohacks.com" target="_blank">国产精品久久久对白</a>| <a href="http://337795.com" target="_blank">欧美激情一区三区</a>| <a href="http://53xxxx.com" target="_blank">久久久久一区二区三区四区</a>| <a href="http://www123720a.com" target="_blank">99成人精品</a>| <a href="http://tk99444.com" target="_blank">91久久精品美女高潮</a>| <a href="http://777777hb.com" target="_blank">久久久亚洲欧洲日产国码αv</a>| <a href="http://4c7175.com" target="_blank">制服丝袜激情欧洲亚洲</a>| <a href="http://995688.com" target="_blank">亚洲大胆av</a>| <a href="http://www49797.com" target="_blank">国产一区观看</a>| <a href="http://4hup23.com" target="_blank">国产毛片精品视频</a>| <a href="http://csmdjs.com" target="_blank">欧美午夜www高清视频</a>| <a href="http://yw9677.com" target="_blank">欧美88av</a>| <a href="http://499305.com" target="_blank">麻豆国产精品一区二区三区</a>| <a href="http://域名" target="_blank">欧美尤物巨大精品爽</a>| <a href="http://62san.com" target="_blank">亚洲免费婷婷</a>| <a href="http://by5263.com" target="_blank">一区二区三区免费网站</a>| <a href="http://fuwu56.com" target="_blank">亚洲精品视频在线</a>| <a href="http://qkspvip.com" target="_blank">亚洲国产精品久久久久婷婷老年 </a>| <a href="http://by99969.com" target="_blank">欧美.日韩.国产.一区.二区</a>| <a href="http://333666333.com" target="_blank">欧美在线欧美在线</a>| <a href="http://099553.com" target="_blank">欧美亚洲视频在线观看</a>| <a href="http://korean-edu.com" target="_blank">一区二区三区日韩</a>| <a href="http://677cn.com" target="_blank">亚洲视频网在线直播</a>| <a href="http://136066.com" target="_blank">亚洲精选大片</a>| <a href="http://jnhrjixie.com" target="_blank">亚洲久久成人</a>| <a href="http://xingmaipet.com" target="_blank">亚洲精品在线三区</a>| <a href="http://gs-qintai.com" target="_blank">亚洲美女区一区</a>| <a href="http://2061375.com" target="_blank">日韩亚洲欧美中文三级</a>| <a href="http://495177.com" target="_blank">亚洲精品视频免费</a>| <a href="http://480192.com" target="_blank">日韩视频精品</a>| <a href="http://www-11688.com" target="_blank">亚洲线精品一区二区三区八戒</a>| <a href="http://www0505nn.com" target="_blank">亚洲精品美女91</a>| <a href="http://lymzdd.com" target="_blank">aa级大片欧美三级</a>| <a href="http://www901aaa.com" target="_blank">一区二区三区毛片</a>| <a href="http://jzsp94.com" target="_blank">亚洲欧美在线免费观看</a>| <a href="http://jx963.com" target="_blank">新67194成人永久网站</a>| <a href="http://0061366.com" target="_blank">欧美伊人久久大香线蕉综合69</a>| <a href="http://wwwavzz.com" target="_blank">亚洲欧美在线一区二区</a>| <a href="http://70909g.com" target="_blank">久久超碰97人人做人人爱</a>| <a href="http://bckxy.com" target="_blank">久久九九免费</a>| <a href="http://www-ss777.com" target="_blank">老牛嫩草一区二区三区日本</a>| <a href="http://seqingdao.com" target="_blank">裸体一区二区三区</a>| <a href="http://bjjxgcsxy.com" target="_blank">欧美精品七区</a>| <a href="http://5101h.com" target="_blank">国产精品久久久亚洲一区</a>| <a href="http://tsjcmm.com" target="_blank">国产精品尤物</a>| <a href="http://yzstbjt.com" target="_blank">激情成人综合网</a>| <a href="http://099553.com" target="_blank">日韩视频在线观看国产</a>| <a href="http://www90aaa.com" target="_blank">亚洲性视频网站</a>| <a href="http://www19898.com" target="_blank">久久av免费一区</a>| <a href="http://13751144594.com" target="_blank">美女日韩欧美</a>| <a href="http://by99969.com" target="_blank">aaa亚洲精品一二三区</a>| <a href="http://kissgz.com" target="_blank">欧美一区二区三区免费看</a>| <a href="http://107766a.com" target="_blank">久久精品国产清自在天天线</a>| <a href="http://477980.com" target="_blank">美女被久久久</a>| <a href="http://www-232323.com" target="_blank">欧美三级乱码</a>| <a href="http://o10669.com" target="_blank">国内揄拍国内精品久久</a>| <a href="http://www5123ri.com" target="_blank">亚洲二区在线</a>| <a href="http://zhijiasd.com" target="_blank">亚洲一区在线直播</a>| <a href="http://qiansemf.com" target="_blank">美女爽到呻吟久久久久</a>| <a href="http://s3yx.com" target="_blank">亚洲精品中文字</a>| <a href="http://77427xyz.com" target="_blank">欧美与黑人午夜性猛交久久久</a>| <a href="http://649929.com" target="_blank">久久日韩粉嫩一区二区三区</a>| <a href="http://ynzhuoyi.com" target="_blank">欧美人妖另类</a>| <a href="http://wanzhixue.com" target="_blank">国内精品写真在线观看</a>| <a href="http://www-787333.com" target="_blank">亚洲免费福利视频</a>| <a href="http://340996.com" target="_blank">欧美专区亚洲专区</a>| <a href="http://ww4477.com" target="_blank">91久久香蕉国产日韩欧美9色</a>| <a href="http://400206.com" target="_blank">一区二区三区欧美日韩</a>| <a href="http://392294.com" target="_blank">久久免费偷拍视频</a>| <a href="http://www11111111.com" target="_blank">欧美日韩一区二区视频在线观看</a>| <a href="http://430390.com" target="_blank">亚洲国产一区二区视频</a>| <a href="http://888nei.com" target="_blank">午夜精彩国产免费不卡不顿大片</a>| <a href="http://www-401313.com" target="_blank">久久久久久午夜</a>| <a href="http://cnbluebox.com" target="_blank">亚洲精品欧洲</a>| <a href="http://cao3e8c8.com" target="_blank">乱中年女人伦av一区二区</a>| <a href="http://488918.com" target="_blank">国产精品成人久久久久</a>| <a href="http://dracotek.com" target="_blank">亚洲第一毛片</a>| <a href="http://p35cc.com" target="_blank">久久精品国产77777蜜臀</a>| <a href="http://97seee.com" target="_blank">亚洲激情在线视频</a>| <a href="http://www284tv.com" target="_blank">欧美在线视频导航</a>| <a href="http://bocfdj.com" target="_blank">国产精品每日更新</a>| <a href="http://www94816.com" target="_blank">亚洲精品综合</a>| <a href="http://wwwzmcc1.com" target="_blank">欧美1区2区</a>| <a href="http://540669.com" target="_blank">欧美亚洲三区</a>| <a href="http://287975.com" target="_blank">国产欧美一区二区三区久久人妖</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>