锘??xml version="1.0" encoding="utf-8" standalone="yes"?>老司机成人在线视频,亚洲国产成人久久综合一区,国产精品网站在线 http://m.shnenglu.com/API/category/16122.htmlzh-cn Tue, 12 Dec 2017 03:06:12 GMT Tue, 12 Dec 2017 03:06:12 GMT 60 濂楁帴瀛梤ead/write榪斿洖鍊?/title> http://m.shnenglu.com/API/archive/2017/12/12/215420.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Tue, 12 Dec 2017 02:32:00 GMT http://m.shnenglu.com/API/archive/2017/12/12/215420.html http://m.shnenglu.com/API/comments/215420.html http://m.shnenglu.com/API/archive/2017/12/12/215420.html#Feedback 0 http://m.shnenglu.com/API/comments/commentRss/215420.html http://m.shnenglu.com/API/services/trackbacks/215420.html 1銆侀樆濉炴ā寮忎笌闈為樆濉炴ā寮忎笅recv鐨勮繑鍥炲煎悇浠h〃浠涔堟剰鎬濓紵鏈夋病鏈夊尯鍒紵錛堝氨鎴戠洰鍓嶄簡瑙i樆濉炰笌闈為樆濉瀝ecv榪斿洖鍊兼病鏈夊尯鍒嗭紝閮芥槸 <0錛氬嚭閿欙紝=0錛氳繛鎺ュ叧闂紝>0鎺ユ敹鍒版暟鎹ぇ灝忥紝鐗瑰埆錛氳繑鍥炲?nbsp;<0鏃跺茍涓?errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)鐨勬儏鍐典笅璁や負榪炴帴鏄甯哥殑錛岀戶緇帴鏀躲傚彧鏄樆濉炴ā寮忎笅recv浼氶樆濉炵潃鎺ユ敹鏁版嵁錛岄潪闃誨妯″紡涓嬪鏋滄病鏈夋暟鎹細榪斿洖錛屼笉浼氶樆濉炵潃璇伙紝鍥犳闇瑕?nbsp;寰幆璇誨彇
2銆侀樆濉炴ā寮忎笌闈為樆濉炴ā寮忎笅write鐨勮繑鍥炲煎悇浠h〃浠涔堟剰鎬濓紵鏈夋病鏈夊尯鍒紵
闃誨涓庨潪闃誨write榪斿洖鍊兼病鏈夊尯鍒嗭紝閮芥槸 <0錛氬嚭閿欙紝=0錛氳繛鎺ュ叧闂紝>0鍙戦佹暟鎹ぇ灝忥紝鐗瑰埆錛氳繑鍥炲?nbsp;<0鏃跺茍涓?errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)鐨勬儏鍐典笅璁や負榪炴帴鏄甯哥殑錛岀戶緇彂閫併傚彧鏄樆濉炴ā寮忎笅write浼氶樆濉炵潃鍙戦佹暟鎹紝闈為樆濉炴ā寮忎笅濡傛灉鏆傛椂鏃犳硶鍙戦佹暟鎹細榪斿洖錛屼笉浼氶樆濉炵潃 write錛屽洜姝ら渶瑕佸驚鐜彂閫?/p>
3銆侀樆濉炴ā寮忎笅read榪斿洖鍊?nbsp;< 0 && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN鏃訛紝榪炴帴寮傚父錛岄渶瑕佸叧闂紝read榪斿洖鍊?nbsp;< 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)鏃惰〃紺烘病鏈夋暟鎹紝闇瑕佺戶緇帴鏀訛紝濡傛灉榪斿洖鍊煎ぇ浜?琛ㄧず鎺ラ佸埌鏁版嵁銆?nbsp;
闈為樆濉炴ā寮忎笅read榪斿洖鍊?nbsp;< 0琛ㄧず娌℃湁鏁版嵁錛? 0琛ㄧず榪炴帴鏂紑錛?gt; 0琛ㄧず鎺ユ敹鍒版暟鎹?nbsp;
榪?縐嶆ā寮忎笅鐨勮繑鍥炲兼槸涓嶆槸榪欎箞鐞嗚В錛屾湁娌℃湁璺熻緇嗙殑鐞嗚В鎴栬窡鍑嗙‘鐨勮鏄庯紵
4銆侀樆濉炴ā寮忎笌闈為樆濉炴ā寮忎笅鏄惁send榪斿洖鍊?nbsp;< 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)琛ㄧず鏆傛椂鍙戦佸け璐ワ紝闇瑕侀噸璇曪紝濡傛灉send榪斿洖鍊?nbsp;<= 0, && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN鏃訛紝榪炴帴寮傚父錛岄渶瑕佸叧闂紝濡傛灉send榪斿洖鍊?nbsp;> 0鍒欒〃紺哄彂閫佷簡鏁版嵁錛焥end鐨勮繑鍥炲兼槸鍚﹁繖涔堢悊瑙o紝闃誨妯″紡涓庨潪闃誨妯″紡涓媠end榪斿洖鍊?0鏄惁閮芥槸鍙戦佸け璐ワ紝榪樻槸閭d釜妯″紡涓嬭〃紺烘殏鏃朵笉鍙彂閫侊紝闇瑕?nbsp;閲嶅彂錛?/p>
1. send鍑芥暟
int send( SOCKET s, const char FAR *buf, int len, int flags );
涓嶈鏄鎴風榪樻槸鏈嶅姟鍣ㄧ搴旂敤紼嬪簭閮界敤send鍑芥暟鏉ュ悜TCP榪炴帴鐨勫彟涓绔彂閫佹暟鎹?/p>
瀹㈡埛绔▼搴忎竴鑸敤send鍑芥暟鍚戞湇鍔″櫒鍙戦佽姹傦紝鑰屾湇鍔″櫒鍒欓氬父鐢╯end鍑芥暟鏉ュ悜瀹㈡埛紼嬪簭鍙戦佸簲絳斻?/p>
璇ュ嚱鏁扮殑錛?/p>
絎竴涓弬鏁版寚瀹氬彂閫佺濂楁帴瀛楁弿榪扮錛?/p>
絎簩涓弬鏁版寚鏄庝竴涓瓨鏀懼簲鐢ㄧ▼搴忚鍙戦佹暟鎹殑緙撳啿鍖猴紱
絎笁涓弬鏁版寚鏄庡疄闄呰鍙戦佺殑鏁版嵁鐨勫瓧鑺傛暟錛?/p>
絎洓涓弬鏁頒竴鑸疆0銆?/p>
榪欓噷鍙弿榪板悓姝ocket鐨剆end鍑芥暟鐨勬墽琛屾祦紼嬨傚綋璋冪敤璇ュ嚱鏁版椂錛宻end鍏堟瘮杈冨緟鍙戦佹暟鎹殑闀垮害len鍜屽鎺ュ瓧s鐨勫彂閫佺紦鍐茬殑闀垮害錛屽鏋渓en澶т簬s鐨勫彂閫佺紦鍐插尯鐨勯暱搴︼紝璇ュ嚱鏁拌繑鍥濻OCKET_ERROR錛涘鏋渓en灝忎簬鎴栬呯瓑浜巗鐨勫彂閫佺紦鍐插尯鐨勯暱搴︼紝閭d箞send鍏堟鏌ュ崗璁?nbsp;鏄惁姝e湪鍙戦乻鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹紝濡傛灉鏄氨絳夊緟鍗忚鎶婃暟鎹彂閫佸畬錛屽鏋滃崗璁繕娌℃湁寮濮嬪彂閫乻鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹垨鑰卻鐨勫彂閫佺紦鍐蹭腑娌℃湁鏁版嵁錛岄偅涔?nbsp;send灝辨瘮杈僺鐨勫彂閫佺紦鍐插尯鐨勫墿浣欑┖闂村拰len錛屽鏋渓en澶т簬鍓╀綑絀洪棿澶у皬send灝變竴鐩寸瓑寰呭崗璁妸s鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹彂閫佸畬錛屽鏋渓en灝忎簬鍓╀綑 絀洪棿澶у皬send灝變粎浠呮妸buf涓殑鏁版嵁copy鍒板墿浣欑┖闂撮噷錛?span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #000000;">娉ㄦ剰騫朵笉鏄痵end鎶妔鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹紶鍒拌繛鎺ョ殑鍙︿竴绔殑錛岃屾槸鍗忚浼犵殑錛宻end浠呬粎鏄妸buf涓殑鏁版嵁copy鍒皊鐨勫彂閫佺紦鍐插尯鐨勫墿浣欑┖闂撮噷錛夈?/span>濡傛灉send鍑芥暟copy鏁版嵁鎴愬姛錛屽氨榪斿洖瀹為檯copy鐨勫瓧鑺傛暟錛屽鏋渟end鍦╟opy鏁版嵁鏃跺嚭鐜伴敊璇紝閭d箞send灝辮繑鍥濻OCKET_ERROR錛涘鏋渟end鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岄偅涔坰end鍑芥暟涔熻繑鍥濻OCKET_ERROR銆?/p>瑕佹敞鎰弒end 鍑芥暟鎶奲uf涓殑鏁版嵁鎴愬姛copy鍒皊鐨勫彂閫佺紦鍐茬殑鍓╀綑絀洪棿閲屽悗瀹冨氨榪斿洖浜嗭紝浣嗘槸姝ゆ椂榪欎簺鏁版嵁騫朵笉涓瀹氶┈涓婅浼犲埌榪炴帴鐨勫彟涓绔?span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #000000;">銆?/span>濡傛灉鍗忚鍦ㄥ悗緇殑浼犻佽繃紼嬩腑鍑虹幇緗戠粶閿欒鐨勮瘽錛岄偅涔堜笅涓涓猄ocket鍑芥暟灝變細榪斿洖SOCKET_ERROR銆傦紙姣忎竴涓櫎send澶栫殑Socket鍑芥暟鍦ㄦ墽 琛岀殑鏈寮濮嬫昏鍏堢瓑寰呭鎺ュ瓧鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹鍗忚浼犻佸畬姣曟墠鑳界戶緇紝濡傛灉鍦ㄧ瓑寰呮椂鍑虹幇緗戠粶閿欒錛岄偅涔堣Socket鍑芥暟灝辮繑鍥?nbsp;SOCKET_ERROR錛?/p>
娉ㄦ剰錛氬湪Unix緋葷粺涓嬶紝濡傛灉send鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岃皟鐢╯end鐨勮繘紼嬩細鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p>
Send鍑芥暟鐨勮繑鍥炲兼湁涓夌被錛?/p>
錛?錛夎繑鍥炲?0錛?/p>
錛?錛夎繑鍥炲?lt;0錛氬彂閫佸け璐ワ紝閿欒鍘熷洜瀛樹簬鍏ㄥ眬鍙橀噺errno涓?/p>
錛?錛夎繑鍥炲?gt;0錛氳〃紺哄彂閫佺殑瀛楄妭鏁幫紙瀹為檯涓婃槸鎷瘋礉鍒板彂閫佺紦鍐蹭腑鐨勫瓧鑺傛暟錛?/p>
閿欒浠g爜錛?/p>
EBADF 鍙傛暟s 闈炲悎娉曠殑socket澶勭悊浠g爜銆?br style="box-sizing: border-box;" />EFAULT 鍙傛暟涓湁涓鎸囬拡鎸囧悜鏃犳硶瀛樺彇鐨勫唴瀛樼┖闂?br style="box-sizing: border-box;" />ENOTSOCK 鍙傛暟s涓轟竴鏂囦歡鎻忚堪璇嶏紝闈瀞ocket銆?br style="box-sizing: border-box;" />EINTR 琚俊鍙鋒墍涓柇銆?br style="box-sizing: border-box;" />EAGAIN 姝ゆ搷浣滀細浠よ繘紼嬮樆鏂紝浣嗗弬鏁皊鐨剆ocket涓轟笉鍙樆鏂?br style="box-sizing: border-box;" />ENOBUFS 緋葷粺鐨勭紦鍐插唴瀛樹笉瓚?br style="box-sizing: border-box;" />ENOMEM 鏍稿績鍐呭瓨涓嶈凍 EINVAL 浼犵粰緋葷粺璋冪敤鐨勫弬鏁頒笉姝g‘銆?/p>
2. recv鍑芥暟
int recv( SOCKET s, char FAR *buf, int len, int flags );
涓嶈鏄鎴風榪樻槸鏈嶅姟鍣ㄧ搴旂敤紼嬪簭閮界敤recv鍑芥暟浠嶵CP榪炴帴鐨勫彟涓绔帴鏀舵暟鎹?/p>
璇ュ嚱鏁扮殑錛?/p>
絎竴涓弬鏁版寚瀹氭帴鏀剁濂楁帴瀛楁弿榪扮錛?/p>
絎簩涓弬鏁版寚鏄庝竴涓紦鍐插尯錛岃緙撳啿鍖虹敤鏉ュ瓨鏀緍ecv鍑芥暟鎺ユ敹鍒扮殑鏁版嵁錛?/p>
絎笁涓弬鏁版寚鏄巄uf鐨勯暱搴︼紱
絎洓涓弬鏁頒竴鑸疆0銆?/p>
榪欓噷鍙弿榪板悓姝ocket鐨剅ecv鍑芥暟鐨勬墽琛屾祦紼嬨傚綋搴旂敤紼嬪簭璋冪敤recv鍑芥暟鏃訛紝recv鍏堢瓑寰卻鐨勫彂閫佺紦鍐?nbsp;涓殑鏁版嵁琚崗璁紶閫佸畬姣曪紝濡傛灉鍗忚鍦ㄤ紶閫乻鐨勫彂閫佺紦鍐蹭腑鐨勬暟鎹椂鍑虹幇緗戠粶閿欒錛岄偅涔坮ecv鍑芥暟榪斿洖SOCKET_ERROR錛屽鏋渟鐨勫彂閫佺紦鍐蹭腑娌℃湁鏁?nbsp;鎹垨鑰呮暟鎹鍗忚鎴愬姛鍙戦佸畬姣曞悗錛宺ecv鍏堟鏌ュ鎺ュ瓧s鐨勬帴鏀剁紦鍐插尯錛屽鏋渟鎺ユ敹緙撳啿鍖轟腑娌℃湁鏁版嵁鎴栬呭崗璁鍦ㄦ帴鏀舵暟鎹紝閭d箞recv灝變竴鐩寸瓑寰咃紝鍙埌 鍗忚鎶婃暟鎹帴鏀跺畬姣曘傚綋鍗忚鎶婃暟鎹帴鏀跺畬姣曪紝recv鍑芥暟灝辨妸s鐨勬帴鏀剁紦鍐蹭腑鐨勬暟鎹甤opy鍒癰uf涓紙娉ㄦ剰鍗忚鎺ユ敹鍒扮殑鏁版嵁鍙兘澶т簬buf 鐨勯暱搴︼紝鎵浠?nbsp;鍦ㄨ繖縐嶆儏鍐典笅瑕佽皟鐢ㄥ嚑嬈ecv鍑芥暟鎵嶈兘鎶妔鐨勬帴鏀剁紦鍐蹭腑鐨勬暟鎹甤opy瀹屻俽ecv鍑芥暟浠呬粎鏄痗opy鏁版嵁錛岀湡姝g殑鎺ユ敹鏁版嵁鏄崗璁潵瀹屾垚鐨勶級錛宺ecv鍑芥暟榪斿洖鍏跺疄闄卌opy鐨勫瓧鑺傛暟銆傚鏋渞ecv鍦╟opy鏃跺嚭閿欙紝閭d箞瀹冭繑鍥濻OCKET_ERROR錛涘鏋渞ecv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶涓柇浜嗭紝閭d箞瀹冭繑鍥?銆?/p>
娉ㄦ剰錛氬湪Unix緋葷粺涓嬶紝濡傛灉recv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶鏂紑浜嗭紝閭d箞璋冪敤recv鐨勮繘紼嬩細鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p>
榛樿鎯呭喌涓媠ocket鏄樆濉炵殑銆?/p>
闃誨涓庨潪闃誨recv榪斿洖鍊兼病鏈夊尯鍒紝閮芥槸錛?/p>
<0 鍑洪敊
=0 瀵規柟璋冪敤浜哻lose API鏉ュ叧闂繛鎺?/p>
>0 鎺ユ敹鍒扮殑鏁版嵁澶у皬錛?/p>
鐗瑰埆鍦幫細榪斿洖鍊?lt;0鏃跺茍涓?errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)鐨勬儏鍐典笅璁や負榪炴帴鏄甯哥殑錛岀戶緇帴鏀躲?/p>
鍙槸闃誨妯″紡涓媟ecv浼氫竴鐩撮樆濉炵洿鍒版帴鏀跺埌鏁版嵁錛岄潪闃誨妯″紡涓嬪鏋滄病鏈夋暟鎹氨浼氳繑鍥烇紝涓嶄細闃誨鐫璇伙紝鍥犳闇瑕佸驚鐜鍙栵級銆?/p>
榪斿洖璇存槑錛?nbsp;
錛?錛夋垚鍔熸墽琛屾椂錛岃繑鍥炴帴鏀跺埌鐨勫瓧鑺傛暟銆?/p>
錛?錛夎嫢鍙︿竴绔凡鍏抽棴榪炴帴鍒欒繑鍥?錛岃繖縐嶅叧闂槸瀵規柟涓誨姩涓旀甯哥殑鍏抽棴
錛?錛夊け璐ヨ繑鍥?1錛宔rrno琚涓轟互涓嬬殑鏌愪釜鍊?nbsp;
EAGAIN錛氬鎺ュ瓧宸叉爣璁頒負闈為樆濉烇紝鑰屾帴鏀舵搷浣滆闃誨鎴栬呮帴鏀惰秴鏃?/p>
EBADF錛歴ock涓嶆槸鏈夋晥鐨勬弿榪拌瘝
ECONNREFUSE錛氳繙紼嬩富鏈洪樆緇濈綉緇滆繛鎺?/p>
EFAULT錛氬唴瀛樼┖闂磋闂嚭閿?/p>
EINTR錛氭搷浣滆淇″彿涓柇
EINVAL錛氬弬鏁版棤鏁?/p>
ENOMEM錛氬唴瀛樹笉瓚?/p>
ENOTCONN錛氫笌闈㈠悜榪炴帴鍏寵仈鐨勫鎺ュ瓧灝氭湭琚繛鎺ヤ笂
ENOTSOCK錛歴ock绱㈠紩鐨勪笉鏄鎺ュ瓧
]]>Echo Server based on libevent http://m.shnenglu.com/API/archive/2015/05/03/210531.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Sun, 03 May 2015 12:28:00 GMT http://m.shnenglu.com/API/archive/2015/05/03/210531.html http://m.shnenglu.com/API/comments/210531.html http://m.shnenglu.com/API/archive/2015/05/03/210531.html#Feedback 0 http://m.shnenglu.com/API/comments/commentRss/210531.html http://m.shnenglu.com/API/services/trackbacks/210531.html 鍑哄錛欱log of Felix021
鏃墮棿錛歋at, 25 Feb 2012 00:43:26 +0000
浣滆咃細felix021
鍦板潃錛歨ttp://www.felix021.com/blog/read.php?2068
鍐呭錛?/div>
鑺變簡涓ゅぉ鐨勬椂闂村湪libevent涓婏紝鎯蟲葷粨涓嬶紝灝變互鍐欑畝鍗晅utorial鐨勬柟寮忓惂錛岃矊浼兼病鏈変竴綃囩畝鍗曠殑璇存槑錛岃浜洪┈涓婂氨鑳戒笂鎵嬬敤鐨勩?/div>
棣栧厛緇欏嚭瀹樻柟鏂囨。鍚э細 http://libevent.org 錛岄欏墊湁涓狿rogramming with Libevent錛岄噷闈㈡槸涓鑺備竴鑺傜殑浠嬬粛libevent錛屼絾鏄劅瑙変俊鎭噺澶ぇ浜嗭紝鑰屼笖榪樻槸鑻辨枃鐨?銆?錛堝綋鐒訛紝濡傛灉鎯沖ソ濂界敤libevent錛岀湅鐪嬭繕鏄緢鏈夊繀瑕佺殑錛夛紝榪樻湁涓猂eference錛屽ぇ鑷村氨鏄鍚勪釜鐗堟湰鐨刲ibevent浣跨敤doxgen鐢熸垚鐨勬枃妗o紝鐢ㄦ潵鏌ュ嚱鏁板師鍨嬪拰鍩烘湰鐢ㄦ硶浠涔堢殑銆?/div>
涓嬮潰鍋囧畾宸茬粡瀛︿範榪囧熀鏈殑socket緙栫▼錛坰ocket,bind,listen,accept,connect,recv,send,close錛夛紝騫朵笖瀵瑰紓姝?callback鏈夊熀鏈璇嗐?/div>
鍩烘湰鐨剆ocket緙栫▼鏄樆濉?鍚屾鐨勶紝姣忎釜鎿嶄綔闄ら潪宸茬粡瀹屾垚鎴栬呭嚭閿欐墠浼氳繑鍥烇紝榪欐牱瀵逛簬姣忎竴涓姹傦紝瑕佷嬌鐢ㄤ竴涓嚎紼嬫垨鑰呭崟鐙殑榪涚▼鍘誨鐞嗭紝緋葷粺璧勬簮娌℃硶鏀拺澶ч噺鐨勮姹傦紙鎵璋揷10k problem?錛夛紝渚嬪鍐呭瓨錛氶粯璁ゆ儏鍐典笅姣忎釜綰跨▼闇瑕佸崰鐢?锝?M鐨勬爤絀洪棿銆俻osix瀹氫箟浜嗗彲浠ヤ嬌鐢ㄥ紓姝ョ殑select緋葷粺璋冪敤錛屼絾鏄洜涓哄叾閲囩敤浜嗚疆璇㈢殑鏂瑰紡鏉ュ垽鏂煇涓猣d鏄惁鍙樻垚active錛屾晥鐜囦笉楂榌O(n)]錛岃繛鎺ユ暟涓澶氾紝涔熻繕鏄拺涓嶄綇銆備簬鏄悇緋葷粺鍒嗗埆鎻愬嚭浜嗗熀浜庡紓姝?callback鐨勭郴緇熻皟鐢紝渚嬪Linux鐨別poll錛孊SD鐨刱queue錛學indows鐨処OCP銆傜敱浜庡湪鍐呮牳灞傞潰鍋氫簡鏀寔錛屾墍浠ュ彲浠ョ敤O(1)鐨勬晥鐜囨煡鎵懼埌active鐨刦d銆傚熀鏈笂錛宭ibevent灝辨槸瀵硅繖浜涢珮鏁圛O鐨勫皝瑁咃紝鎻愪緵緇熶竴鐨凙PI錛岀畝鍖栧紑鍙戙?/div>
libevent澶ф鏄繖鏍風殑錛?/div>
榛樿鎯呭喌涓嬫槸鍗曠嚎紼嬬殑錛堝彲浠ラ厤緗垚澶氱嚎紼嬶紝濡傛灉鏈夐渶瑕佺殑璇濓級錛屾瘡涓嚎紼嬫湁涓斿彧鏈変竴涓猠vent_base錛屽搴斾竴涓猻truct event_base緇撴瀯浣擄紙浠ュ強闄勪簬鍏朵笂鐨勪簨浠剁鐞嗗櫒錛夛紝鐢ㄦ潵schedule鎵樼緇欏畠鐨勪竴緋誨垪event錛屽彲浠ュ拰鎿嶄綔緋葷粺鐨勮繘紼嬬鐞嗙被姣旓紝褰撶劧錛岃鏇寸畝鍗曚竴鐐廣傚綋涓涓簨浠跺彂鐢熷悗錛宔vent_base浼氬湪鍚堥傜殑鏃墮棿錛堜笉涓瀹氭槸绔嬪嵆錛夊幓璋冪敤緇戝畾鍦ㄨ繖涓簨浠朵笂鐨勫嚱鏁幫紙浼犲叆涓浜涢瀹氫箟鐨勫弬鏁幫紝浠ュ強鍦ㄧ粦瀹氭椂鎸囧畾鐨勪竴涓弬鏁幫級錛岀洿鍒拌繖涓嚱鏁版墽琛屽畬錛屽啀榪斿洖schedule鍏朵粬浜嬩歡銆?/鍒涘緩涓涓猠vent_base
struct event_base *base = event_base_new();
assert(base != NULL);
event_base鍐呴儴鏈変竴涓驚鐜紝寰幆闃誨鍦╡poll/kqueue絳夌郴緇熻皟鐢ㄤ笂錛岀洿鍒版湁涓涓?涓浜涗簨浠跺彂鐢燂紝鐒跺悗鍘誨鐞嗚繖浜涗簨浠躲傚綋鐒訛紝榪欎簺浜嬩歡瑕佽緇戝畾鍦ㄨ繖涓猠vent_base涓娿傛瘡涓簨浠跺搴斾竴涓猻truct event錛屽彲浠ユ槸鐩戝惉涓涓猣d鎴栬匬OSIX淇″彿閲忎箣綾伙紙榪欓噷鍙fd浜嗭紝鍏朵粬鐨勭湅manual鍚э級銆俿truct event浣跨敤event_new鏉ュ垱寤哄拰緇戝畾錛屼嬌鐢╡vent_add鏉ュ惎鐢細//鍒涘緩騫剁粦瀹氫竴涓猠vent
struct event *listen_event;
//鍙傛暟錛歟vent_base, 鐩戝惉鐨刦d錛屼簨浠剁被鍨嬪強灞炴э紝緇戝畾鐨勫洖璋冨嚱鏁幫紝緇欏洖璋冨嚱鏁扮殑鍙傛暟
listen_event = event_new(base, listener, EV_READ|EV_PERSIST, callback_func, (void*)base);
//鍙傛暟錛歟vent錛岃秴鏃舵椂闂?struct timeval *綾誨瀷鐨勶紝NULL琛ㄧず鏃犺秴鏃惰緗?
event_add(listen_event, NULL);
娉細libevent鏀寔鐨勪簨浠跺強灞炴у寘鎷?浣跨敤bitfield瀹炵幇錛屾墍浠ヨ鐢?| 鏉ヨ瀹冧滑鍚堜綋)
(a) EV_TIMEOUT: 瓚呮椂
(b) EV_READ: 鍙緗戠粶緙撳啿涓繕鏈夋暟鎹紝鍥炶皟鍑芥暟灝變細琚Е鍙?/div>
(c) EV_WRITE: 鍙濉炵粰緗戠粶緙撳啿鐨勬暟鎹鍐欏畬錛屽洖璋冨嚱鏁板氨浼氳瑙﹀彂
(d) EV_SIGNAL: POSIX淇″彿閲忥紝鍙傝僲anual鍚?/div>
(e) EV_PERSIST: 涓嶆寚瀹氳繖涓睘鎬х殑璇濓紝鍥炶皟鍑芥暟琚Е鍙戝悗浜嬩歡浼氳鍒犻櫎
(f) EV_ET: Edge-Trigger杈圭紭瑙﹀彂錛屽弬鑰僂POLL_ET
鐒跺悗闇瑕佸惎鍔╡vent_base鐨勫驚鐜紝榪欐牱鎵嶈兘寮濮嬪鐞嗗彂鐢熺殑浜嬩歡銆傚驚鐜殑鍚姩浣跨敤event_base_dispatch錛屽驚鐜皢涓鐩存寔緇紝鐩村埌涓嶅啀鏈夐渶瑕佸叧娉ㄧ殑浜嬩歡錛屾垨鑰呮槸閬囧埌event_loopbreak()/event_loopexit()鍑芥暟銆?/鍚姩浜嬩歡寰幆
event_base_dispatch(base);
鎺ヤ笅鏉ュ叧娉ㄤ笅緇戝畾鍒癳vent鐨勫洖璋冨嚱鏁癱allback_func錛氫紶閫掔粰瀹冪殑鏄竴涓猻ocket fd銆佷竴涓猠vent綾誨瀷鍙婂睘鎬it_field銆佷互鍙婁紶閫掔粰event_new鐨勬渶鍚庝竴涓弬鏁幫紙鍘諱笂闈㈠嚑琛屽洖欏句竴涓嬶紝鎶奺vent_base緇欎紶榪涙潵浜嗭紝瀹為檯涓婃洿澶氬湴鏄垎閰嶄竴涓粨鏋勪綋錛屾妸鐩稿叧鐨勬暟鎹兘鎾傝繘鍘伙紝鐒跺悗涓㈢粰event_new錛屽湪榪欓噷灝辮兘鍙栧緱鍒頒簡錛夈傚叾鍘熷瀷鏄細typedef void(* event_callback_fn)(evutil_socket_t sockfd, short event_type, void *arg)
瀵逛簬涓涓湇鍔″櫒鑰岃█錛屼笂闈㈢殑嫻佺▼澶ф鏄繖鏍風粍鍚堢殑錛?/div>
1. listener = socket()錛宐ind()錛宭isten()錛岃緗畁onblocking(POSIX緋葷粺涓彲浣跨敤fcntl璁劇疆錛寃indows涓嶉渶瑕佽緗紝瀹為檯涓妉ibevent鎻愪緵浜嗙粺涓鐨勫寘瑁卐vutil_make_socket_nonblocking)
2. 鍒涘緩涓涓猠vent_base
3. 鍒涘緩涓涓猠vent錛屽皢璇ocket鎵樼緇檈vent_base錛屾寚瀹氳鐩戝惉鐨勪簨浠剁被鍨嬶紝騫剁粦瀹氫笂鐩稿簲鐨勫洖璋冨嚱鏁?鍙婇渶瑕佺粰瀹冪殑鍙傛暟)銆傚浜巐istener socket鏉ヨ錛屽彧闇瑕佺洃鍚珽V_READ|EV_PERSIST
4. 鍚敤璇ヤ簨浠?/div>
5. 榪涘叆浜嬩歡寰幆
---------------
6. (寮傛) 褰撴湁client鍙戣搗璇鋒眰鐨勬椂鍊欙紝璋冪敤璇ュ洖璋冨嚱鏁幫紝榪涜澶勭悊銆?/div>
闂錛氫負浠涔堜笉鍦╨isten瀹岄┈涓婅皟鐢╝ccept錛岃幏寰楀鎴風榪炴帴浠ュ悗鍐嶄涪緇檈vent_base鍛紵榪欎釜闂鍏堟兂鎯沖櫌銆?/div>
鍥炶皟鍑芥暟瑕佸仛浠涔堜簨鎯呭憿錛熷綋鐒舵槸澶勭悊client鐨勮姹備簡銆傞鍏堣accept錛岃幏寰椾竴涓彲浠ヤ笌client閫氫俊鐨剆ockfd錛岀劧鍚?#8230;…璋冪敤recv/send鍚楋紵閿欙紒澶ч敊鐗歸敊錛佸鏋滅洿鎺ヨ皟鐢╮ecv/send鐨勮瘽錛岃繖涓嚎紼嬪氨闃誨鍦ㄨ繖涓湴鏂逛簡錛屽鏋滆繖涓鎴風闈炲父鐨勯槾闄╋紙姣斿涓鐩翠笉鍙戞秷鎭紝鎴栬呯綉緇滀笉濂斤紝鑰佹槸涓㈠寘錛夛紝libevent灝卞彧鑳界瓑瀹冿紝娌℃硶澶勭悊鍏朵粬鐨勮姹備簡——鎵浠ュ簲璇ュ垱寤轟竴涓柊鐨別vent鏉ユ墭綆¤繖涓猻ockfd銆?/div>
鍦ㄨ佺増鏈琹ibevent涓婄殑瀹炵幇錛屾瘮杈冪綏鍡濡傛灉涓嶆兂璇︾粏浜嗚В鐨勮瘽錛岀湅涓嬩竴閮ㄥ垎]銆?/div>
瀵逛簬鏈嶅姟鍣ㄥ笇鏈涘厛浠巆lient鑾峰彇鏁版嵁鐨勬儏鍐碉紝澶ц嚧嫻佺▼鏄繖鏍風殑錛?/div>
1. 灝嗚繖涓猻ockfd璁劇疆涓簄onblocking
2. 鍒涘緩2涓猠vent:
event_read錛岀粦涓妔ockfd鐨凟V_READ|EV_PERSIST錛岃緗洖璋冨嚱鏁板拰鍙傛暟錛堝悗闈㈡彁鍒扮殑struct錛?/div>
event_write錛岀粦涓妔ockfd鐨凟V_WRITE|EV_PERSIST錛岃緗洖璋冨嚱鏁板拰鍙傛暟錛堝悗闈㈡彁鍒扮殑struct錛?/div>
3. 鍚敤event_read浜嬩歡
------
4. (寮傛) 絳夊緟event_read浜嬩歡鐨勫彂鐢? 璋冪敤鐩稿簲鐨勫洖璋冨嚱鏁般傝繖閲岄夯鐑︽潵浜嗭細鍥炶皟鍑芥暟鐢╮ecv璇誨叆鐨勬暟鎹紝涓嶈兘鐩存帴鐢╯end涓㈢粰sockfd浜嗕簨——鍥犱負sockfd鏄痭onblocking鐨勶紝涓㈢粰瀹冪殑璇濓紝涓嶈兘淇濊瘉姝g‘錛堜負浠涔堝憿錛燂級銆傛墍浠ラ渶瑕佷竴涓嚜宸辯鐞嗙殑緙撳瓨鐢ㄦ潵淇濆瓨璇誨叆鐨勬暟鎹腑錛堝湪accept浠ュ悗灝卞垱寤轟竴涓猻truct錛屼綔涓虹2姝ュ洖璋冨嚱鏁扮殑arg浼犺繘鏉ワ級錛屽湪鍚堥傜殑鏃墮棿錛堟瘮濡傞亣鍒版崲琛岀錛夊惎鐢╡vent_write浜嬩歡銆恊vent_add(event_write, NULL)銆戯紝絳夊緟EV_WRITE浜嬩歡鐨勮Е鍙?/div>
------
5. (寮傛) 褰揺vent_write浜嬩歡鐨勫洖璋冨嚱鏁拌璋冪敤鐨勬椂鍊欙紝寰sockfd鍐欏叆鏁版嵁錛岀劧鍚庡垹闄vent_write浜嬩歡銆恊vent_del(event_write)銆戯紝絳夊緟event_read浜嬩歡鐨勪笅涓嬈℃墽琛屻?/div>
浠ヤ笂姝ラ姣旇緝鏅︽訂錛屽叿浣撲唬鐮佸彲鍙傝冨畼鏂規枃妗i噷闈㈢殑銆怑xample: A low-level ROT13 server with Libevent銆?/div>
鐢變簬闇瑕佽嚜宸辯鐞嗙紦鍐插尯錛屼笖榪囩▼鏅︽訂闅炬噦錛屽茍涓斾笉鍏煎浜嶹indows鐨処OCP錛屾墍浠ibevent2寮濮嬶紝鎻愪緵浜哹ufferevent榪欎釜紲炲櫒錛岀敤鏉ユ彁渚涙洿鍔犱紭闆呫佹槗鐢ㄧ殑API銆俿truct bufferevent鍐呭緩浜嗕袱涓猠vent(read/write)鍜屽搴旂殑緙撳啿鍖恒恠truct evbuffer *input, *output銆戯紝騫舵彁渚涚浉搴旂殑鍑芥暟鐢ㄦ潵鎿嶄綔緙撳啿鍖猴紙鎴栬呯洿鎺ユ搷浣渂ufferevent錛夈傛瘡褰撴湁鏁版嵁琚鍏nput鐨勬椂鍊欙紝read_cb鍑芥暟琚皟鐢紱姣忓綋output琚緭鍑哄畬鐨勬椂鍊欙紝write_cb琚皟鐢紱鍦ㄧ綉緇淚O鎿嶄綔鍑虹幇閿欒鐨勬儏鍐碉紙榪炴帴涓柇銆佽秴鏃躲佸叾浠栭敊璇級錛宔rror_cb琚皟鐢ㄣ備簬鏄笂涓閮ㄥ垎鐨勬楠よ綆鍖栦負錛?/div>
1. 璁劇疆sockfd涓簄onblocking
2. 浣跨敤bufferevent_socket_new鍒涘緩涓涓猻truct bufferevent *bev錛屽叧鑱旇sockfd錛屾墭綆$粰event_base
3. 浣跨敤bufferevent_setcb(bev, read_cb, write_cb, error_cb, (void *)arg)灝咵V_READ/EV_WRITE瀵瑰簲鐨勫嚱鏁?/div>
4. 浣跨敤bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST)鏉ュ惎鐢╮ead/write浜嬩歡
------
5. (寮傛)
鍦╮ead_cb閲岄潰浠巌nput璇誨彇鏁版嵁錛屽鐞嗗畬姣曞悗濉炲埌output閲?浼氳鑷姩鍐欏叆鍒皊ockfd)
鍦╳rite_cb閲岄潰錛堥渶瑕佸仛浠涔堝悧錛熷浜庝竴涓猠cho server鏉ヨ錛宺ead_cb灝辮凍澶熶簡錛?/div>
鍦╡rror_cb閲岄潰澶勭悊閬囧埌鐨勯敊璇?/div>
*. 鍙互浣跨敤bufferevent_set_timeouts(bev, struct timeval *READ, struct timeval *WRITE)鏉ヨ緗鍐欒秴鏃? 鍦╡rror_cb閲岄潰澶勭悊瓚呮椂銆?/div>
*. read_cb鍜寃rite_cb鐨勫師鍨嬫槸
void read_or_write_callback(struct bufferevent *bev, void *arg)
error_cb鐨勫師鍨嬫槸
void error_cb(struct bufferevent *bev, short error, void *arg) //榪欎釜鏄痚vent鐨勬爣鍑嗗洖璋冨嚱鏁板師鍨?/div>
鍙互浠巄ev涓敤libevent鐨凙PI鎻愬彇鍑篹vent_base銆乻ockfd銆乮nput/output絳夌浉鍏蟲暟鎹紝璇︽儏RTFM~
浜庢槸浠g爜綆鍖栧埌鍙渶瑕佸嚑琛岀殑read_cb鍜宔rror_cb鍑芥暟鍗沖彲錛?/div>
void read_cb(struct bufferevent *bev, void *arg) {
char line[256];
int n;
evutil_socket_t fd = bufferevent_getfd(bev);
while (n = bufferevent_read(bev, line, 256), n > 0)
bufferevent_write(bev, line, n);
}
void error_cb(struct bufferevent *bev, short event, void *arg) {
bufferevent_free(bev);
}
浜庢槸涓涓敮鎸佸ぇ騫跺彂閲忕殑echo server灝辨垚鍨嬩簡錛佷笅闈㈤檮涓婃棤娉ㄩ噴鐨別cho server婧愮爜錛?10琛岋紝澶氭妱鍑犻亶錛屽氨鑳藉畬鍏ㄥ紕鎳傚暒錛佹洿澶嶆潅鐨勪緥瀛愬弬瑙佸畼鏂規枃妗i噷闈㈢殑銆怑xample: A simpler ROT13 server with Libevent銆?/div>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#define LISTEN_PORT 9999
#define LISTEN_BACKLOG 32
void do_accept(evutil_socket_t listener, short event, void *arg);
void read_cb(struct bufferevent *bev, void *arg);
void error_cb(struct bufferevent *bev, short event, void *arg);
void write_cb(struct bufferevent *bev, void *arg);
int main(int argc, char *argv[])
{
int ret;
evutil_socket_t listener;
listener = socket(AF_INET, SOCK_STREAM, 0);
assert(listener > 0);
evutil_make_listen_socket_reuseable(listener);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(LISTEN_PORT);
if (bind(listener, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
return 1;
}
if (listen(listener, LISTEN_BACKLOG) < 0) {
perror("listen");
return 1;
}
printf ("Listening...\n");
evutil_make_socket_nonblocking(listener);
struct event_base *base = event_base_new();
assert(base != NULL);
struct event *listen_event;
listen_event = event_new(base, listener, EV_READ|EV_PERSIST, do_accept, (void*)base);
event_add(listen_event, NULL);
event_base_dispatch(base);
printf("The End.");
return 0;
}
void do_accept(evutil_socket_t listener, short event, void *arg)
{
struct event_base *base = (struct event_base *)arg;
evutil_socket_t fd;
struct sockaddr_in sin;
socklen_t slen = sizeof(sin);
fd = accept(listener, (struct sockaddr *)&sin, &slen);
if (fd < 0) {
perror("accept");
return;
}
if (fd > FD_SETSIZE) { //榪欎釜if鏄弬鑰冧簡閭d釜ROT13鐨勪緥瀛愶紝璨屼技鏄畼鏂圭殑鐤忔紡錛屼粠select-based渚嬪瓙閲屾妱榪囨潵蹇樹簡鏀?/div>
perror("fd > FD_SETSIZE\n");
return;
}
printf("ACCEPT: fd = %u\n", fd);
struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);
}
void read_cb(struct bufferevent *bev, void *arg)
{
#define MAX_LINE 256
char line[MAX_LINE+1];
int n;
evutil_socket_t fd = bufferevent_getfd(bev);
while (n = bufferevent_read(bev, line, MAX_LINE), n > 0) {
line[n] = '\0';
printf("fd=%u, read line: %s\n", fd, line);
bufferevent_write(bev, line, n);
}
}
void write_cb(struct bufferevent *bev, void *arg) {}
void error_cb(struct bufferevent *bev, short event, void *arg)
{
evutil_socket_t fd = bufferevent_getfd(bev);
printf("fd = %u, ", fd);
if (event & BEV_EVENT_TIMEOUT) {
printf("Timed out\n"); //if bufferevent_set_timeouts() called
}
else if (event & BEV_EVENT_EOF) {
printf("connection closed\n");
}
else if (event & BEV_EVENT_ERROR) {
printf("some other error\n");
}
bufferevent_free(bev);
}
]]>
libevent windows緙栬瘧 http://m.shnenglu.com/API/archive/2015/02/15/209824.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Sun, 15 Feb 2015 05:14:00 GMT http://m.shnenglu.com/API/archive/2015/02/15/209824.html http://m.shnenglu.com/API/comments/209824.html http://m.shnenglu.com/API/archive/2015/02/15/209824.html#Feedback 3 http://m.shnenglu.com/API/comments/commentRss/209824.html http://m.shnenglu.com/API/services/trackbacks/209824.html 1. 涓嬭澆libevent搴?br />2.鏈漢鐢╲s2013緙栬瘧錛屾墍鏈夐渶瑕佷慨鏀?br />
鍦ㄤ互涓?/span>3涓枃浠跺紑澶翠慨鏀?#8220; #define _WIN32_WINNT 0x0603”
libevent-2.0.22-stable\event_iocp.c
libevent-2.0.22-stable\evthread_win32.c
libevent-2.0.22-stable\listener.c 3.璁劇疆nmake鐨勭幆澧?br />VC6 prefix\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT VC8 prefix\Microsoft Visual Studio 8\VC\bin\vcvars32.bat VC9 prefix\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat 鎴戣繖閲屾槸vs2013錛屾墽琛孌:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat 娉ㄦ剰錛氳繖浜涙壒澶勭悊鏂囦歡鍙細鍦ㄥ綋鍓嶈繘紼嬩腑璁劇疆錛堝眬閮ㄧ殑錛夌幆澧冨彉閲忥紝涔熷氨鏄錛?br />1. 鐢╟md錛堟垨鑰卌ommand錛夋墦寮鐨勫懡浠よ紿楀彛涓紝 榪愯鏌愪釜vcvar32.bat涓嬈°?br />閭d箞褰撳墠鍛戒護琛岀獥鍙d腑灝卞彲浠ユ甯鎬嬌鐢╟l錛岀洿鍒板叧闂?br /> 4.浣跨敤VC鐨刵make -f Makefile.nmake鍗沖彲緙栬瘧32浣峳elease妯″紡銆?/span>濡傛灉瑕佹眰緙栬瘧64浣嶇殑鐗堟湰錛岄渶瑕佸湪Makefile.nmake涓坊鍔犱竴涓狶IBFLAGS閫夐」 /MACHINE:X64 濡傛灉瑕佸姞璋冭瘯淇℃伅錛屽彲浠ュ湪 CFLAGS涓姞鍏?Zi錛?2浣嶅姞璋冭瘯閫夐」鏄?CFLAGS涓姞/ZI錛屽綋鐒惰璋冩暣浼樺寲閫夐」/Ox
]]>
tcp榪炴帴鎺㈡祴Keepalive鍜屽績璺沖寘 http://m.shnenglu.com/API/archive/2013/08/13/202516.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Tue, 13 Aug 2013 01:03:00 GMT http://m.shnenglu.com/API/archive/2013/08/13/202516.html http://m.shnenglu.com/API/comments/202516.html http://m.shnenglu.com/API/archive/2013/08/13/202516.html#Feedback 1 http://m.shnenglu.com/API/comments/commentRss/202516.html http://m.shnenglu.com/API/services/trackbacks/202516.html 閲囩敤TCP榪炴帴鐨凜/S妯″紡杞歡錛岃繛鎺ョ殑鍙屾柟鍦ㄨ繛鎺ョ┖闂茬姸鎬佹椂錛屽鏋滀換鎰忎竴鏂規剰澶栧穿婧冦佸綋鏈恒佺綉綰挎柇寮鎴栬礬鐢卞櫒鏁呴殰錛屽彟涓鏂規棤娉曞緱鐭CP榪炴帴宸茬粡澶辨晥錛岄櫎闈炵戶緇湪姝よ繛鎺ヤ笂鍙戦佹暟鎹鑷撮敊璇繑鍥炪傚緢澶氭椂鍊欙紝榪欎笉鏄垜浠渶瑕佺殑銆傛垜浠笇鏈涙湇鍔″櫒绔拰瀹㈡埛绔兘鑳藉強鏃舵湁鏁堝湴媯嫻嬪埌榪炴帴澶辨晥錛岀劧鍚庝紭闆呭湴瀹屾垚涓浜涙竻鐞嗗伐浣滃茍鎶婇敊璇姤鍛婄粰鐢ㄦ埛銆?br /> 濡備綍鍙婃椂鏈夋晥鍦版嫻嬪埌涓鏂圭殑闈炴甯告柇寮錛屼竴鐩存湁涓ょ鎶鏈彲浠ヨ繍鐢ㄣ備竴縐嶆槸鐢盩CP鍗忚灞傚疄鐜扮殑Keepalive錛屽彟涓縐嶆槸鐢卞簲鐢ㄥ眰鑷繁瀹炵幇鐨勫績璺沖寘 銆?br /> TCP榛樿騫朵笉寮鍚疜eepalive鍔熻兘錛屽洜涓哄紑鍚疜eepalive鍔熻兘闇瑕佹秷鑰楅澶栫殑瀹藉甫鍜屾祦閲忥紝灝界榪欏井涓嶈凍閬擄紝浣嗗湪鎸夋祦閲忚璐圭殑鐜涓嬪鍔犱簡璐圭敤錛屽彟涓鏂歸潰錛孠eepalive璁劇疆涓嶅悎鐞嗘椂鍙兘浼氬洜涓虹煭鏆傜殑緗戠粶娉㈠姩鑰屾柇寮鍋ュ悍鐨凾CP榪炴帴銆傚茍涓旓紝榛樿鐨凨eepalive瓚呮椂闇瑕?,200,000 milliseconds錛屽嵆2灝忔椂錛屾帰嫻嬫鏁頒負5嬈°?/span> 瀵逛簬Win2K/XP/2003錛屽彲浠ヤ粠涓嬮潰鐨勬敞鍐岃〃欏規壘鍒板獎鍝嶆暣涓郴緇熸墍鏈夎繛鎺ョ殑keepalive鍙傛暟錛?/span> [HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters] "KeepAliveTime”=dword:006ddd00 "KeepAliveInterval"=dword:000003e8 "MaxDataRetries"="5" 瀵逛簬瀹炵敤鐨勭▼搴忔潵璇達紝2灝忔椂鐨勭┖闂叉椂闂村お闀褲傚洜姝わ紝鎴戜滑闇瑕佹墜宸ュ紑鍚疜eepalive鍔熻兘騫惰緗悎鐞嗙殑Keepalive鍙傛暟銆?
// 寮鍚疜eepAlive BOOL bKeepAlive = TRUE; int nRet = ::setsockopt(socket_handle, SOL_SOCKET, SO_KEEPALIVE, ( char * ) & bKeepAlive, sizeof (bKeepAlive)); if (nRet == SOCKET_ERROR) { return FALSE; } // 璁劇疆KeepAlive鍙傛暟 tcp_keepalive alive_in = { 0 } ; tcp_keepalive alive_out = { 0 } ; alive_in.keepalivetime = 5000 ; // 寮濮嬮嬈eepAlive鎺㈡祴鍓嶇殑TCP絀洪棴鏃墮棿 alive_in.keepaliveinterval = 1000 ; // 涓ゆKeepAlive鎺㈡祴闂寸殑鏃墮棿闂撮殧 alive_in.onoff = TRUE; unsigned long ulBytesReturn = 0 ; nRet = WSAIoctl(socket_handle, SIO_KEEPALIVE_VALS, & alive_in, sizeof (alive_in), & alive_out, sizeof (alive_out), & ulBytesReturn, NULL, NULL); if (nRet == SOCKET_ERROR) { return FALSE; }
寮鍚疜eepalive閫夐」涔嬪悗錛屽浜庝嬌鐢↖OCP妯″瀷鐨勬湇鍔″櫒绔▼搴忔潵璇達紝涓鏃︽嫻嬪埌榪炴帴鏂紑錛孏etQueuedCompletionStatus鍑芥暟灝嗙珛鍗寵繑鍥濬ALSE錛屼嬌寰楁湇鍔″櫒绔兘鍙婃椂娓呴櫎璇ヨ繛鎺ャ侀噴鏀捐榪炴帴鐩稿叧鐨勮祫婧愩傚浜庝嬌鐢╯elect妯″瀷鐨勫鎴風鏉ヨ錛岃繛鎺ユ柇寮琚帰嫻嬪埌鏃訛紝浠ecv鐩殑闃誨鍦╯ocket涓婄殑select鏂規硶灝嗙珛鍗寵繑鍥濻OCKET_ERROR錛屼粠鑰屽緱鐭ヨ繛鎺ュ凡澶辨晥錛屽鎴風紼嬪簭渚挎湁鏈轟細鍙婃椂鎵ц娓呴櫎宸ヤ綔銆佹彁閱掔敤鎴鋒垨閲嶆柊榪炴帴銆?br />
鍙︿竴縐嶆妧鏈紝鐢卞簲鐢ㄧ▼搴忚嚜宸卞彂閫佸績璺沖寘鏉ユ嫻嬭繛鎺ョ殑鍋ュ悍鎬с傚鎴風鍙互鍦ㄤ竴涓猅imer涓垨浣庣駭鍒殑綰跨▼涓畾鏃跺悜鍙戞湇鍔″櫒鍙戦佷竴涓煭灝忕簿鎮嶇殑鍖咃紝騫剁瓑寰呮湇鍔″櫒鐨勫洖搴斻傚鎴風紼嬪簭鍦ㄤ竴瀹氭椂闂村唴娌℃湁鏀跺埌鏈嶅姟鍣ㄥ洖搴斿嵆璁や負榪炴帴涓嶅彲鐢紝鍚屾牱錛屾湇鍔″櫒鍦ㄤ竴瀹氭椂闂村唴娌℃湁鏀跺埌瀹㈡埛绔殑蹇冭煩鍖呭垯璁や負瀹㈡埛绔凡緇忔帀綰褲?br />
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
銆windows涓嬫澶勭殑”闈炴甯告柇寮”鎸嘥CP榪炴帴涓嶆槸浠ヤ紭闆呯殑鏂瑰紡鏂紑,濡傜綉綰挎晠闅滅瓑鐗╃悊閾捐礬鐨勫師鍥?榪樻湁紿佺劧涓繪満鏂數絳夊師鍥?
鏈変袱縐嶆柟娉曞彲浠ユ嫻?
1.TCP榪炴帴鍙屾柟瀹氭椂鍙戞彙鎵嬫秷鎭?
2.鍒╃敤TCP鍗忚鏍堜腑鐨凨eepAlive鎺㈡祴 絎簩縐嶆柟娉曠畝鍗曞彲闈?鍙渶瀵筎CP榪炴帴涓や釜Socket璁懼畾KeepAlive鎺㈡祴, 鎵浠ユ湰鏂囧彧璁茬浜岀鏂規硶鍦↙inux,Window2000涓嬬殑瀹炵幇(鍦ㄥ叾瀹冪殑騫沖彴涓婃病鏈変綔榪涗竴姝ョ殑嫻嬭瘯)
Windows 2000騫沖彴涓?nbsp;澶存枃浠?br /> #include < mstcpip.h > // 瀹氫箟緇撴瀯鍙婂畯 /* struct TCP_KEEPALIVE { u_longonoff; u_longkeepalivetime; u_longkeepaliveinterval; } ; */ tcp_keepalive live,liveout; live.keepaliveinterval=5000; //姣?縐掑彂涓嬈℃帰嫻嬫姤鏂?鍙?嬈℃病鏈夊洖搴旓紝灝辨柇寮 live.keepalivetime=30000;//瓚呰繃30s娌℃湁鏁版嵁錛屽氨鍙戦佹帶嫻嬪寘 live.onoff=TRUE; int Opt = 1; int iRet = setsockopt(Accept,SOL_SOCKET,SO_KEEPALIVE,(char *)&Opt,sizeof(int)); if(iRet == 0){ DWORD dw; if(::WSAIoctl(Accept,SIO_KEEPALIVE_VALS, &live,sizeof(live),&liveout,sizeof(liveout), &dw,NULL,NULL)== SOCKET_ERROR){ } }
ACE涓嬩唬鐮?//by rainfish blog.csdn.net/bat603
int Opt = 1; //鍦ㄦ祴璇曡繃紼嬩腑錛屽彂鐜版嫻嬬殑嬈℃暟鏄?嬈★紝鍗充笅闈㈢殑璁劇疆涓紝浠庢渶榪戜竴嬈℃秷鎭紑濮嬭綆楃殑10縐掑悗錛屾瘡嬈¢棿闅?縐掞紝榪炵畫鍙戦?嬈★紝鍗?5縐掑彂鐜扮綉緇滄柇浜?br />tcp_keepalive live,liveout; live.keepaliveinterval=5000; //姣忔媯嫻嬬殑闂撮殧 錛堝崟浣嶆縐掞級 live.keepalivetime=10000; //絎竴嬈″紑濮嬪彂閫佺殑鏃墮棿錛堝崟浣嶆縐掞級 live.onoff=TRUE; int iRet = stream.set_option(SOL_SOCKET,SO_KEEPALIVE,&Opt,sizeof(int)); if(iRet == 0){ DWORD dw; //姝ゅ鏄劇ず浜嗗湪ACE涓嬭幏鍙栧鎺ュ瓧鐨勬柟娉曪紝鍗沖彞鏌勭殑(SOCKET)鍖栧氨鏄彞鏌?br />if(WSAIoctl((SOCKET)h,SIO_KEEPALIVE_VALS,&live,sizeof(live), &liveout,sizeof(liveout),&dw,NULL,NULL)== SOCKET_ERROR){ //Delete Client return; } }
Linux騫沖彴涓?/p>
#include "/usr/include/linux/tcp.h" #include "/usr/include/linux/socket.h" ////KeepAlive瀹炵幇錛屽崟浣嶇 //涓嬮潰浠g爜瑕佹眰鏈堿CE,濡傛灉娌℃湁鍖呭惈ACE,鍒欒鎶婄敤鍒扮殑ACE鍑芥暟鏀規垚linux鐩稿簲鐨勬帴鍙?br />int keepAlive = 1;//璁懼畾KeepAlive int keepIdle = 5;//寮濮嬮嬈eepAlive鎺㈡祴鍓嶇殑TCP絀洪棴鏃墮棿 int keepInterval = 5;//涓ゆKeepAlive鎺㈡祴闂寸殑鏃墮棿闂撮殧 int keepCount = 3;//鍒ゅ畾鏂紑鍓嶇殑KeepAlive鎺㈡祴嬈℃暟 if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!/n"))); }
if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!/n"))); }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
]]> UDP,TCP鎵撴礊鎶鏈?/title> http://m.shnenglu.com/API/archive/2012/08/24/188130.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Fri, 24 Aug 2012 06:18:00 GMT http://m.shnenglu.com/API/archive/2012/08/24/188130.html http://m.shnenglu.com/API/comments/188130.html http://m.shnenglu.com/API/archive/2012/08/24/188130.html#Feedback 3 http://m.shnenglu.com/API/comments/commentRss/188130.html http://m.shnenglu.com/API/services/trackbacks/188130.html 1銆佷粙緇?/p>
鐢ㄦ埛閲忛珮閫熷闀夸互鍙婂ぇ閲忓畨鍏ㄩ棶棰樼殑宸ㄥぇ鍘嬪姏榪嬌Internet鎶鏈笉鏂悜鍓嶅彂灞曪紝浣嗘槸榪欎簺鏂板叴鐨勬妧鏈緢澶х▼搴﹀湴澧炲姞浜嗗簲鐢ㄧ▼搴忓紑鍙戠殑鎴愭湰鍜屽鏉傛с侷nternet鏈鍒濈殑鍦板潃浣撶郴鏄瘡涓妭鐐規湁涓涓敮涓涓嶅彉鐨勫叏灞鍦板潃錛屽彲浠ラ氳繃璇ュ湴鍧鐩存帴涓庝換浣曞叾瀹冪殑鑺傜偣榪涜閫氫俊錛岃岀幇濡備粖錛岃鍦板潃浣撶郴宸茬粡琚柊鐨勫疄闄呬笂騫挎硾浣跨敤鐨勫湴鍧浣撶郴鎵鏇挎崲錛屾柊鐨勫湴鍧浣撶郴鏄敱鍏ㄥ眬鍦板潃鍩熷拰閫氳繃NAT鎺ュ叆鍏ㄥ眬鍦板潃鍩熺殑澶ч噺縐佹湁鍦板潃鍩熺粍鎴愩傚湪鏂扮殑鍦板潃浣撶郴涓紙濡傚浘1鎵紺猴級錛屽彧鏈夊湪 “main”鍏ㄥ眬鍦板潃鍩熶腑鐨勮妭鐐瑰彲浠ュ湪緗戠粶涓緢瀹規槗鍦頒笌浠諱綍鍏跺畠鐨勬嫢鏈夊叏灞鍦板潃鐨勮妭鐐歸氫俊錛屽洜涓鴻鑺傜偣鎷ユ湁鍏ㄥ眬鐨勩佸敮涓鐨勩佸彲璺敱鐨勫湴鍧銆傚湪縐佹湁緗戠粶涓殑鑺傜偣鍙互涓庡湪鍚屼竴涓鏈夌綉緇滀腑鐨勫叾瀹冭妭鐐硅繘琛岄氫俊錛屽茍涓斿湪閫氬父鎯呭喌涓嬪彲浠ュ悜鍏ㄥ眬鍦板潃涓殑鏌愪釜“钁楀悕”鐨勮妭鐐瑰彂璧稵CP榪炴帴鎴栧彂閫乁DP鏁版嵁鍖呫侼AT璁懼鍦ㄦ鎵紨鐨勮鑹插氨鏄負浠庡唴緗戝悜鍏綉鍙戣搗鐨勮繛鎺ョ殑鑺傜偣鍒嗛厤涓存椂鐨勮漿鍙憇ession錛屽皢鏉ヨ嚜鍐呯綉鐨勬暟鎹寘鐨勫湴鍧鍜岀鍙h漿鎹負鍏綉鐨勫湴鍧鍜岀鍙o紝灝嗘潵鑷叕緗戠殑鏁版嵁鍖呯殑鍦板潃鍜岀鍙h漿鎹負鍐呯綉鐨勭鍙e拰鍦板潃錛屽悓鏃禢AT灝嗗睆钄芥墍鏈夋湭緇忔巿鏉冪殑鏉ヨ嚜鍏綉鐨勬暟鎹寘銆?/p>
鏂扮殑Internet鍦板潃浣撶郴闈炲父閫傚悎浜?#8220;瀹㈡埛绔?鏈嶅姟鍣?#8221;榪欐牱鐨勯氫俊妯″紡錛屼竴涓吀鍨嬬殑C/S閫氫俊妯″紡鏄細瀹㈡埛绔湪鍐呯綉錛堢鏈夊湴鍧鍩燂級錛屾湇鍔″櫒鍦ㄥ叕緗戯紙鍏ㄥ眬鍦板潃鍩燂級錛岄氳繃NAT灝嗗唴緗戝拰鍏綉榪炴帴璧鋒潵銆傝繖縐嶅湴鍧浣撶郴浣垮緱鍦ㄤ笉鍚屽唴緗戯紙縐佹湁鍦板潃鍩燂級涓殑涓や釜鑺傜偣寰堥毦鐩存帴閫氫俊錛岃岃繖鎭版伆鏄痯2p搴旂敤 (濡傦紝鐢佃瘽浼氳鎴栧湪綰挎父鎴?涓渶鍩烘湰鐨勮姹傘傚緢鏄劇劧錛屾垜浠渶瑕佷竴縐嶆柟娉曞嵆浣垮湪NAT璁懼瀛樺湪鐨勫墠鎻愪笅錛屼粛鐒惰兘澶熸棤闅滅鍦板疄鐜皃2p閫氫俊銆?/div>
鍦ㄤ笉鍚屽唴緗戠殑涓や釜鑺傜偣涔嬮棿寤虹珛p2p榪炴帴鐨勬渶鏈夋晥鐨勬柟娉曞氨鏄?#8220;鎵撴礊”銆傝鎶鏈湪鍩轟簬UDP鐨勫簲鐢ㄧ▼搴忎腑寰楀埌浜嗗箍娉涚殑搴旂敤錛屽悓鏍風殑錛岃鎶鏈篃鍙互鐢ㄤ簬鍩轟簬TCP鐨勫簲鐢ㄧ▼搴忋傛湁瓚g殑鏄紝涓?#8220;鎵撴礊”瀛楅潰涓婄殑鎰忔濆垰濂界浉鍙嶏紝璇ユ妧鏈笉浼氬獎鍝嶅埌鍐呯綉鐨勫畨鍏ㄣ備簨瀹炰笂錛?#8220;鎵撴礊”鎶鏈嬌寰梡2p杞歡鐨勭粷澶ч儴鍒嗗姛鑳介兘鍦∟AT璁懼榛樿鐨勫畨鍏ㄧ瓥鐣ョ殑鎺у埗涔嬩笅錛岃繖浜涢兘鐢盢AT璁懼寤虹珛鐨剆ession鏉ョ鐞嗐傛湰鏂囬槓榪頒簡閫傜敤浜嶶DP鍜孴CP鐨?#8220;鎵撴礊”鎶鏈紝騫惰緇嗘弿榪頒簡閲嶈“鎵撴礊”榪囩▼涓紝搴旂敤紼嬪簭鍜孨AT璁懼涔嬮棿鐨勮涓恒?/div>
涓嶅垢鐨勬槸錛岀敱浜嶯AT璁懼鐨勫搷搴斿拰琛屼負涓嶆槸鏍囧噯鐨勶紝鎵浠ユ病鏈変換浣曟妧鏈彲浠ョ┛瓚婄幇鏈夌殑鎵鏈塏AT璁懼銆傛湰鏂囨彁渚涗簡涓浜涘湪鐜版湁NAT璁懼涓婅繘琛?#8220;鎵撴礊”鐨勫疄楠岀粨鏋溿傛垜浠敹闆嗙殑鏁版嵁鏉ヨ嚜浜庝簰鑱旂綉涓婁嬌鐢ㄤ簡“NAT Check”宸ュ叿騫跺湪澶ч噺涓嶅悓鐢熶駭鍘傚晢鐨凬AT璁懼涓婅繘琛?#8220;鎵撴礊”瀹為獙鐨勭敤鎴楓傜敱浜庢暟鎹槸鏉ヨ嚜浜庝竴涓彨鍋?#8220;self-selecting”鐨勭敤鎴風ぞ鍖猴紝鎴栬涓嶄細瀹屽叏浠h〃鍦↖nternet涓婄湡姝i儴緗插拰浣跨敤鐨凬AT璁懼錛屼絾鏄粨鏋滄棤璁哄浣曡繕鏄緢浠や漢鍏村鐨勩?/div>
鍦ㄥ仛鍩烘湰鐨?#8220;鎵撴礊”鎿嶄綔璇勪及鐨勬椂鍊欙紝鎴戜滑搴旇鎸囧嚭鍦ㄧ幇鏈夌殑NAT璁懼“鎵撴礊”鐨勫鏉傚害涓婏紝涓嶅悓鐨勫鏉傚害浼氭湁涓嶅悓鐨勭粨鏋溿備絾鐩墠鎴戜滑鎶婅璁虹殑閲嶇偣闆嗕腑浜庡紑鍙戞渶綆鍗曠殑錛屽彲浠ュ簲鐢ㄤ簬浠諱綍緗戠粶鎷撴墤緇撴瀯鐨勩佺ǔ瀹氱殑銆佹湁姝g‘NAT鍝嶅簲鐨凬AT璁懼涓婄殑“鎵撴礊”鎶鏈傛垜浠湁鎰忛伩鍏嶄嬌鐢ㄤ竴浜?#8220;鑱槑鐨勫皬鎶婃垙”閫氳繃嬈洪獥鏌愪簺NAT璁懼鏉ヨ揪鍒扮煭鏈熷唴絀胯秺杈冨鐨凬AT璁懼錛屼絾浠庨暱鏈熸潵鐪嬩細寮曡搗緗戠粶鏈煡閿欒鐨勬妧鏈?/div>
灝界寮曞叆IPv6浼氭瀬澶у湴澧炲姞浜掕仈緗戠殑鍦板潃絀洪棿錛屼粠鑰屽噺灝戝浜嶯AT璁懼鐨勯渶姹傞噺錛屼絾鐭湡鍐匢Pv6紜疄澧炲姞浜嗗NAT璁懼鐨勯渶姹傞噺錛屽洜涓?NAT璁懼鏈韓鎻愪緵浜嗕竴縐嶆柟渚跨殑鏂規硶榪涜IPv4涓嶪Pv6鍦板潃鍩熻漿鎹€傚彟澶栫鏈夌綉緇滀笂寤虹珛鍖垮悕鍜屽姞瀵嗚闂妭鐐逛篃鏈夊埄浜庣粍緇囨満鏋勭殑瀹夊叏鎬т互鍙婁笉鍙楀鐣屽共鎵幫紝榪欎簺閮芥剰鍛崇潃NAT榪樺皢瀛樺湪鐩稿綋闀跨殑涓孌墊椂闂淬傚悓鏍鳳紝闃茬伀澧欐妧鏈篃涓嶄細鐢變簬鏈変簡瓚沖鐨刬p鍦板潃鑰屾秷澶憋紝IPv6鐨勯槻鐏浠嶇劧浼氶粯璁や涪鎺夋墍鏈夋湭緇忔巿鏉冪殑鏁版嵁鍖咃紝浠嶇劧鍙互璁╁湪IPv6鐜涓嬪伐浣滅殑搴旂敤紼嬪簭“鎵撴礊”銆?/div>
鏈枃鎺ヤ笅鏉ョ殑閮ㄥ垎鎸夌収濡備笅鐨勬柟寮忕粍緇囷細絎簩绔犱粙緇嶅熀鏈殑NAT絀胯秺姒傚康鍜屾湳璇紱絎笁绔犱粙緇峌DP“鎵撴礊”榪囩▼錛涚鍥涚珷浠嬬粛TCP“鎵撴礊”榪囩▼錛涚浜旂珷浠嬬粛鏀寔“鎵撴礊”鐨凬AT璁懼蹇呴』鍏鋒湁閭d簺鐗規э紱絎叚绔犱粙緇嶆垜浠湪鐩墠嫻佽鐨凬AT璁懼涓婄殑“鎵撴礊”瀹為獙緇撴灉錛涚涓冪珷璁ㄨ鐩稿叧鐨勭綉緇滈棶棰橈紱絎叓绔犲叏鏂囨葷粨浠ュ強緇撴潫璇?/div>
2銆佸熀鏈蹇墊湰鑺備粙緇嶄簡鏈枃浣跨敤鍒扮殑鍩烘湰鐨凬AT鏈錛岀潃閲嶆弿榪頒簡閫傜敤浜嶶DP鍜孴CP涓ょ鍗忚鐨勯氱敤鐨凬AT絀胯秺鎶鏈?/div>
2.1銆丯AT鏈
鏈枃緇濆ぇ閮ㄥ垎鏈鍜屽垎綾繪潵鑷簬RFC 2663瀹氫箟錛屽彟澶栦竴浜涙潵鑷簬杈冩柊鐨凴FC 3489涓殑瀹氫箟銆?/div>
鐞嗚Вsession鏄緢閲嶈鐨勩備竴涓猅CP鎴朥DP鐨剆ession endpoint鏄敱涓涓狪P鍦板潃錛岀鍙e彿緇勬垚錛屾瘡涓猻ession鏄敱涓や釜session endpoint鏋勬垚銆備粠鍐呯綉鑺傜偣鐨勮搴︽潵鐪嬶紝涓涓猻ession鐢?閮ㄥ垎緇勬垚鍒嗗埆涓猴細鏈湴IP錛屾湰鍦扮鍙o紝榪滅IP錛岃繙绔鍙c俿ession鐨勬柟鍚戦氬父浠h〃浜嗘暟鎹寘鐨勫垵濮嬫祦鍔ㄧ殑鏂瑰悜錛涘浜嶵CP鏉ヨ灝辨槸SYN鍖呯殑嫻佸悜錛屽浜嶶DP鏉ヨ灝辨槸絎竴涓敤鎴鋒暟鎹寘鐨勬祦鍚戙?/div>
NAT鏈夊緢澶氱錛屼絾鏈鏅亶鐨勪竴縐嶇被鍨嬪彨鍋?#8220;浼犵粺”NAT錛屾垨鑰?#8220;鍚戝”NAT銆備粬浠湪鍐呯綉鍜屽叕緗戜箣闂存彁渚涗簡涓涓?#8220;涓嶅縐?#8221;妗ョ殑鏄犲皠銆?#8220;鍚戝”NAT鍦ㄩ粯璁ゆ儏鍐典笅鍙厑璁稿悜澶栫殑session絀胯秺NAT錛?/div>
浠庡鍚戝唴鐨勭殑鏁版嵁鍖呴兘浼氳涓㈠純鎺夛紝闄ら潪NAT璁懼浜嬪厛宸茬粡瀹氫箟浜嗚繖浜涗粠澶栧悜鍐呯殑鏁版嵁鍖呮槸宸插瓨鍦ㄧ殑鍐呯綉session鐨勪竴閮ㄥ垎銆?/div>
“澶栧悜”NAT浼氶犳垚p2p鍗忚鐨勬販涔憋紝鍥犱負褰損2p鐨勫弻鏂瑰喅瀹氬悜鍦ㄤ笉鍚孨AT鍚庨潰鐨勫鏂瑰紑濮嬮氫俊鐨勬椂鍊欙紝鏃犺鍝竴鏂硅瘯鍥懼垵濮嬪寲涓涓猻ession錛屽彟涓鏂圭殑NAT閮戒細鎷掔粷榪欎釜璇鋒眰銆侼AT絀胯秺鐨勬牳蹇冩濇兂灝辨槸璁﹑2p鐨勫弻鏂圭殑NAT鐪嬩笂鍘婚兘鏄?#8220;鍚戝”鐨凬AT銆?/div>
“鍚戝”NAT鏈変袱縐嶇被鍨嬶細錛?錛?#8220;鍩虹”NAT錛岃NAT鍙漿鎹P鍦板潃錛屼笉杞崲绔彛鍙楓傦紙2錛塏APT(Network Address/Port Translation)NAPT杞崲鏁翠釜session endpoints銆傜敱浜嶯APT鍏佽鍐呯綉鐨勫涓妭鐐歸氳繃鍏變韓鐨勬柟寮忎嬌鐢ㄥ悓涓涓殑鍏叡鐨処P鍦板潃錛屽洜姝わ紝鏀寔NAPT鐨凬AT璁懼鎵嶄細瓚婃潵瓚婂銆傚敖綆℃湰鏂囬氱瘒璁ㄨ鐨勫唴瀹歸兘鏄熀浜庢敮鎸丯APT鐨凬AT璁懼鐨勶紝浣嗚繖浜涜寰嬪拰鎶鏈悓鏍烽傜敤浜?#8220;鍩虹”NAT銆?/div>
2.2 杞彂鏂瑰紡
鏈鍙潬浣嗗悓鏃朵篃鏄晥鐜囨渶浣庣殑p2p絀胯秺NAT榪涜閫氫俊鐨勬柟娉曟槸閲囩敤綾諱技C/S鏂瑰紡鐨勮漿鍙戙傚亣瀹氫袱涓妭鐐笰鍜孊姣忎釜鑺傜偣閮芥湁鍚戝鐨凾CP鎴朥DP 榪炴帴錛岃仈鍏ュ叕鍏辯殑宸茬煡鏈嶅姟鍣⊿錛孲鐨勫叕緗慖P鍦板潃鏄?8.181.0.31錛岀鍙e彿鏄?234錛堝鍥?鎵紺猴級,姣忎釜瀹㈡埛绔綅浜庝笉鍚岀殑縐佹湁鍐呯綉涓紝騫朵笖瀹冧滑鐨凬AT璁懼濡ㄧ浜嗗鎴風涔嬮棿鐩存帴鐨刾2p榪炴帴銆傚仛涓哄鐩磋繛鏂規鐨勬浛浠f柟妗堬紝涓や釜瀹㈡埛绔彲浠ュ埄鐢ㄥ叕鍏辯殑鏈嶅姟鍣⊿榪涜娑堟伅鐨勮漿鍙戙備緥濡傦紝A涓轟簡灝嗘秷鎭佺粰 B錛孉鍙渶灝嗘秷鎭彂緇橲錛岀劧鍚庣敱S杞彂緇橞錛岃繖涓榪囩▼灝嗕嬌鐢ˋ涓嶣浜嬪厛涓嶴寤虹珛濂界殑榪炴帴銆?/div>
杞彂鏂瑰紡閫氬父鍙兘鍦ㄥ弻鏂瑰鎴風閮借繛鎺ュ埌鏈嶅姟鍣ㄧ殑鏃跺欐湁鏁堛傝繖縐嶆柟寮忕殑緙虹偣鍦ㄤ簬錛屽畠鍋囧畾鏈嶅姟鍣ㄧ殑澶勭悊鑳藉姏鍜岀綉緇滃甫瀹戒互鍙婇氫俊寤惰繜閮芥槸鐞嗘兂鐨勬儏鍐典笅錛屼笉浼氬彈鍒板鎴風涓暟鐨勫獎鍝嶃備絾鏄紝鐢變簬娌℃湁鍏跺畠鐨勬柟娉曡兘澶熷儚杞彂鏂瑰紡閭f牱錛屽彲浠ョ┛瓚婄幇瀛樼殑鎵鏈塏AT璁懼錛屽洜姝ゅ湪鏋勫緩楂樺彲闈犳х殑p2p緋葷粺鐨勬椂鍊欙紝閫氳繃鏈嶅姟鍣ㄨ漿鍙戠殑鏂瑰紡渚濇棫鏄竴涓潪甯告湁鐢ㄧ殑淇濊瘉緋葷粺鍙潬鎬х殑鏂規硶銆俆URN鍗忚瀹氫箟浜嗗浣曞疄鐜板畨鍏ㄧ殑杞彂鏂瑰紡銆?/div>
2.3 鍙嶅悜榪炴帴鏂瑰紡