锘??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区在线免费视频,午夜在线一区二区,欧美日韩不卡在线http://www.shnenglu.com/shootingstars/zh-cnWed, 24 Sep 2025 07:07:37 GMTWed, 24 Sep 2025 07:07:37 GMT60[瀵煎叆]C++涓叧浜庣被涓父鏁伴潤鎬佹垚鍛樺垵濮嬪寲鐨勯棶棰?/title><link>http://www.shnenglu.com/shootingstars/archive/2007/07/31/29071.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 31 Jul 2007 05:17:00 GMT</pubDate><guid>http://www.shnenglu.com/shootingstars/archive/2007/07/31/29071.html</guid><wfw:comment>http://www.shnenglu.com/shootingstars/comments/29071.html</wfw:comment><comments>http://www.shnenglu.com/shootingstars/archive/2007/07/31/29071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shootingstars/comments/commentRss/29071.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shootingstars/services/trackbacks/29071.html</trackback:ping><description><![CDATA[class mytestclass <br>{ <br>public: <br>    const static int i = 5; <br>}; <br>int main() <br>{ <br>    std::cout<<mytestclass::i<<std::endl; <br>    return 0; <br>} <br>緇撴灉娌℃湁闂錛岃緭鍑轟負5錛堢紪璇戝櫒涓簐c7.1錛? <p>浣嗘槸鍦ㄤ笅闈㈣繖涓緥瀛愪腑錛?<br>int regi() <br>{ <br>    return 5; <br>} <br>class mytestclass <br>{ <br>public: <br>    const static int i = regi(); <br>}; <br>int main() <br>{ <br>    std::cout<<mytestclass::i<<std::endl; <br>    return 0; <br>} <br>杈撳嚭鍗翠笉姝g‘錛岃緭鍑轟負0錛堢紪璇戦摼鎺ラ兘娌℃湁闂錛夈傘傘?<br>浼間箮浠g爜騫舵病鏈夋墽琛宺egi鍑芥暟錛?<br><br>鍦–++鏍囧噯涓皢鍒濆鍖栧彉閲忓垎涓?鍔ㄦ佸垵濮嬪寲"鍜?闈欐佸垵濮嬪寲","鍔ㄦ佸垵濮嬪寲"涓哄埄鐢ㄥ嚱鏁拌繘琛屽垵濮嬪寲,"闈欐佸垵濮嬪寲"涓哄父閲忚〃杈懼紡榪涜鍒濆鍖? <br>C++鏍囧噯瀵逛簬綾諱腑鐨勫父閲忚〃杈懼紡鐨?鍔ㄦ佸垵濮嬪寲"浼間箮騫舵湭鍋氳鏄?鎵浠ユ槸鍚︽敮鎸佺被涓父鏁伴潤鎬佸彉閲忕殑鍔ㄦ佸垵濮嬪寲涔熷氨鍙栧喅涓庣紪璇戝櫒鐨勮璁′簡. <br>浣嗘槸鏃犺濡備綍vc7.1鐨勭紪璇戠粨鏋滈兘鏄笉瀵圭殑,瀹冨茍娌℃湁緇欏嚭閿欒,浣嗘槸緇撴灉涓庨昏緫涓嶅悜絎﹀悎,榪欏簲璇ユ槸vc7.1鐨勪竴涓猙ug.(鍦╲s2005涓殑C++緙栬瘧鍣ㄥ凡緇忎慨姝d簡榪欎釜bug,緇欏嚭浜嗕竴涓紪璇慐rror) <br><br>璇︾粏璁ㄨ璇瘋: <br><a >http://community.csdn.net/Expert/topic/4432/4432789.xml?temp=.3202783</a> <br><br>鐗瑰埆鎰熻阿qfeng_zhao 銆?lxpws 銆?iGray 絳夊嚑浣? </p> <img src="http://www.cnblogs.com/shootingstars/aggbug/321956.html" height="1" width="1"><br><br> <div align="right"><a style="text-decoration: none;" target="_blank">shootingstars</a> 2006-01-23 11:46 <a target="_blank" style="text-decoration: none;">鍙戣〃璇勮</a></div> <br>鏂囩珷鏉ユ簮:<a >http://www.cnblogs.com/shootingstars/archive/2006/01/23/321956.html</a> <img src ="http://www.shnenglu.com/shootingstars/aggbug/29071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shootingstars/" target="_blank">shootingstars</a> 2007-07-31 13:17 <a href="http://www.shnenglu.com/shootingstars/archive/2007/07/31/29071.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>boost::regex瀛︿範http://www.shnenglu.com/shootingstars/archive/2007/07/30/29029.htmlshootingstarsshootingstarsMon, 30 Jul 2007 09:30:00 GMThttp://www.shnenglu.com/shootingstars/archive/2007/07/30/29029.htmlhttp://www.shnenglu.com/shootingstars/comments/29029.htmlhttp://www.shnenglu.com/shootingstars/archive/2007/07/30/29029.html#Feedback0http://www.shnenglu.com/shootingstars/comments/commentRss/29029.htmlhttp://www.shnenglu.com/shootingstars/services/trackbacks/29029.htmlboost鐨勬鍒欒〃杈懼紡闇瑕佺紪璇戯紙濡傛灉涓嶉渶瑕佸叏閮˙oost鐨勫姛鑳界殑璇濓紝璇蜂笉瑕乥uild all boost錛岄偅浼氳姳鎺夊ソ鍑犱釜灝忔椂銆傛垜鎺ㄨ崘浠呬粎build闇瑕佺殑搴撳氨濂姐傦級
鍘熸湁鐨刡oost 1.33浼間箮浣跨敤vc8緙栬瘧鐨勬椂鍊欐湁闂銆備笅杞絙oost 1.34.1錛屼嬌鐢?#8220;Visual Studio 2005 Command Prompt”錛岃繘鍏ュ埌boost_1_34_1\libs\regex\build錛?br>nmake vc8.mak
OK錛岀敓鎴愮殑鏂囦歡鍦╲c80涓嬨?br>
浜岋細瀛︿範姝e垯琛ㄨ揪寮?br>http://www.shnenglu.com/Files/shootingstars/deelx_zh.rar
涓嶉敊鐨勬鍒欒〃杈懼紡鐨勫涔犺祫鏂欙紝欏轟究鎺ㄨ崘涓涓嬶細
http://www.regexlab.com/
榪欎釜绔欓暱榪樹笌鎴戞湁涓竴淇′箣緙橈紙鎴戝啓鐨?a title="P2P涔婾DP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級" href="http://www.shnenglu.com/shootingstars/archive/2007/06/12/26140.html">P2P涔婾DP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級錛夈傜珯闀跨殑榪欎釜姝e垯搴撳湪CodeProject鑾峰緱浜嗕笉閿欑殑璇勪環銆?br>
涓夛細綆鍗曠殑渚嬪瓙
    std::string regstr = "a+";
    boost::regex expression(regstr);
    std::string testString = "aaa";

    // 鍖歸厤鑷沖皯涓涓猘
    if( boost::regex_match(testString, expression) )
    {
        std::cout<< "Match" << std::endl;
    }
    else
    {
        std::cout<< "Not Match" << std::endl;
    }


]]>
boost::algorithm瀛︿範http://www.shnenglu.com/shootingstars/archive/2007/07/26/28813.htmlshootingstarsshootingstarsThu, 26 Jul 2007 06:12:00 GMThttp://www.shnenglu.com/shootingstars/archive/2007/07/26/28813.htmlhttp://www.shnenglu.com/shootingstars/comments/28813.htmlhttp://www.shnenglu.com/shootingstars/archive/2007/07/26/28813.html#Feedback0http://www.shnenglu.com/shootingstars/comments/commentRss/28813.htmlhttp://www.shnenglu.com/shootingstars/services/trackbacks/28813.html澶у皬鍐欒漿鎹紱
鍘婚櫎鏃犳晥瀛楃錛?
璋撹瘝錛?
鏌ユ壘錛?
鍒犻櫎/鏇挎崲錛?
鍒囧壊錛?
榪炴帴錛?
鎴戜滑鐢ㄥ啓渚嬪瓙鐨勬柟寮忔潵浜嗚Вboost::algorithm鑳藉涓烘垜浠仛浜涗粈涔堛?nbsp; 闃呰鍏ㄦ枃

]]>
鏄垜rp涓嶅ソ錛岃繕鏄疢icrosoft鐨剅p涓嶅ソ銆傘傘?/title><link>http://www.shnenglu.com/shootingstars/archive/2007/06/19/26639.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 19 Jun 2007 09:26:00 GMT</pubDate><guid>http://www.shnenglu.com/shootingstars/archive/2007/06/19/26639.html</guid><wfw:comment>http://www.shnenglu.com/shootingstars/comments/26639.html</wfw:comment><comments>http://www.shnenglu.com/shootingstars/archive/2007/06/19/26639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shootingstars/comments/commentRss/26639.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shootingstars/services/trackbacks/26639.html</trackback:ping><description><![CDATA[紼嬪簭鍘熸潵涓鐩磋窇鐨勬尯濂界殑銆傘傘?br>But浠庢槰澶╀笅鍗堝紑濮嬶紝娌℃湁淇敼浠諱綍浠g爜錛岀紪璇戠▼搴忥紝鐒跺悗榪愯銆傘傘傛姤閿欙紝璇翠粈涔坆uffer overrun閿欒銆傚摝錛屼互鍓嶉亣鍒拌繃綾諱技鎯呭喌錛屽彲鑳芥槸鍔ㄦ佸簱鍜宭ib鏂囦歡涓嶄竴鑷村鑷寸殑銆傛病鍏崇郴錛孯eBuild鏁翠釜欏圭洰錛堝緱紼嶅井鑺辯偣鏃墮棿錛屽懙鍛碉紝涔樼潃榪欎釜鏈轟細錛屼笂緗戞簻杈句細錛夈傝姳浜?5鍒嗛挓錛孊uild瀹屼簡銆傛弧鎬淇″績鐨勬墽琛屻傘傘傚晩錛屽張鎶ラ敊浜嗐傘傘傝繕鏄悓鏍風殑闂銆傚棷錛屾兂鎯籌紝闅鵑亾鏄疺ss涓婇潰鏈変漢淇敼涓滆タ浜嗭紝鎴戞棤鎰忛棿鑾峰彇浜嗘渶鏂扮増鏈紵鏈夎繖涓彲鑳姐備簬鏄笂Vss鐪婼how History銆備技涔庤繖鍑犲ぉ浠g爜閮芥病鏈夊彉鍖栥傘傘傞偅鏄粈涔堥棶棰橈紵鎴戝氨涓嶄俊閭簡錛屽啀嬈eBuild錛屽張鏄竴涓?5鍒嗛挓銆傝繍琛岋紝鍑洪敊銆傚晩銆傘傘?br>浜庢槸涓奼oogle鎼滅儲鍑洪敊淇℃伅錛屽棷錛屾湁閭h竟鍑犻〉錛屼笉榪囩湅瀹屼簡錛岃涔堟槸娌℃湁鍥炲錛岃涔堣窡鎴戠殑鎯呭喌鐗涘ご涓嶅椹槾銆傚棷錛岀湅鏉ヨ繖縐嶆儏鍐佃繕鎸虹壒孌婏紝鐪嬫潵榪樺緱鑷姏鏇寸敓浜嗐?br>浜庢槸鍒犻櫎鎵鏈変唬鐮侊紝浠嶸ss鍦ㄤ笅杞芥渶鏂扮殑錛屽啀嬈eBuild銆傚棷錛岀紪璇戞病鏈夐敊錛岃繍琛屻傘傘傚棷錛屼篃涓嶇畻鏈夐敊錛屽彧涓嶈繃涓涓涓夋柟鐨勫簱榪愯鏃舵姤浜嗕釜寮傚父銆傝繖涓傘傘傚啀嬈℃鏌ヤ唬鐮侊紝娌℃湁鍙戠幇闂銆傛睏錛屼簬鏄嚭鏉ヤ簡銆傘傘?br><br>浠婂ぉ鏃╀笂涓婄彮緇х畫鍊掕吘錛岃繖涓猇ss鐗堟湰鏈夐棶棰橈紝涓嬩釜浠ュ墠鐨凩abel鐨勶紝搴旇涓嶄細鏈夐棶棰樹簡鍚с備簬鏄啀嬈eBuild錛岃繍琛岋紝榪欏洖涓嶅啀鏄痓uffer overrun錛屼篃涓嶆槸寮傚父浜嗭紝鑰屾槸鎶eap corruption銆傛垜鏅曞掍腑銆傘傘?br><br>鍦ㄩ噸鏂癛eBuild浜唍鍥炲悗錛岃姳浜唍涓?5鍒嗛挓鍚庛傛垜褰誨簳娌¤緳浜嗐備簬鏄垜鍚戜笂甯濈紲鳳紝紲炲晩錛屾晳鏁戞垜鍚с?br><br>浜庢槸錛岀鍚埌浜嗭紝鍙戝嚭浜嗗畠鐨勭鍔涳紝鍦ㄦ垜鐧捐埇鏃犺禆錛屾墜瓚蟲棤鎺殑鏃跺欙紝鎴戝啀嬈′笅杞界殑鏈鏂扮殑Vss浠g爜鐗堟湰錛孯eBuild錛屼簬鏄繍琛岄氳繃銆?br><br>鍡紝鍞夛紝鏄垜rp涓嶅ソ錛岃繕鏄疢icrosoft鐨剅p涓嶅ソ錛堟垜鐢ㄧ殑VC8錛夈傘傘傛垜鏃犺錛屽笇鏈涢珮浜烘寚鐐歸棶棰樺師鍥犮?br><img src ="http://www.shnenglu.com/shootingstars/aggbug/26639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-19 17:26 <a href="http://www.shnenglu.com/shootingstars/archive/2007/06/19/26639.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浜旂榪唬鍣?/title><link>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26264.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Wed, 13 Jun 2007 10:35:00 GMT</pubDate><guid>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26264.html</guid><wfw:comment>http://www.shnenglu.com/shootingstars/comments/26264.html</wfw:comment><comments>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shootingstars/comments/commentRss/26264.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shootingstars/services/trackbacks/26264.html</trackback:ping><description><![CDATA[1 InputIterator 鍙互琚敤鏉ヨ鍙栧鍣ㄤ腑鐨勫厓绱犱絾鏄笉淇濊瘉鏀寔鍚戝鍣ㄧ殑鍐欏叆鎿嶄綔<br>InputIterator 蹇呴』鎻愪緵涓嬪垪鏈灝忔敮鎸佹彁渚涘叾浠栨敮鎸佺殑iterator 涔熷彲琚敤浣淚nputIterator 鍙<br>瀹冧滑婊¤凍榪欎釜鏈灝忚姹傞泦涓や釜iterator 鐨勭浉絳夊拰涓嶇浉絳夋祴璇曢氳繃operator ++ 鐨勫墠緗拰<br>鍚庣疆瀹炰緥鍚戝墠閫掑iterator 鎸囧悜涓嬩竴涓厓绱犻氳繃瑙e紩鐢ㄦ搷浣滅operator * 璇誨彇涓涓厓绱?br>姹傚湪榪欎釜灞傛涓婃彁渚涙敮鎸佺殑娉涘瀷綆楁硶鍖呮嫭find() accumulate()鍜宔qual() 浠諱綍涓涓畻娉曞鏋?br>瑕佹眰InputIterator 閭d箞鎴戜滑涔熷彲浠ュ悜鍏朵紶閫掔3 4 5 欏瑰垪鍑虹殑iterator 綾誨埆涓殑浠諱竴涓?br><span style="font-weight: bold;">鍗籌細鍙鏌愪釜綾誨疄鐜頒笂闈㈢殑鎿嶄綔鏃㈠彲浠ヨ璁や負鏄疘nputIterator銆?/span><br>2 OutputIterator 鍙互琚涓烘槸涓嶪nputIterator 鍔熻兘鐩稿弽鐨刬terator 鍗沖畠鍙互琚敤鏉ュ悜瀹?br>鍣ㄥ啓鍏ュ厓绱犱絾鏄笉淇濊瘉鏀寔璇誨彇瀹瑰櫒鐨勫唴瀹筄utputIterator 涓鑸鐢ㄤ綔綆楁硶鐨勭涓変釜瀹炲弬<br>鏍囪鍑鴻搗濮嬪啓鍏ョ殑浣嶇疆渚嬪copy()鍙朞utputIterator 浣滀負絎笁涓疄鍙備換浣曚竴涓畻娉曞鏋?br>瑕佹眰OutputIterator 閭d箞鎴戜滑涔熷彲浠ュ悜鍏朵紶閫掔3 4 5 欏瑰垪鍑虹殑iterator 綾誨埆涓殑浠諱竴涓?br><span style="font-weight: bold;">娉ㄦ剰錛氳繖涓凱浠e櫒浼間箮浠呬粎瀹炵幇浜嗚祴鍊兼搷浣滃嵆鍙? </span><br>3 ForwardIterator 鍙互琚敤鏉ヤ互鏌愪竴涓亶鍘嗘柟鍚戞槸鐨勪笅涓涓被鍒敮鎸佸弻鍚戦亶鍘嗗悜<br>瀹瑰櫒璇繪垨鍐欐湁浜涙硾鍨嬬畻娉曡嚦灝戣姹侳orwardIterator 鍖呮嫭adjacent_find() swap_range()鍜?br>replace() 褰撶劧浠諱綍瑕佹眰ForwardIterator 鏀寔鐨勭畻娉曢兘鍙互鍚戝叾浼犻掔4 鍜? 欏瑰畾涔夌殑iterator<br>綾誨埆<br><span style="font-weight: bold;">娉ㄦ剰錛氳繖涓凱浠e櫒鏃㈢鍚圛nputIterator鍙堢鍚圤utputIterator錛屽悓鏍蜂笅闈袱涓篃鏄繖鏍楓傛敮鎸?/span><span style="font-weight: bold;">operator++鎿嶄綔</span><br>4 BidirectionalIterator 浠庝袱涓柟鍚戣鎴栧啓涓涓鍣ㄦ湁浜涙硾鍨嬬畻娉曡嚦灝戣姹?br>BidirectionalIterator 鍖呮嫭inplace_merge() next_permutation()鍜宺everse()<br><span style="font-weight: bold;">娉ㄦ剰錛氱戶鎵?錛?錛?鐨勭壒鎬э紝騫朵笖鏀寔</span><span style="font-weight: bold;">operator--鎿嶄綔</span><br>5 RandomAccessIterator 闄や簡鏀寔BidirectionalIterator 鎵鏈夌殑鍔熻兘涔嬪榪樻彁渚涗簡鍦?br>甯告暟鏃墮棿鍐呰闂鍣ㄧ殑浠繪剰浣嶇疆鐨勬敮鎸佽姹俁andomAccessIterator 鏀寔鐨勬硾鍨嬬畻娉曞寘鎷?br>binary_search() sort_heap()鍜宯th_element() <br><span style="font-weight: bold;">娉ㄦ剰錛?/span><span style="font-weight: bold;">緇ф壙1錛?錛?鐨勭壒鎬э紝騫朵笖</span><span style="font-weight: bold;">絎﹀悎闅忔満璁塊棶絳栫暐錛屽嵆鏀寔operator[]鎿嶄綔</span><br> <img src ="http://www.shnenglu.com/shootingstars/aggbug/26264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-13 18:35 <a href="http://www.shnenglu.com/shootingstars/archive/2007/06/13/26264.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>C++娉涘瀷綆楁硶絎旇錛?錛?/title><link>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26263.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Wed, 13 Jun 2007 10:14:00 GMT</pubDate><guid>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26263.html</guid><wfw:comment>http://www.shnenglu.com/shootingstars/comments/26263.html</wfw:comment><comments>http://www.shnenglu.com/shootingstars/archive/2007/06/13/26263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shootingstars/comments/commentRss/26263.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shootingstars/services/trackbacks/26263.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">find</span><br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ForwardIterator, </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Type </span><span style="color: #000000;">></span><span style="color: #000000;"><br>ForwardIterator<br>find( ForwardIterator first, ForwardIterator last, Type value )</span><span style="color: #000000;"><br></span></div> find榪斿洖涓涓凱浠e櫒錛岃〃鏄庢槸鍚︽壘鍒板厓绱狅紝濡傛灉鎵句笉鍒拌繑鍥炲弬鏁扮殑last銆?br>鍙傛暟<br>first錛氬紑濮嬫悳绱㈢殑絎竴涓厓绱?br>last錛氭悳绱㈠埌姝ゅ厓绱犱箣鍓嶏紝涓嶅寘鎷鍏冪礌<br>value錛氶渶瑕佹悳绱㈢殑鍊?br><br><span style="font-weight: bold;">back_inserter</span><br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template</span><span style="color: #000000;"><</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> _Container</span><span style="color: #000000;">></span><span style="color: #000000;"><br>back_insert_iterator</span><span style="color: #000000;"><</span><span style="color: #000000;">_Container</span><span style="color: #000000;">></span><span style="color: #000000;"><br>back_inserter(_Container</span><span style="color: #000000;">&</span><span style="color: #000000;"> _Cont)</span></div> 榪欎釜鍑芥暟榪斿洖涓涓凱浠e櫒<span style="color: #000000;">back_insert_iterator</span><span style="color: #000000;"><</span><span style="color: #000000;">_Container</span><span style="color: #000000;">>錛岃繖涓凱浠e櫒鏄粠OutputIterator緇ф壙榪囨潵鐨勶紝琛ㄦ槑榪欎釜榪唬鍣ㄥ彲浠ヨ鍐欏叆銆傝繖涓凱浠e櫒閲嶅啓浜嗚祴鍊兼搷浣滐紝鍦ㄨ祴鍊兼搷浣滀腑浣跨敤push_back灝嗗厓绱犳彃鍏ュ鍣ㄤ腑銆?br>鍙傛暟<br>_Cont錛氬笇鏈涜鎻掑叆鍊肩殑瀹瑰櫒<br><br><span style="font-weight: bold;">copy</span><br></span> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> InputIterator, </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> OutputIterator </span><span style="color: #000000;">></span><span style="color: #000000;"><br>OutputIterator<br>copy( InputIterator first1, InputIterator last,<br>OutputIterator first2 );</span></div> 榪欎釜鍑芥暟榪斿洖涓涓狾utputIterator榪唬鍣?br>鍙傛暟<br>first錛氬紑濮嬫嫹璐濈殑絎竴涓厓绱?br>last錛氭嫹璐濆埌姝ゅ厓绱犱箣鍓嶏紝涓嶅寘鎷鍏冪礌<br>first2錛氭嫹璐濆埌姝よ凱浠e櫒銆傛垜浠彲浠ヤ嬌鐢ㄤ笂闈㈢殑back_inserter鍑芥暟榪斿洖鐨凮utputIterator <br> <img src ="http://www.shnenglu.com/shootingstars/aggbug/26263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-13 18:14 <a href="http://www.shnenglu.com/shootingstars/archive/2007/06/13/26263.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>濡備綍鍒犻櫎C++瀹瑰櫒涓殑鍊?/title><link>http://www.shnenglu.com/shootingstars/archive/2007/06/12/26144.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 12 Jun 2007 09:37:00 GMT</pubDate><guid>http://www.shnenglu.com/shootingstars/archive/2007/06/12/26144.html</guid><wfw:comment>http://www.shnenglu.com/shootingstars/comments/26144.html</wfw:comment><comments>http://www.shnenglu.com/shootingstars/archive/2007/06/12/26144.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/shootingstars/comments/commentRss/26144.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shootingstars/services/trackbacks/26144.html</trackback:ping><description><![CDATA[C++鐨勫鍣ㄤ腑涓鑸兘鎻愪緵erase鍑芥暟錛屾鍑芥暟鎺ユ敹鐨勫弬鏁頒竴鑸湁涓涓槸涓涓凱浠e櫒錛?br>濡傛灉鍒犻櫎鏌愪竴涓肩殑璇濓紝鎴戜滑鍙兘涓鑸兘鐢ㄨ繃錛?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> todo insert items<img style="width: 30px; height: 20px;" src="http://www.shnenglu.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator i </span><span style="color: #000000;">=</span><span style="color: #000000;"> c.begin(); i</span><span style="color: #000000;">!=</span><span style="color: #000000;"> c.end(); </span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">></span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>    {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 濡傛灉鏈変竴涓煎ぇ浜?0錛屽垹闄や箣</span><span style="color: #008000;"><br></span><span style="color: #000000;">        c.erase(i);<br>        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>    }<br>}<br></span></div> 涓婅堪浠g爜鍦ㄥ垹闄や竴涓厓绱犵殑鏃跺欏茍娌℃湁闂銆傘傘備絾鏄垜浠兂鍒犻櫎鎵鏈夊ぇ浜?0鐨勫鹼紝浜庢槸錛?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> todo insert items</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator i </span><span style="color: #000000;">=</span><span style="color: #000000;"> c.begin(); i</span><span style="color: #000000;">!=</span><span style="color: #000000;"> c.end(); </span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">></span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>    {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鍒犻櫎鎵鏈夊ぇ浜?0鐨勫?/span><span style="color: #008000;"><br></span><span style="color: #000000;">        c.erase(i);<br>    }<br>}</span></div> 婊℃甯屾湜鐨勭紪璇戯紝榪愯銆傘傘備簬鏄紓甯稿彂鐢熴傘傘?br>鍟娿傘傘傚摝銆傘傘?br>鍘熸潵鏄垹闄よ凱浠e櫒i鍚庯紝i鎵鎸囩殑鍏冪礌宸茬粡澶辨晥浜嗭紝鐒跺悗緇檌++錛屽畠宸茬粡涓嶅湪瀛樺湪浜嗐傘傘備簬鏄粸灝借剳姹侊紝鍑虹浜嗕笅闈㈢殑浠g爜錛?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> todo insert items</span><span style="color: #008000;"><br></span><span style="color: #000000;">list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator nextitr </span><span style="color: #000000;">=</span><span style="color: #000000;"> c.begin();<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator i </span><span style="color: #000000;">=</span><span style="color: #000000;"> c.begin();;)<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(nextitr </span><span style="color: #000000;">==</span><span style="color: #000000;"> c.end())<br>        </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>    </span><span style="color: #000000;">++</span><span style="color: #000000;">nextitr;<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">></span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>    {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 濡傛灉鏈変竴涓煎ぇ浜?0錛屽垹闄や箣</span><span style="color: #008000;"><br></span><span style="color: #000000;">        c.erase(i);<br>    }<br>    i </span><span style="color: #000000;">=</span><span style="color: #000000;"> nextitr;<br>}<br></span></div> 涓婇潰鐨勪唬鐮佸緢瀹規槗鐞嗚В錛屽嵆鍦ㄥ垹闄や竴涓凱浠e櫒涔嬪墠錛屾妸瀹冪殑涔嬪悗鐨勮凱浠e櫒鍏堝瓨鍌紝鐒跺悗鍦ㄤ笅嬈″驚鐜殑鏃跺欏埄鐢ㄤ箣鍓嶅瓨鍌ㄧ殑榪唬鍣ㄣ?br>OK錛屾垜浠湅鍒頒笂闈㈣繖孌典唬鐮佸彲浠ュ伐浣滀簡錛岃涓轟技涔庝篃榪樻紜紝鍙槸銆傘傘備唬鐮佷技涔庡浜嗙偣銆傛垜鎯充唬鐮佽兘澶熷皯鐐瑰氨濂戒簡錛岄昏緫涔熶笉瑕侀偅涔堥夯鐑︺傞偅涔堟垜浠湅涓嬮潰鐨勪唬鐮侊紙杞澆鑷狤ffective STL錛夈?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> todo insert items</span><span style="color: #008000;"></span><span style="color: #000000;"></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator i </span><span style="color: #000000;">=</span><span style="color: #000000;"> c.begin(); i</span><span style="color: #000000;">!=</span><span style="color: #000000;"> c.end();)<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">></span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>    {<br>        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 濡傛灉鏈変竴涓煎ぇ浜?0錛屽垹闄や箣</span><span style="color: #008000;"><br></span><span style="color: #000000;">        c.erase(i</span><span style="color: #000000;">++</span><span style="color: #000000;">);<br>    }<br>    </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>        i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>}<br></span></div> 鍡傘傘傞珮鎵嬪氨鏄珮鎵嬶紙鎴戜互鍓嶆牴鏈病鏈夊湪鎰忚繃++i鍜宨++鍦ㄤ嬌鐢ㄧ殑榪囩▼涓兘鏈夎繖涔堝ぇ鐨勫尯鍒級<br>濂戒簡錛屾渶鍚庡啀鎻愪緵涓涓増鏈紝鍒╃敤list鐨剅emove_if鍑芥暟銆?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">bool</span><span style="color: #000000;"> fun(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i)<br>{<br>    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(i</span><span style="color: #000000;">></span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>    </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>}<br><br>list</span><span style="color: #000000;"><</span><span style="color: #0000ff;">int</span><span style="color: #000000;">></span><span style="color: #000000;"> c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> todo insert items</span><span style="color: #008000;"><br></span><span style="color: #000000;">c.remove_if(fun);</span></div> 鍡紝鍏跺疄鍒犻櫎涓涓鍣ㄤ腑鐨勫肩殑鏂瑰紡榪樻槸鎸哄鐨勩?br> <img src ="http://www.shnenglu.com/shootingstars/aggbug/26144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-12 17:37 <a href="http://www.shnenglu.com/shootingstars/archive/2007/06/12/26144.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>P2P涔婾DP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級http://www.shnenglu.com/shootingstars/archive/2007/06/12/26140.htmlshootingstarsshootingstarsTue, 12 Jun 2007 05:23:00 GMThttp://www.shnenglu.com/shootingstars/archive/2007/06/12/26140.htmlhttp://www.shnenglu.com/shootingstars/comments/26140.htmlhttp://www.shnenglu.com/shootingstars/archive/2007/06/12/26140.html#Feedback3http://www.shnenglu.com/shootingstars/comments/commentRss/26140.htmlhttp://www.shnenglu.com/shootingstars/services/trackbacks/26140.html浣滆咃細shootingstars | 鏃ユ湡錛?004-05-25 | 瀛椾綋錛氬ぇ 涓?灝?br>
P2P 涔?UDP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級
鍘熷垱錛歴hootingstars
鍙傝冿細http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt

璁哄潧涓婄粡甯告湁瀵筆2P鍘熺悊鐨勮璁猴紝浣嗘槸璁ㄨ褰掕璁猴紝寰堝皯鏈夊疄璐ㄧ殑涓滆タ浜х敓錛堟簮浠g爜錛夈傚懙鍛碉紝鍦ㄨ繖閲屾垜灝辯敤鑷繁瀹炵幇鐨勪竴涓簮浠g爜鏉ヨ鏄嶶DP絀胯秺NAT鐨勫師鐞嗐?br>
棣栧厛鍏堜粙緇嶄竴浜涘熀鏈蹇碉細
    NAT(Network Address Translators)錛岀綉緇滃湴鍧杞崲錛氱綉緇滃湴鍧杞崲鏄湪IP鍦板潃鏃ョ泭緙轟箯鐨勬儏鍐典笅浜х敓鐨勶紝瀹冪殑涓昏鐩殑灝辨槸涓轟簡鑳藉鍦板潃閲嶇敤銆侼AT鍒嗕負涓ゅぇ綾伙紝鍩烘湰鐨凬AT鍜孨APT(Network Address/Port Translator)銆?br>    鏈寮濮婲AT鏄繍琛屽湪璺敱鍣ㄤ笂鐨勪竴涓姛鑳芥ā鍧椼?br>   
    鏈鍏堟彁鍑虹殑鏄熀鏈殑NAT錛屽畠鐨勪駭鐢熷熀浜庡涓嬩簨瀹烇細涓涓鏈夌綉緇滐紙鍩燂級涓殑鑺傜偣涓彧鏈夊緢灝戠殑鑺傜偣闇瑕佷笌澶栫綉榪炴帴錛堝懙鍛碉紝榪欐槸鍦ㄤ笂涓栫邯90騫翠唬涓湡鎻愬嚭鐨勶級銆傞偅涔堣繖涓瓙緗戜腑鍏跺疄鍙湁灝戞暟鐨勮妭鐐歸渶瑕佸叏鐞冨敮涓鐨処P鍦板潃錛屽叾浠栫殑鑺傜偣鐨処P鍦板潃搴旇鏄彲浠ラ噸鐢ㄧ殑銆?br>    鍥犳錛屽熀鏈殑NAT瀹炵幇鐨勫姛鑳藉緢綆鍗曪紝鍦ㄥ瓙緗戝唴浣跨敤涓涓繚鐣欑殑IP瀛愮綉孌碉紝榪欎簺IP瀵瑰鏄笉鍙鐨勩傚瓙緗戝唴鍙湁灝戞暟涓浜汭P鍦板潃鍙互瀵瑰簲鍒扮湡姝e叏鐞冨敮涓鐨?IP鍦板潃銆傚鏋滆繖浜涜妭鐐歸渶瑕佽闂閮ㄧ綉緇滐紝閭d箞鍩烘湰NAT灝辮礋璐e皢榪欎釜鑺傜偣鐨勫瓙緗戝唴IP杞寲涓轟竴涓叏鐞冨敮涓鐨処P鐒跺悗鍙戦佸嚭鍘匯?鍩烘湰鐨凬AT浼氭敼鍙業P 鍖呬腑鐨勫師IP鍦板潃錛屼絾鏄笉浼氭敼鍙業P鍖呬腑鐨勭鍙?
    鍏充簬鍩烘湰鐨凬AT鍙互鍙傜湅RFC 1631
   
    鍙﹀涓縐峃AT鍙仛NAPT錛屼粠鍚嶇О涓婃垜浠篃鍙互鐪嬪緱鍑猴紝NAPT涓嶄絾浼氭敼鍙樼粡榪囪繖涓狽AT璁懼鐨処P鏁版嵁鎶ョ殑IP鍦板潃錛岃繕浼氭敼鍙業P鏁版嵁鎶ョ殑 TCP/UDP绔彛銆傚熀鏈琋AT鐨勮澶囧彲鑳芥垜浠鐨勪笉澶氾紙鍛靛懙錛屾垜娌℃湁瑙佸埌榪囷級錛孨APT鎵嶆槸鎴戜滑鐪熸璁ㄨ鐨勪富瑙掋傜湅涓嬪浘錛?br>                                Server S1                        
                         18.181.0.31:1235                         
                                      |
          ^  Session 1 (A-S1)  ^      |
          |  18.181.0.31:1235  |      |  
          v 155.99.25.11:62000 v      |   
                                      |
                                     NAT
                                 155.99.25.11
                                      |
          ^  Session 1 (A-S1)  ^      |
          |  18.181.0.31:1235  |      |
          v   10.0.0.1:1234    v      |
                                      |
                                   Client A
                                10.0.0.1:1234
    鏈変竴涓鏈夌綉緇?0.*.*.*錛孋lient A鏄叾涓殑涓鍙拌綆楁満錛岃繖涓綉緇滅殑緗戝叧錛堜竴涓狽AT璁懼錛夌殑澶栫綉IP鏄?55.99.25.11(搴旇榪樻湁涓涓唴緗戠殑IP鍦板潃錛屾瘮濡?10.0.0.10)銆傚鏋淐lient A涓殑鏌愪釜榪涚▼錛堣繖涓繘紼嬪垱寤轟簡涓涓猆DP Socket,榪欎釜Socket緇戝畾1234绔彛錛夋兂璁塊棶澶栫綉涓繪満18.181.0.31鐨?235绔彛錛岄偅涔堝綋鏁版嵁鍖呴氳繃NAT鏃朵細鍙戠敓浠涔堜簨鎯呭憿錛?br>    棣栧厛NAT浼氭敼鍙樿繖涓暟鎹寘鐨勫師IP鍦板潃錛屾敼涓?55.99.25.11銆傛帴鐫NAT浼氫負榪欎釜浼犺緭鍒涘緩涓涓猄ession錛圫ession鏄竴涓娊璞$殑姒傚康錛屽鏋滄槸TCP錛屼篃璁窼ession鏄敱涓涓猄YN鍖呭紑濮嬶紝浠ヤ竴涓狥IN鍖呯粨鏉熴傝孶DP鍛紝浠ヨ繖涓狪P鐨勮繖涓鍙g殑絎竴涓猆DP寮濮嬶紝緇撴潫鍛紝鍛靛懙錛屼篃璁告槸鍑犲垎閽燂紝涔熻鏄嚑灝忔椂錛岃繖瑕佺湅鍏蜂綋鐨勫疄鐜頒簡錛夊茍涓旂粰榪欎釜Session鍒嗛厤涓涓鍙o紝姣斿62000錛岀劧鍚庢敼鍙樿繖涓暟鎹寘鐨勬簮绔彛涓?2000銆傛墍浠ユ湰鏉ユ槸錛?0.0.0.1:1234->18.181.0.31:1235錛夌殑鏁版嵁鍖呭埌浜嗕簰鑱旂綉涓婂彉涓轟簡錛?55.99.25.11:62000 ->18.181.0.31:1235錛夈?br>    涓鏃AT鍒涘緩浜嗕竴涓猄ession鍚庯紝NAT浼氳浣?2000绔彛瀵瑰簲鐨勬槸10.0.0.1鐨?234绔彛錛屼互鍚庝粠18.181.0.31鍙戦佸埌 62000绔彛鐨勬暟鎹細琚玁AT鑷姩鐨勮漿鍙戝埌10.0.0.1涓娿傦紙娉ㄦ剰錛氳繖閲屾槸璇?8.181.0.31鍙戦佸埌62000绔彛鐨勬暟鎹細琚漿鍙戯紝鍏朵粬鐨?IP鍙戦佸埌榪欎釜绔彛鐨勬暟鎹皢琚玁AT鎶涘純錛夎繖鏍稢lient A灝變笌Server S1寤虹珛浠ヤ簡涓涓繛鎺ャ?br>
    鍛靛懙錛屼笂闈㈢殑鍩虹鐭ヨ瘑鍙兘寰堝浜洪兘鐭ラ亾浜嗭紝閭d箞涓嬮潰鏄叧閿殑閮ㄥ垎浜嗐?br>    鐪嬬湅涓嬮潰鐨勬儏鍐碉細
    Server S1                                     Server S2
 18.181.0.31:1235                              138.76.29.7:1235
        |                                             |
        |                                             |
        +----------------------+----------------------+
                               |
   ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
   |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
   v 155.99.25.11:62000 v      |      v 155.99.25.11:62000 v
                               |
                            Cone NAT
                          155.99.25.11
                               |
   ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
   |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
   v   10.0.0.1:1234    v      |      v   10.0.0.1:1234    v
                               |
                            Client A
                         10.0.0.1:1234
    鎺ヤ笂闈㈢殑渚嬪瓙錛屽鏋淐lient A鐨勫師鏉ラ偅涓猄ocket(緇戝畾浜?234绔彛鐨勯偅涓猆DP Socket)鍙堟帴鐫鍚戝彟澶栦竴涓猄erver S2鍙戦佷簡涓涓猆DP鍖咃紝閭d箞榪欎釜UDP鍖呭湪閫氳繃NAT鏃朵細鎬庝箞鏍峰憿錛?br>    榪欐椂鍙兘浼氭湁涓ょ鎯呭喌鍙戠敓錛屼竴縐嶆槸NAT鍐嶆鍒涘緩涓涓猄ession錛屽茍涓斿啀嬈′負榪欎釜Session鍒嗛厤涓涓鍙e彿錛堟瘮濡傦細62001錛夈傚彟澶栦竴縐嶆槸 NAT鍐嶆鍒涘緩涓涓猄ession錛屼絾鏄笉浼氭柊鍒嗛厤涓涓鍙e彿錛岃屾槸鐢ㄥ師鏉ュ垎閰嶇殑绔彛鍙?2000銆傚墠涓縐峃AT鍙仛Symmetric NAT錛屽悗涓縐嶅彨鍋欳one NAT銆傛垜浠湡鏈涙垜浠殑NAT鏄浜岀錛屽懙鍛碉紝濡傛灉浣犵殑NAT鍒氬ソ鏄涓縐嶏紝閭d箞寰堝彲鑳戒細鏈夊緢澶歅2P杞歡澶辯伒銆傦紙鍙互搴嗗垢鐨勬槸錛岀幇鍦ㄧ粷澶у鏁扮殑NAT灞炰簬鍚庤咃紝鍗矯one NAT錛?br> 
    濂戒簡錛屾垜浠湅鍒幫紝閫氳繃NAT,瀛愮綉鍐呯殑璁$畻鏈哄悜澶栬繛緇撴槸寰堝鏄撶殑錛圢AT鐩稿綋浜庨忔槑鐨勶紝瀛愮綉鍐呯殑鍜屽緗戠殑璁$畻鏈轟笉鐢ㄧ煡閬揘AT鐨勬儏鍐碉級銆?br>    浣嗘槸濡傛灉澶栭儴鐨勮綆楁満鎯寵闂瓙緗戝唴鐨勮綆楁満灝辨瘮杈冨洶闅句簡錛堣岃繖姝f槸P2P鎵闇瑕佺殑錛夈?br>    閭d箞鎴戜滑濡傛灉鎯充粠澶栭儴鍙戦佷竴涓暟鎹姤緇欏唴緗戠殑璁$畻鏈烘湁浠涔堝姙娉曞憿錛熼鍏堬紝鎴戜滑蹇呴』鍦ㄥ唴緗戠殑NAT涓婃墦涓婁竴涓?#8220;媧?#8221;錛堜篃灝辨槸鍓嶉潰鎴戜滑璇寸殑鍦∟AT涓婂緩绔嬩竴涓?Session錛夛紝榪欎釜媧炰笉鑳界敱澶栭儴鏉ユ墦錛屽彧鑳界敱鍐呯綉鍐呯殑涓繪満鏉ユ墦銆傝屼笖榪欎釜媧炴槸鏈夋柟鍚戠殑錛屾瘮濡備粠鍐呴儴鏌愬彴涓繪満錛堟瘮濡傦細192.168.0.10錛夊悜澶栭儴鐨勬煇涓狪P(姣斿錛?19.237.60.1)鍙戦佷竴涓猆DP鍖咃紝閭d箞灝卞湪榪欎釜鍐呯綉鐨凬AT璁懼涓婃墦浜嗕竴涓柟鍚戜負219.237.60.1鐨?#8220;媧?#8221;錛岋紙榪欏氨鏄О涓篣DP Hole Punching鐨勬妧鏈級浠ュ悗219.237.60.1灝卞彲浠ラ氳繃榪欎釜媧炰笌鍐呯綉鐨?92.168.0.10鑱旂郴浜嗐傦紙浣嗘槸鍏朵粬鐨処P涓嶈兘鍒╃敤榪欎釜媧烇級銆?br>
鍛靛懙錛岀幇鍦ㄨ杞埌鎴戜滑鐨勬棰楶2P浜嗐傛湁浜嗕笂闈㈢殑鐞嗚錛屽疄鐜頒袱涓唴緗戠殑涓繪満閫氳灝卞樊鏈鍚庝竴姝ヤ簡錛氶偅灝辨槸楦$敓铔嬭繕鏄泲鐢熼浮鐨勯棶棰樹簡錛屼袱杈歸兘鏃犳硶涓誨姩鍙戝嚭榪炴帴璇鋒眰錛岃皝涔熶笉鐭ラ亾璋佺殑鍏綉鍦板潃錛岄偅鎴戜滑濡備綍鏉ユ墦榪欎釜媧炲憿錛熸垜浠渶瑕佷竴涓腑闂翠漢鏉ヨ仈緋昏繖涓や釜鍐呯綉涓繪満銆?br>    鐜板湪鎴戜滑鏉ョ湅鐪嬩竴涓狿2P杞歡鐨勬祦紼嬶紝浠ヤ笅鍥句負渚嬶細

                       Server S 錛?19.237.60.1錛?br>                          |
                          |
   +----------------------+----------------------+
   |                                             |
 NAT A (澶栫綉IP:202.187.45.3)                 NAT B (澶栫綉IP:187.34.1.56)
   |   (鍐呯綉IP:192.168.0.1)                      | (鍐呯綉IP:192.168.0.1)
   |                                             |
Client A  (192.168.0.20:4000)             Client B (192.168.0.10:40000)

    棣栧厛錛孋lient A鐧誨綍鏈嶅姟鍣紝NAT A涓鴻繖嬈$殑Session鍒嗛厤浜嗕竴涓鍙?0000錛岄偅涔圫erver S鏀跺埌鐨凜lient A鐨勫湴鍧鏄?02.187.45.3:60000錛岃繖灝辨槸Client A鐨勫緗戝湴鍧浜嗐傚悓鏍鳳紝Client B鐧誨綍Server S錛孨AT B緇欐嬈ession鍒嗛厤鐨勭鍙f槸40000錛岄偅涔圫erver S鏀跺埌鐨凚鐨勫湴鍧鏄?87.34.1.56:40000銆?br>    姝ゆ椂錛孋lient A涓嶤lient B閮藉彲浠ヤ笌Server S閫氫俊浜嗐傚鏋淐lient A姝ゆ椂鎯崇洿鎺ュ彂閫佷俊鎭粰Client B錛岄偅涔堜粬鍙互浠嶴erver S閭e効鑾峰緱B鐨勫叕緗戝湴鍧187.34.1.56:40000錛屾槸涓嶆槸Client A鍚戣繖涓湴鍧鍙戦佷俊鎭疌lient B灝辮兘鏀跺埌浜嗗憿錛熺瓟妗堟槸涓嶈錛屽洜涓哄鏋滆繖鏍峰彂閫佷俊鎭紝NAT B浼氬皢榪欎釜淇℃伅涓㈠純錛堝洜涓鴻繖鏍風殑淇℃伅鏄笉璇瘋嚜鏉ョ殑錛屼負浜嗗畨鍏紝澶у鏁癗AT閮戒細鎵ц涓㈠純鍔ㄤ綔錛夈傜幇鍦ㄦ垜浠渶瑕佺殑鏄湪NAT B涓婃墦涓涓柟鍚戜負202.187.45.3錛堝嵆Client A鐨勫緗戝湴鍧錛夌殑媧烇紝閭d箞Client A鍙戦佸埌187.34.1.56:40000鐨勪俊鎭?Client B灝辮兘鏀跺埌浜嗐傝繖涓墦媧炲懡浠ょ敱璋佹潵鍙戝憿錛屽懙鍛碉紝褰撶劧鏄疭erver S銆?br>    鎬葷粨涓涓嬭繖涓繃紼嬶細濡傛灉Client A鎯沖悜Client B鍙戦佷俊鎭紝閭d箞Client A鍙戦佸懡浠ょ粰Server S錛岃姹係erver S鍛戒護Client B鍚慍lient A鏂瑰悜鎵撴礊銆傚懙鍛碉紝鏄笉鏄緢緇曞彛錛屼笉榪囨病鍏崇郴錛屾兂涓鎯沖氨寰堟竻妤氫簡錛屼綍鍐佃繕鏈夋簮浠g爜鍛紙渚佸笀璇磋繃錛氬湪婧愪唬鐮侀潰鍓嶆病鏈夌瀵?8錛夛級錛岀劧鍚嶤lient A灝卞彲浠ラ氳繃Client B鐨勫緗戝湴鍧涓嶤lient B閫氫俊浜嗐?br>   
    娉ㄦ剰錛氫互涓婅繃紼嬪彧閫傚悎浜嶤one NAT鐨勬儏鍐碉紝濡傛灉鏄疭ymmetric NAT錛岄偅涔堝綋Client B鍚慍lient A鎵撴礊鐨勭鍙e凡緇忛噸鏂板垎閰嶄簡錛孋lient B灝嗘棤娉曠煡閬撹繖涓鍙o紙濡傛灉Symmetric NAT鐨勭鍙f槸欏哄簭鍒嗛厤鐨勶紝閭d箞鎴戜滑鎴栬鍙互鐚滄祴榪欎釜绔彛鍙鳳紝鍙槸鐢變簬鍙兘瀵艱嚧澶辮觸鐨勫洜绱犲お澶氾紝鎴戜滑涓嶆帹鑽愯繖縐嶇寽嫻嬬鍙g殑鏂規硶錛夈?br>   
    涓嬮潰鏄竴涓ā鎷烶2P鑱婂ぉ鐨勮繃紼嬬殑婧愪唬鐮侊紝榪囩▼寰堢畝鍗曪紝P2PServer榪愯鍦ㄤ竴涓嫢鏈夊叕緗慖P鐨勮綆楁満涓婏紝P2PClient榪愯鍦ㄤ袱涓笉鍚岀殑NAT 鍚庯紙娉ㄦ剰錛屽鏋滀袱涓鎴風榪愯鍦ㄤ竴涓狽AT鍚庯紝鏈▼搴忓緢鍙兘涓嶈兘榪愯姝e父錛岃繖鍙栧喅浜庝綘鐨凬AT鏄惁鏀寔loopback translation錛岃瑙乭ttp://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt錛屽綋鐒訛紝姝ら棶棰樺彲浠ラ氳繃鍙屾柟鍏堝皾璇曡繛鎺ュ鏂圭殑鍐呯綉IP鏉ヨВ鍐籌紝浣嗘槸榪欎釜浠g爜鍙槸涓轟簡楠岃瘉鍘熺悊錛屽茍娌℃湁澶勭悊榪欎簺闂錛夛紝鍚庣櫥褰曠殑璁$畻鏈哄彲浠ヨ幏寰楀厛鐧誨綍璁$畻鏈虹殑鐢ㄦ埛鍚嶏紝鍚庣櫥褰曠殑璁$畻鏈洪氳繃send username message鐨勬牸寮忔潵鍙戦佹秷鎭傚鏋滃彂閫佹垚鍔燂紝璇存槑浣犲凡鍙栧緱浜嗙洿鎺ヤ笌瀵規柟榪炴帴鐨勬垚鍔熴?br>    紼嬪簭鐜板湪鏀寔涓変釜鍛戒護錛歴end , getu , exit
   
    send鏍煎紡錛歴end username message
    鍔熻兘錛氬彂閫佷俊鎭粰username
   
    getu鏍煎紡錛歡etu
    鍔熻兘錛氳幏寰楀綋鍓嶆湇鍔″櫒鐢ㄦ埛鍒楄〃
   
    exit鏍煎紡錛歟xit
    鍔熻兘錛氭敞閿涓庢湇鍔″櫒鐨勮繛鎺ワ紙鏈嶅姟鍣ㄤ笉浼氳嚜鍔ㄧ洃嫻嬪鎴鋒槸鍚﹀悐綰匡級
       
    浠g爜寰堢煭錛岀浉淇″緢瀹規槗鎳傦紝濡傛灉鏈変粈涔堥棶棰橈紝鍙互緇欐垜鍙戦偖浠秡houhuis22@sina.com  鎴栬呭湪CSDN涓婂彂閫佺煭娑堟伅銆傚悓鏃訛紝嬈㈣繋杞彂姝ゆ枃錛屼絾甯屾湜淇濈暀浣滆呯増鏉?-錛夈?br>   
    鏈鍚庢劅璋SDN緗戝弸 PiggyXP 鍜?Seilfer鐨勬祴璇曞府鍔?br>
P2PServer.c

/* P2P 紼嬪簭鏈嶅姟绔?br> *
 * 鏂囦歡鍚嶏細P2PServer.c
 *
 * 鏃ユ湡錛?004-5-21
 *
 * 浣滆咃細shootingstars(zhouhuis22@sina.com)
 *
 */
#pragma comment(lib, "ws2_32.lib")

#include "windows.h"
#include "..\proto.h"
#include "..\Exception.h"

UserList ClientList;

void InitWinSock()
{
 WSADATA wsaData;

 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
 {
  printf("Windows sockets 2.2 startup");
  throw Exception("");
 }
 else{
  printf("Using %s (Status: %s)\n",
   wsaData.szDescription, wsaData.szSystemStatus);
  printf("with API versions %d.%d to %d.%d\n\n",
   LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),
   LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
 
 }
}

SOCKET mksock(int type)
{
 SOCKET sock = socket(AF_INET, type, 0);
 if (sock < 0)
 {
        printf("create socket error");
  throw Exception("");
 }
 return sock;
}

stUserListNode GetUser(char *username)
{
 for(UserList::iterator UserIterator=ClientList.begin();
      UserIterator!=ClientList.end();
       ++UserIterator)
 {
  if( strcmp( ((*UserIterator)->userName), username) == 0 )
   return *(*UserIterator);
 }
 throw Exception("not find this user");
}

int main(int argc, char* argv[])
{
 try{
  InitWinSock();
 
  SOCKET PrimaryUDP;
  PrimaryUDP = mksock(SOCK_DGRAM);

  sockaddr_in local;
  local.sin_family=AF_INET;
  local.sin_port= htons(SERVER_PORT);
  local.sin_addr.s_addr = htonl(INADDR_ANY);
  int nResult=bind(PrimaryUDP,(sockaddr*)&local,sizeof(sockaddr));
  if(nResult==SOCKET_ERROR)
   throw Exception("bind error");

  sockaddr_in sender;
  stMessage recvbuf;
  memset(&recvbuf,0,sizeof(stMessage));

  // 寮濮嬩富寰幆.
  // 涓誨驚鐜礋璐d笅闈㈠嚑浠朵簨鎯?
  // 涓:璇誨彇瀹㈡埛绔櫥闄嗗拰鐧誨嚭娑堟伅,璁板綍瀹㈡埛鍒楄〃
  // 浜?杞彂瀹㈡埛p2p璇鋒眰
  for(;;)
  {
   int dwSender = sizeof(sender);
   int ret = recvfrom(PrimaryUDP, (char *)&recvbuf, sizeof(stMessage), 0, (sockaddr *)&sender, &dwSender);
   if(ret <= 0)
   {
    printf("recv error");
    continue;
   }
   else
   {
    int messageType = recvbuf.iMessageType;
    switch(messageType){
    case LOGIN:
     {
      //  灝嗚繖涓敤鎴風殑淇℃伅璁板綍鍒扮敤鎴峰垪琛ㄤ腑
      printf("has a user login : %s\n", recvbuf.message.loginmember.userName);
      stUserListNode *currentuser = new stUserListNode();
      strcpy(currentuser->userName, recvbuf.message.loginmember.userName);
      currentuser->ip = ntohl(sender.sin_addr.S_un.S_addr);
      currentuser->port = ntohs(sender.sin_port);
      
      ClientList.push_back(currentuser);

      // 鍙戦佸凡緇忕櫥闄嗙殑瀹㈡埛淇℃伅
      int nodecount = (int)ClientList.size();
      sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));
      for(UserList::iterator UserIterator=ClientList.begin();
        UserIterator!=ClientList.end();
        ++UserIterator)
      {
       sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender));
      }

      break;
     }
    case LOGOUT:
     {
      // 灝嗘瀹㈡埛淇℃伅鍒犻櫎
      printf("has a user logout : %s\n", recvbuf.message.logoutmember.userName);
      UserList::iterator removeiterator = NULL;
      for(UserList::iterator UserIterator=ClientList.begin();
       UserIterator!=ClientList.end();
       ++UserIterator)
      {
       if( strcmp( ((*UserIterator)->userName), recvbuf.message.logoutmember.userName) == 0 )
       {
        removeiterator = UserIterator;
        break;
       }
      }
      if(removeiterator != NULL)
       ClientList.remove(*removeiterator);
      break;
     }
    case P2PTRANS:
     {
      // 鏌愪釜瀹㈡埛甯屾湜鏈嶅姟绔悜鍙﹀涓涓鎴峰彂閫佷竴涓墦媧炴秷鎭?br>      printf("%s wants to p2p %s\n",inet_ntoa(sender.sin_addr),recvbuf.message.translatemessage.userName);
      stUserListNode node = GetUser(recvbuf.message.translatemessage.userName);
      sockaddr_in remote;
      remote.sin_family=AF_INET;
      remote.sin_port= htons(node.port);
      remote.sin_addr.s_addr = htonl(node.ip);

      in_addr tmp;
      tmp.S_un.S_addr = htonl(node.ip);
      printf("the address is %s,and port is %d\n",inet_ntoa(tmp), node.port);

      stP2PMessage transMessage;
      transMessage.iMessageType = P2PSOMEONEWANTTOCALLYOU;
      transMessage.iStringLen = ntohl(sender.sin_addr.S_un.S_addr);
      transMessage.Port = ntohs(sender.sin_port);
                       
      sendto(PrimaryUDP,(const char*)&transMessage, sizeof(transMessage), 0, (const sockaddr *)&remote, sizeof(remote));

      break;
     }
    
    case GETALLUSER:
     {
      int command = GETALLUSER;
      sendto(PrimaryUDP, (const char*)&command, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));

      int nodecount = (int)ClientList.size();
      sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));

      for(UserList::iterator UserIterator=ClientList.begin();
        UserIterator!=ClientList.end();
        ++UserIterator)
      {
       sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender));
      }
      break;
     }
    }
   }
  }

 }
 catch(Exception &e)
 {
  printf(e.GetMessage());
  return 1;
 }

 return 0;
}

/* P2P 紼嬪簭瀹㈡埛绔?br> *
 * 鏂囦歡鍚嶏細P2PClient.c
 *
 * 鏃ユ湡錛?004-5-21
 *
 * 浣滆咃細shootingstars(zhouhuis22@sina.com)
 *
 */

#pragma comment(lib,"ws2_32.lib")

#include "windows.h"
#include "..\proto.h"
#include "..\Exception.h"
#include <iostream>
using namespace std;

UserList ClientList;

 

#define COMMANDMAXC 256
#define MAXRETRY    5

SOCKET PrimaryUDP;
char UserName[10];
char ServerIP[20];

bool RecvedACK;

void InitWinSock()
{
 WSADATA wsaData;

 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
 {
  printf("Windows sockets 2.2 startup");
  throw Exception("");
 }
 else{
  printf("Using %s (Status: %s)\n",
   wsaData.szDescription, wsaData.szSystemStatus);
  printf("with API versions %d.%d to %d.%d\n\n",
   LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),
   LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
 }
}

SOCKET mksock(int type)
{
 SOCKET sock = socket(AF_INET, type, 0);
 if (sock < 0)
 {
        printf("create socket error");
  throw Exception("");
 }
 return sock;
}

stUserListNode GetUser(char *username)
{
 for(UserList::iterator UserIterator=ClientList.begin();
      UserIterator!=ClientList.end();
       ++UserIterator)
 {
  if( strcmp( ((*UserIterator)->userName), username) == 0 )
   return *(*UserIterator);
 }
 throw Exception("not find this user");
}

void BindSock(SOCKET sock)
{
 sockaddr_in sin;
 sin.sin_addr.S_un.S_addr = INADDR_ANY;
 sin.sin_family = AF_INET;
 sin.sin_port = 0;
 
 if (bind(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)
  throw Exception("bind error");
}

void ConnectToServer(SOCKET sock,char *username, char *serverip)
{
 sockaddr_in remote;
 remote.sin_addr.S_un.S_addr = inet_addr(serverip);
 remote.sin_family = AF_INET;
 remote.sin_port = htons(SERVER_PORT);
 
 stMessage sendbuf;
 sendbuf.iMessageType = LOGIN;
 strncpy(sendbuf.message.loginmember.userName, username, 10);

 sendto(sock, (const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr*)&remote,sizeof(remote));

 int usercount;
 int fromlen = sizeof(remote);
 int iread = recvfrom(sock, (char *)&usercount, sizeof(int), 0, (sockaddr *)&remote, &fromlen);
 if(iread<=0)
 {
  throw Exception("Login error\n");
 }

 // 鐧誨綍鍒版湇鍔$鍚庯紝鎺ユ敹鏈嶅姟绔彂鏉ョ殑宸茬粡鐧誨綍鐨勭敤鎴風殑淇℃伅
 cout<<"Have "<<usercount<<" users logined server:"<<endl;
 for(int i = 0;i<usercount;i++)
 {
  stUserListNode *node = new stUserListNode;
  recvfrom(sock, (char*)node, sizeof(stUserListNode), 0, (sockaddr *)&remote, &fromlen);
  ClientList.push_back(node);
  cout<<"Username:"<<node->userName<<endl;
  in_addr tmp;
  tmp.S_un.S_addr = htonl(node->ip);
  cout<<"UserIP:"<<inet_ntoa(tmp)<<endl;
  cout<<"UserPort:"<<node->port<<endl;
  cout<<""<<endl;
 }
}

void OutputUsage()
{
 cout<<"You can input you command:\n"
  <<"Command Type:\"send\",\"exit\",\"getu\"\n"
  <<"Example : send Username Message\n"
  <<"          exit\n"
  <<"          getu\n"
  <<endl;
}

/* 榪欐槸涓昏鐨勫嚱鏁幫細鍙戦佷竴涓秷鎭粰鏌愪釜鐢ㄦ埛(C)
 *嫻佺▼錛氱洿鎺ュ悜鏌愪釜鐢ㄦ埛鐨勫緗慖P鍙戦佹秷鎭紝濡傛灉姝ゅ墠娌℃湁鑱旂郴榪?br> *      閭d箞姝ゆ秷鎭皢鏃犳硶鍙戦侊紝鍙戦佺絳夊緟瓚呮椂銆?br> *      瓚呮椂鍚庯紝鍙戦佺灝嗗彂閫佷竴涓姹備俊鎭埌鏈嶅姟绔紝
 *      瑕佹眰鏈嶅姟绔彂閫佺粰瀹㈡埛C涓涓姹傦紝璇鋒眰C緇欐湰鏈哄彂閫佹墦媧炴秷鎭?br> *      浠ヤ笂嫻佺▼灝嗛噸澶峂AXRETRY嬈?br> */
bool SendMessageTo(char *UserName, char *Message)
{
 char realmessage[256];
 unsigned int UserIP;
 unsigned short UserPort;
 bool FindUser = false;
 for(UserList::iterator UserIterator=ClientList.begin();
      UserIterator!=ClientList.end();
      ++UserIterator)
 {
  if( strcmp( ((*UserIterator)->userName), UserName) == 0 )
  {
   UserIP = (*UserIterator)->ip;
   UserPort = (*UserIterator)->port;
   FindUser = true;
  }
 }

 if(!FindUser)
  return false;

 strcpy(realmessage, Message);
 for(int i=0;i<MAXRETRY;i++)
 {
  RecvedACK = false;

  sockaddr_in remote;
  remote.sin_addr.S_un.S_addr = htonl(UserIP);
  remote.sin_family = AF_INET;
  remote.sin_port = htons(UserPort);
  stP2PMessage MessageHead;
  MessageHead.iMessageType = P2PMESSAGE;
  MessageHead.iStringLen = (int)strlen(realmessage)+1;
  int isend = sendto(PrimaryUDP, (const char *)&MessageHead, sizeof(MessageHead), 0, (const sockaddr*)&remote, sizeof(remote));
  isend = sendto(PrimaryUDP, (const char *)&realmessage, MessageHead.iStringLen, 0, (const sockaddr*)&remote, sizeof(remote));
 
  // 絳夊緟鎺ユ敹綰跨▼灝嗘鏍囪淇敼
  for(int j=0;j<10;j++)
  {
   if(RecvedACK)
    return true;
   else
    Sleep(300);
  }

  // 娌℃湁鎺ユ敹鍒扮洰鏍囦富鏈虹殑鍥炲簲錛岃涓虹洰鏍囦富鏈虹殑绔彛鏄犲皠娌℃湁
  // 鎵撳紑錛岄偅涔堝彂閫佽姹備俊鎭粰鏈嶅姟鍣紝瑕佹湇鍔″櫒鍛婅瘔鐩爣涓繪満
  // 鎵撳紑鏄犲皠绔彛錛圲DP鎵撴礊錛?br>  sockaddr_in server;
  server.sin_addr.S_un.S_addr = inet_addr(ServerIP);
  server.sin_family = AF_INET;
  server.sin_port = htons(SERVER_PORT);
 
  stMessage transMessage;
  transMessage.iMessageType = P2PTRANS;
  strcpy(transMessage.message.translatemessage.userName, UserName);

  sendto(PrimaryUDP, (const char*)&transMessage, sizeof(transMessage), 0, (const sockaddr*)&server, sizeof(server));
  Sleep(100);// 絳夊緟瀵規柟鍏堝彂閫佷俊鎭?br> }
 return false;
}

// 瑙f瀽鍛戒護錛屾殏鏃跺彧鏈塭xit鍜宻end鍛戒護
// 鏂板getu鍛戒護錛岃幏鍙栧綋鍓嶆湇鍔″櫒鐨勬墍鏈夌敤鎴?br>void ParseCommand(char * CommandLine)
{
 if(strlen(CommandLine)<4)
  return;
 char Command[10];
 strncpy(Command, CommandLine, 4);
 Command[4]='\0';

 if(strcmp(Command,"exit")==0)
 {
  stMessage sendbuf;
  sendbuf.iMessageType = LOGOUT;
  strncpy(sendbuf.message.logoutmember.userName, UserName, 10);
  sockaddr_in server;
  server.sin_addr.S_un.S_addr = inet_addr(ServerIP);
  server.sin_family = AF_INET;
  server.sin_port = htons(SERVER_PORT);

  sendto(PrimaryUDP,(const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr *)&server, sizeof(server));
  shutdown(PrimaryUDP, 2);
  closesocket(PrimaryUDP);
  exit(0);
 }
 else if(strcmp(Command,"send")==0)
 {
  char sendname[20];
  char message[COMMANDMAXC];
  int i;
  for(i=5;;i++)
  {
   if(CommandLine[i]!=' ')
    sendname[i-5]=CommandLine[i];
   else
   {
    sendname[i-5]='\0';
    break;
   }
  }
  strcpy(message, &(CommandLine[i+1]));
  if(SendMessageTo(sendname, message))
   printf("Send OK!\n");
  else
   printf("Send Failure!\n");
 }
 else if(strcmp(Command,"getu")==0)
 {
  int command = GETALLUSER;
  sockaddr_in server;
  server.sin_addr.S_un.S_addr = inet_addr(ServerIP);
  server.sin_family = AF_INET;
  server.sin_port = htons(SERVER_PORT);

  sendto(PrimaryUDP,(const char*)&command, sizeof(command), 0, (const sockaddr *)&server, sizeof(server));
 }
}

// 鎺ュ彈娑堟伅綰跨▼
DWORD WINAPI RecvThreadProc(LPVOID lpParameter)
{
 sockaddr_in remote;
 int sinlen = sizeof(remote);
 stP2PMessage recvbuf;
 for(;;)
 {
  int iread = recvfrom(PrimaryUDP, (char *)&recvbuf, sizeof(recvbuf), 0, (sockaddr *)&remote, &sinlen);
  if(iread<=0)
  {
   printf("recv error\n");
   continue;
  }
  switch(recvbuf.iMessageType)
  {
  case P2PMESSAGE:
   {
    // 鎺ユ敹鍒癙2P鐨勬秷鎭?br>    char *comemessage= new char[recvbuf.iStringLen];
    int iread1 = recvfrom(PrimaryUDP, comemessage, 256, 0, (sockaddr *)&remote, &sinlen);
    comemessage[iread1-1] = '\0';
    if(iread1<=0)
     throw Exception("Recv Message Error\n");
    else
    {
     printf("Recv a Message:%s\n",comemessage);
     
     stP2PMessage sendbuf;
     sendbuf.iMessageType = P2PMESSAGEACK;
     sendto(PrimaryUDP, (const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr*)&remote, sizeof(remote));
    }

    delete []comemessage;
    break;

   }
  case P2PSOMEONEWANTTOCALLYOU:
   {
    // 鎺ユ敹鍒版墦媧炲懡浠わ紝鍚戞寚瀹氱殑IP鍦板潃鎵撴礊
    printf("Recv p2someonewanttocallyou data\n");
    sockaddr_in remote;
    remote.sin_addr.S_un.S_addr = htonl(recvbuf.iStringLen);
    remote.sin_family = AF_INET;
    remote.sin_port = htons(recvbuf.Port);

    // UDP hole punching
    stP2PMessage message;
    message.iMessageType = P2PTRASH;
    sendto(PrimaryUDP, (const char *)&message, sizeof(message), 0, (const sockaddr*)&remote, sizeof(remote));
               
    break;
   }
  case P2PMESSAGEACK:
   {
    // 鍙戦佹秷鎭殑搴旂瓟
    RecvedACK = true;
    break;
   }
  case P2PTRASH:
   {
    // 瀵規柟鍙戦佺殑鎵撴礊娑堟伅錛屽拷鐣ユ帀銆?br>    //do nothing ...
    printf("Recv p2ptrash data\n");
    break;
   }
  case GETALLUSER:
   {
    int usercount;
    int fromlen = sizeof(remote);
    int iread = recvfrom(PrimaryUDP, (char *)&usercount, sizeof(int), 0, (sockaddr *)&remote, &fromlen);
    if(iread<=0)
    {
     throw Exception("Login error\n");
    }
    
    ClientList.clear();

    cout<<"Have "<<usercount<<" users logined server:"<<endl;
    for(int i = 0;i<usercount;i++)
    {
     stUserListNode *node = new stUserListNode;
     recvfrom(PrimaryUDP, (char*)node, sizeof(stUserListNode), 0, (sockaddr *)&remote, &fromlen);
     ClientList.push_back(node);
     cout<<"Username:"<<node->userName<<endl;
     in_addr tmp;
     tmp.S_un.S_addr = htonl(node->ip);
     cout<<"UserIP:"<<inet_ntoa(tmp)<<endl;
     cout<<"UserPort:"<<node->port<<endl;
     cout<<""<<endl;
    }
    break;
   }
  }
 }
}


int main(int argc, char* argv[])
{
 try
 {
  InitWinSock();
 
  PrimaryUDP = mksock(SOCK_DGRAM);
  BindSock(PrimaryUDP);

  cout<<"Please input server ip:";
  cin>>ServerIP;

  cout<<"Please input your name:";
  cin>>UserName;

  ConnectToServer(PrimaryUDP, UserName, ServerIP);

  HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
  CloseHandle(threadhandle);
  OutputUsage();

  for(;;)
  {
   char Command[COMMANDMAXC];
   gets(Command);
   ParseCommand(Command);
  }
 }
 catch(Exception &e)
 {
  printf(e.GetMessage());
  return 1;
 }
 return 0;
}

/* 寮傚父綾?br> *
 * 鏂囦歡鍚嶏細Exception.h
 *
 * 鏃ユ湡錛?004.5.5
 *
 * 浣滆咃細shootingstars(zhouhuis22@sina.com)
 */

#ifndef __HZH_Exception__
#define __HZH_Exception__

#define EXCEPTION_MESSAGE_MAXLEN 256
#include "string.h"

class Exception
{
private:
 char m_ExceptionMessage[EXCEPTION_MESSAGE_MAXLEN];
public:
 Exception(char *msg)
 {
  strncpy(m_ExceptionMessage, msg, EXCEPTION_MESSAGE_MAXLEN);
 }

 char *GetMessage()
 {
  return m_ExceptionMessage;
 }
};

#endif

/* P2P 紼嬪簭浼犺緭鍗忚
 *
 * 鏃ユ湡錛?004-5-21
 *
 * 浣滆咃細shootingstars(zhouhuis22@sina.com)
 *
 */

#pragma once
#include <list>

// 瀹氫箟iMessageType鐨勫?br>#define LOGIN 1
#define LOGOUT 2
#define P2PTRANS 3
#define GETALLUSER  4

// 鏈嶅姟鍣ㄧ鍙?br>#define SERVER_PORT 2280

// Client鐧誨綍鏃跺悜鏈嶅姟鍣ㄥ彂閫佺殑娑堟伅
struct stLoginMessage
{
 char userName[10];
 char password[10];
};

// Client娉ㄩ攢鏃跺彂閫佺殑娑堟伅
struct stLogoutMessage
{
 char userName[10];
};

// Client鍚戞湇鍔″櫒璇鋒眰鍙﹀涓涓狢lient(userName)鍚戣嚜宸辨柟鍚戝彂閫乁DP鎵撴礊娑堟伅
struct stP2PTranslate
{
 char userName[10];
};

// Client鍚戞湇鍔″櫒鍙戦佺殑娑堟伅鏍煎紡
struct stMessage
{
 int iMessageType;
 union _message
 {
  stLoginMessage loginmember;
  stLogoutMessage logoutmember;
  stP2PTranslate translatemessage;
 }message;
};

// 瀹㈡埛鑺傜偣淇℃伅
struct stUserListNode
{
 char userName[10];
 unsigned int ip;
 unsigned short port;
};

// Server鍚慍lient鍙戦佺殑娑堟伅
struct stServerToClient
{
 int iMessageType;
 union _message
 {
  stUserListNode user;
 }message;

};

//======================================
// 涓嬮潰鐨勫崗璁敤浜庡鎴風涔嬮棿鐨勯氫俊
//======================================
#define P2PMESSAGE 100               // 鍙戦佹秷鎭?br>#define P2PMESSAGEACK 101            // 鏀跺埌娑堟伅鐨勫簲絳?br>#define P2PSOMEONEWANTTOCALLYOU 102  // 鏈嶅姟鍣ㄥ悜瀹㈡埛绔彂閫佺殑娑堟伅
                                     // 甯屾湜姝ゅ鎴風鍙戦佷竴涓猆DP鎵撴礊鍖?br>#define P2PTRASH        103          // 瀹㈡埛绔彂閫佺殑鎵撴礊鍖咃紝鎺ユ敹绔簲璇ュ拷鐣ユ娑堟伅

// 瀹㈡埛绔箣闂村彂閫佹秷鎭牸寮?br>struct stP2PMessage
{
 int iMessageType;
 int iStringLen;         // or IP address
 unsigned short Port;
};

using namespace std;
typedef list<stUserListNode *> UserList;

宸ョ▼涓嬭澆鍦板潃:http://www.ppcn.net/upload/2004_05/04052509317298.rar

]]>
鍦╓indows涓嬬紪璇慜penSSL錛圴S2005錛?http://www.shnenglu.com/shootingstars/archive/2006/02/17/3302.htmlshootingstarsshootingstarsFri, 17 Feb 2006 01:46:00 GMThttp://www.shnenglu.com/shootingstars/archive/2006/02/17/3302.htmlhttp://www.shnenglu.com/shootingstars/comments/3302.htmlhttp://www.shnenglu.com/shootingstars/archive/2006/02/17/3302.html#Feedback0http://www.shnenglu.com/shootingstars/comments/commentRss/3302.htmlhttp://www.shnenglu.com/shootingstars/services/trackbacks/3302.html璇︽儏璇風湅錛?A >http://shootingstars.cnblogs.com/archive/2006/02/17/332276.html

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚欧美中日韩视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 91久久精品国产91久久| 久久精品一区二区三区四区 | 国产欧美午夜| 亚洲天堂第二页| 久久久久久亚洲综合影院红桃| 一本久久综合亚洲鲁鲁| 欧美区国产区| 亚洲一区二区精品视频| 一区二区高清在线| 欧美午夜精品| 欧美一区二区三区免费视| 亚洲网在线观看| 国产精品亚洲аv天堂网| 午夜精品久久久久久久99樱桃 | 久久福利资源站| 欧美一区二区在线免费播放| 国产日韩欧美精品在线| 欧美在线观看视频在线| 性久久久久久久久| 极品av少妇一区二区| 久久免费午夜影院| 久久这里只有精品视频首页| 国内久久婷婷综合| 免费成人网www| 狼人社综合社区| 亚洲国产精品久久久久秋霞蜜臀| 久久久久久久久久久一区| 久久久一二三| 亚洲免费大片| 亚洲欧美日韩在线| 亚洲激情综合| 亚洲影视在线| 亚洲区一区二| 亚洲亚洲精品三区日韩精品在线视频| 国产精品日韩久久久久| 午夜视频精品| 美女爽到呻吟久久久久| 亚洲一区日韩在线| 久久夜色精品一区| 午夜精品成人在线视频| 免费日韩av片| 久久精品国产亚洲一区二区三区| 免费久久99精品国产自在现线| 亚洲深夜福利视频| 99视频超级精品| 含羞草久久爱69一区| 免费在线播放第一区高清av| 欧美日韩综合视频网址| 久久综合狠狠| 国产精品成人在线| 亚洲欧洲一区二区天堂久久| 国产日韩成人精品| 亚洲日本va午夜在线电影| 国内精品模特av私拍在线观看| 国产精品自拍在线| 国产精品外国| 久久久成人网| 欧美69wwwcom| 蜜桃av一区二区三区| 欧美日韩三级在线| 欧美sm视频| 国产日韩一区二区三区| 99视频日韩| 最新亚洲电影| 午夜精品福利一区二区蜜股av| 99re视频这里只有精品| 久久久亚洲综合| 夜夜嗨av色一区二区不卡| 久久国产视频网站| 在线观看中文字幕不卡| 小辣椒精品导航| 午夜精品久久一牛影视| 欧美日产在线观看| 欧美激情精品久久久久久蜜臀 | 亚洲风情亚aⅴ在线发布| 国产精品一香蕉国产线看观看 | 亚洲一区国产一区| 美女视频黄a大片欧美| 久久福利视频导航| 国产区精品在线观看| 一区二区三区.www| 亚洲婷婷在线| 欧美午夜无遮挡| 99精品久久久| 亚洲欧美日韩爽爽影院| 国产精品久久久久国产精品日日| 亚洲精品乱码久久久久| 99综合视频| 欧美日韩三级电影在线| 欧美激情精品久久久久久久变态| 亚洲国产精品电影在线观看| 午夜在线电影亚洲一区| 久久精品水蜜桃av综合天堂| 在线观看视频欧美| 欧美国产一区二区三区激情无套| 亚洲国产精品一区制服丝袜| 亚洲美女诱惑| 欧美网站在线| 先锋a资源在线看亚洲| 亚洲在线视频免费观看| 国产精品日韩在线| 欧美一区二区三区的| 性久久久久久久久| 国产原创一区二区| 麻豆视频一区二区| 欧美亚洲一区三区| 国产精品高清网站| 亚洲人成人99网站| 欧美一级视频精品观看| 先锋影音久久久| 老牛国产精品一区的观看方式| 蜜臀久久久99精品久久久久久 | 亚洲人在线视频| 亚洲婷婷综合色高清在线| 国产精品久久久久久久久搜平片 | 久久综合狠狠综合久久综青草| 亚洲高清自拍| 欧美日韩在线免费观看| 在线亚洲免费| 欧美在线高清视频| 亚洲国产天堂久久国产91| 久久综合色婷婷| 亚洲午夜三级在线| 麻豆精品一区二区综合av| 亚洲欧洲一区二区在线播放| 国产精品电影网站| 久久一二三国产| 亚洲婷婷在线| 欧美成人在线免费观看| 亚洲天堂av图片| 国产精品啊啊啊| 欧美一区深夜视频| 亚洲精品免费网站| 美女久久一区| 亚欧成人精品| 99国产精品视频免费观看一公开| 欧美日韩免费在线| 午夜精品在线| 一区二区三区高清| 亚洲成人在线视频播放 | 欧美精品色网| 久久久久中文| 久久国产精品99国产精| 校园春色综合网| 午夜精品在线观看| 久久精品国产久精国产思思| 欧美在线影院在线视频| 久久精品亚洲一区| 久久中文字幕导航| 欧美不卡激情三级在线观看| 欧美成人在线免费观看| 欧美成人蜜桃| 欧美日韩精品一本二本三本| 欧美日韩免费高清一区色橹橹| 欧美日韩国产在线一区| 欧美午夜免费电影| 国产精品永久入口久久久| 国产一区二区久久| 亚洲电影中文字幕| 亚洲乱码国产乱码精品精天堂 | 中日韩高清电影网| 午夜精品久久久久久久99水蜜桃| 久久av一区二区三区漫画| 久久香蕉国产线看观看网| 欧美激情一区二区三级高清视频| 亚洲精品国产精品乱码不99 | 亚洲日本电影| 欧美成熟视频| 午夜视频一区二区| 久久久一区二区| 欧美激情视频网站| 一区二区精品国产| 久久精品国产成人| 欧美国产高清| 国产视频久久| 日韩午夜电影av| 欧美一区日本一区韩国一区| 奶水喷射视频一区| 日韩小视频在线观看专区| 欧美在线视频观看| 欧美日韩蜜桃| 亚洲成人资源网| 亚洲欧美www| 欧美成人国产va精品日本一级| 日韩亚洲一区在线播放| 久久精品国产亚洲一区二区| 欧美日韩国产一区精品一区 | 国产色产综合产在线视频| 亚洲国产另类 国产精品国产免费| 亚洲一区二区在线观看视频| 欧美a级一区| 小辣椒精品导航| 欧美网站在线观看| 亚洲欧洲日韩女同| 久久天天躁狠狠躁夜夜av| 亚洲天堂视频在线观看| 欧美精品一区在线播放| 亚洲国产专区|