锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩精品一区二区三区四区 ,免费欧美在线,欧美区日韩区http://m.shnenglu.com/yunboy4/C++zh-cnSun, 16 Nov 2025 12:50:31 GMTSun, 16 Nov 2025 12:50:31 GMT60CString璇︾粏璁茶В(杞澆)http://m.shnenglu.com/yunboy4/archive/2009/07/31/91800.htmlyunboyyunboyFri, 31 Jul 2009 05:46:00 GMThttp://m.shnenglu.com/yunboy4/archive/2009/07/31/91800.htmlhttp://m.shnenglu.com/yunboy4/comments/91800.htmlhttp://m.shnenglu.com/yunboy4/archive/2009/07/31/91800.html#Feedback0http://m.shnenglu.com/yunboy4/comments/commentRss/91800.htmlhttp://m.shnenglu.com/yunboy4/services/trackbacks/91800.htmlCString璇︾粏璁茶В
 鍓嶈█錛氫覆鎿嶄綔鏄紪紼嬩腑鏈甯哥敤涔熸渶鍩烘湰鐨勬搷浣滀箣涓銆?鍋氫負VC紼嬪簭鍛橈紝鏃犺鏄彍楦熸垨楂樻墜閮芥浘鐢ㄨ繃Cstring銆傝屼笖濂藉儚瀹為檯緙栫▼涓緢闅劇寰楀紑瀹冿紙铏界劧瀹冧笉鏄爣鍑嗭跡++涓殑搴擄級銆傚洜涓篗FC涓彁渚涚殑榪欎釜綾誨鎴戜滑鎿嶄綔瀛椾覆瀹炲湪澶柟渚夸簡錛孋String涓嶄粎鎻愪緵鍚勭涓板瘜鐨勬搷浣滃嚱鏁般佹搷浣滅閲嶈澆錛屼嬌鎴戜滑浣跨敤璧蜂覆璧鋒潵鏇磋薄basic涓偅鏍風洿瑙傦紱鑰屼笖瀹冭繕鎻愪緵浜嗗姩鎬佸唴瀛樺垎閰嶏紝浣挎垜浠噺灝戜簡澶氬皯瀛楃涓叉暟緇勮秺鐣岀殑闅愭偅銆備絾鏄紝鎴戜滑鍦ㄤ嬌鐢ㄨ繃紼嬩腑涔熶綋浼氬埌CString綆鐩村お瀹規槗鍑洪敊浜嗭紝鑰屼笖鏈夌殑涓嶅彲鎹夋懜銆傛墍浠ユ湁璁稿楂樹漢绔欒繃鏉ワ紝寤鴻鎶涘純瀹冦?

鍦ㄦ錛屾垜涓漢璁や負錛欳String灝佽寰楃‘瀹炲緢瀹岀編錛屽畠鏈夎澶氫紭鐐癸紝濡?#8220;瀹規槗浣跨敤 錛屽姛鑳藉己錛屽姩鎬佸垎閰嶅唴瀛橈紝澶ч噺榪涜鎷瘋礉鏃跺畠寰堣兘鑺傜渷鍐呭瓨璧勬簮騫朵笖鎵ц鏁堢巼楂橈紝涓庢爣鍑嗭跡瀹屽叏鍏煎錛屽悓鏃舵敮鎸佸瀛楄妭涓庡瀛楄妭錛岀敱浜庢湁寮傚父鏈哄埗鎵浠ヤ嬌鐢ㄥ畠瀹夊叏鏂逛究” 鍏跺疄錛屼嬌鐢ㄨ繃紼嬩腑涔嬫墍浠ュ鏄撳嚭閿欙紝閭f槸鍥犱負鎴戜滑瀵瑰畠浜嗚В寰楄繕涓嶅錛岀壒鍒槸瀹冪殑瀹炵幇鏈哄埗銆傚洜涓烘垜浠腑鐨勫ぇ澶氭暟浜猴紝鍦ㄥ伐浣滀腑騫朵笉閭d箞鐖辨繁鍏ュ湴鍘葷湅鍏充簬瀹冪殑鏂囨。錛屼綍鍐靛畠榪樻槸鑻辨枃鐨勩?

鐢變簬鍓嶅嚑澶╂垜鍦ㄥ伐浣滀腑閬囧埌浜嗕竴涓湰涓嶆槸闂浣嗗嵈鐗瑰埆媯樻墜銆佺壒鍒毦瑙e喅鑰屼笖鑾悕鎯婅鐨勯棶棰樸傚ソ鏉ユ渶鍚庡彂鐜版槸鐢變簬CString寮曞彂鐨勩傛墍浠ユ病鍔炴硶錛屾垜鎶婃暣涓狢String鐨勫疄鐜板叏閮ㄧ湅浜嗕竴閬嶏紝鎵嶆厡鐒跺ぇ鎮燂紝騫跺交搴曞紕娓呬簡闂鐨勫師鍥?榪欎釜闂錛屾垜宸插湪csdn涓婂紑璐?銆傚湪姝わ紝鎴戞兂鎶婃垜鐨勪竴浜涘叧浜嶤String鐨勭煡璇嗘葷粨涓鐣紝浠ヤ緵浠栵紙濂癸級浜哄熼壌錛屼篃璁稿叾涓湁鎴戠悊瑙d笂鐨勯敊璇紝鏈涘彂鐜拌呰兘閫氱煡鎴戯紝涓嶈儨鎰熻阿銆?/p>


1錛?CString瀹炵幇鐨勬満鍒?

CString鏄氳繃“寮曠敤”鏉ョ鐞嗕覆鐨勶紝“寮曠敤”榪欎釜璇嶆垜鐩鎬俊澶у騫朵笉闄岀敓錛岃薄Window鍐呮牳瀵硅薄銆丆OM瀵硅薄絳夐兘鏄氳繃寮曠敤鏉ュ疄鐜扮殑銆傝孋String涔熸槸閫氳繃榪欐牱鐨勬満鍒舵潵綆$悊鍒嗛厤鐨勫唴瀛樺潡銆傚疄闄呬笂CString瀵硅薄鍙湁涓涓寚閽堟垚鍛樺彉閲?鎵浠ヤ換浣旵String瀹炰緥鐨勯暱搴﹀彧鏈?瀛楄妭.

鍗? int len = sizeof(CString);//len絳変簬4

榪欎釜鎸囬拡鎸囧悜涓涓浉鍏崇殑寮曠敤鍐呭瓨鍧楋紝濡傚浘: CString str("abcd");

 

 


‘A’

‘B’

‘C’

‘D’

0

 

 

0x04040404 head閮紝涓哄紩鐢ㄥ唴瀛樺潡鐩稿叧淇℃伅


str 0x40404040

 

 


姝e洜涓哄姝わ紝涓涓繖鏍風殑鍐呭瓨鍧楀彲琚涓狢String鎵寮曠敤錛屼緥濡備笅鍒椾唬鐮侊細

CString str("abcd");

CString a = str;

CString b(str);

CString c;

c = b;

涓婇潰浠g爜鐨勭粨鏋滄槸錛氫笂闈㈠洓涓璞?str,a,b,c)涓殑鎴愬憳鍙橀噺鎸囬拡鏈夌浉鍚岀殑鍊鹼紝閮戒負0x40404040.鑰岃繖鍧楀唴瀛樺潡鎬庝箞鐭ラ亾鏈夊灝戜釜CString寮曠敤瀹冨憿錛熷悓鏍鳳紝瀹冧篃浼氳褰曚竴浜涗俊鎭傚琚紩鐢ㄦ暟錛屼覆闀垮害錛屽垎閰嶅唴瀛橀暱搴︺?/p>

榪欏潡寮曠敤鍐呭瓨鍧楃殑緇撴瀯瀹氫箟濡備笅錛?/p>

struct CStringData

{

long nRefs; //琛ㄧず鏈夊灝戜釜CString 寮曠敤瀹? 4

int nDataLength; //涓插疄闄呴暱搴? 4

int nAllocLength; //鎬誨叡鍒嗛厤鐨勫唴瀛橀暱搴︼紙涓嶈榪欏ご閮ㄧ殑12瀛楄妭錛? 4

};

鐢變簬鏈変簡榪欎簺淇℃伅錛孋String灝辮兘姝g‘鍦板垎閰嶃佺鐞嗐侀噴鏀懼紩鐢ㄥ唴瀛樺潡銆?/p>

濡傛灉浣犳兂鍦ㄨ皟璇曠▼搴忕殑鏃跺欒幏寰楄繖浜涗俊鎭傚彲浠ュ湪Watch紿楀彛閿叆涓嬪垪琛ㄨ揪寮忥細

(CStringData*)((CStringData*)(this->m_pchData)-1)鎴?/p>

(CStringData*)((CStringData*)(str.m_pchData)-1)//str涓烘寚CString瀹炰緥


姝e洜涓洪噰鐢ㄤ簡榪欐牱鐨勫ソ鏈哄埗錛屼嬌寰桟String鍦ㄥぇ閲忔嫹璐濇椂錛屼笉浠呮晥鐜囬珮錛岃屼笖鍒嗛厤鍐呭瓨灝戙?/p>

 

2錛嶭PCTSTR 涓?GetBuffer(int nMinBufLength)

榪欎袱涓嚱鏁版彁渚涗簡涓庢爣鍑咰鐨勫吋瀹硅漿鎹€傚湪瀹為檯涓嬌鐢ㄩ鐜囧緢楂橈紝浣嗗嵈鏄渶瀹規槗鍑洪敊鐨勫湴鏂廣傝繖涓や釜鍑芥暟瀹為檯涓婅繑鍥炵殑閮芥槸鎸囬拡錛屼絾瀹冧滑鏈変綍鍖哄埆鍛紵浠ュ強璋冪敤瀹冧滑鍚庯紝騫曞悗鏄仛浜嗘庢牱鐨勫鐞嗚繃紼嬪憿錛?/p>

(1) LPCTSTR 瀹冪殑鎵ц榪囩▼鍏跺疄寰堢畝鍗曪紝鍙槸榪斿洖寮曠敤鍐呭瓨鍧楃殑涓插湴鍧銆?瀹冩槸浣滀負鎿嶄綔絎﹂噸杞芥彁渚涚殑錛屾墍浠ュ湪浠g爜涓湁鏃跺彲浠ラ殣寮忚漿鎹紝鑰屾湁鏃跺嵈闇寮哄埗杞埗銆傚錛?/p>

CString str;

const char* p = (LPCTSTR)str;

//鍋囪鏈夎繖鏍風殑涓涓嚱鏁幫紝Test(const char* p)錛?浣犲氨鍙互榪欐牱璋冪敤

Test(str);//榪欓噷浼氶殣寮忚漿鎹負LPCTSTR

(2) GetBuffer(int nMinBufLength) 瀹冪被浼鹼紝涔熶細榪斿洖涓涓寚閽堬紝涓嶈繃瀹冩湁鐐瑰樊鍒?榪斿洖鐨勬槸LPTSTR

(3) 榪欎袱鑰呭埌搴曟湁浣曚笉鍚屽憿錛熸垜鎯沖憡璇夊ぇ瀹訛紝鍏舵湰璐ㄤ笂瀹屽叏涓嶄竴鏍鳳紝涓鑸LPCTSTR杞崲鍚庡彧搴旇褰撳父閲忎嬌鐢紝鎴栬呭仛鍑芥暟鐨勫叆鍙傦紱鑰孏etBuffer(...)鍙栧嚭鎸囬拡鍚庯紝鍙互閫氳繃榪欎釜鎸囬拡鏉ヤ慨鏀歸噷闈㈢殑鍐呭錛屾垨鑰呭仛鍑芥暟鐨勫嚭鍙傘備負浠涔堝憿錛熶篃璁哥粡甯告湁榪欐牱鐨勪唬鐮侊細

CString str("abcd");

char* p = (char*)(const char*)str;

p[2] = 'z';

鍏跺疄錛屼篃璁告湁榪欐牱鐨勪唬鐮佸悗錛屼綘鐨勭▼搴忓茍娌℃湁閿欙紝鑰屼笖紼嬪簭涔熻繍琛屽緱鎸哄ソ銆備絾瀹冨嵈鏄潪甯稿嵄闄╃殑銆傚啀鐪?/p>

CString str("abcd");

CString test = str;

....

char* p = (char*)(const char*)str;

p[2] = 'z';

strcpy(p, "akfjaksjfakfakfakj");//榪欎笅瀹岃泲浜?

浣犵煡閬撴鏃訛紝test涓殑鍊兼槸澶氬皯鍚楋紵絳旀鏄?abzd"銆傚畠涔熻窡鐫鏀瑰彉浜嗭紝榪欎笉鏄綘鎵鏈熸湜鍙戠敓鐨勩備絾涓轟粈涔堜細榪欐牱鍛紵浣犵◢寰兂鎯沖氨浼氭槑鐧斤紝鍓嶉潰璇磋繃錛屽洜涓篊String鏄寚鍚戝紩鐢ㄥ潡鐨勶紝str涓巘est鎸囧悜鍚屼竴鍧楀湴鏂?褰撲綘p[2]='z'鍚庯紝褰撶劧test涔熶細闅忕潃鏀瑰彉銆傛墍浠ョ敤瀹冨仛LPCTSTR鍋氳漿鎹㈠悗錛屼綘鍙兘鍘昏榪欏潡鏁版嵁錛屽崈涓囧埆鍘繪敼鍙樺畠鐨勫唴瀹廣?/p>


鍋囧鎴戞兂鐩存帴閫氳繃鎸囬拡鍘諱慨鏀規暟鎹殑璇濓紝閭f庢牱鍔炲憿錛熷氨鏄敤GetBuffer(...).鐪嬩笅榪頒唬鐮侊細

CString str("abcd");

CString test = str;

....

char* p = str.GetBuffer(20);

p[2] = 'z'; // 鎵ц鍒版錛岀幇鍦╰est涓煎嵈浠嶆槸"abcd"

strcpy(p, "akfjaksjfakfakfakj"); // 鎵ц鍒版錛岀幇鍦╰est涓艱繕鏄?abcd"

涓轟粈涔堜細榪欐牱錛熷叾瀹濭etBuffer(20)璋冪敤鏃訛紝瀹冨疄闄呬笂鍙﹀寤虹珛浜嗕竴鍧楁柊鍐呭潡瀛橈紝騫跺垎閰?0瀛楄妭闀垮害鐨刡uffer錛岃屽師鏉ョ殑鍐呭瓨鍧楀紩鐢ㄨ鏁頒篃鐩稿簲鍑?. 鎵浠ユ墽琛屼唬鐮佸悗str涓巘est鏄寚鍚戜簡涓ゅ潡涓嶅悓鐨勫湴鏂癸紝鎵浠ョ浉瀹夋棤浜嬨?/p>

(4) 涓嶈繃榪欓噷榪樻湁涓鐐規敞鎰忎簨欏癸細灝辨槸str.GetBuffer(20)鍚庯紝str鐨勫垎閰嶉暱搴︿負20錛屽嵆鎸囬拡p瀹冩墍鎸囧悜鐨刡uffer鍙湁20瀛楄妭闀匡紝緇欏畠璧嬪兼椂錛屽垏涓嶅彲瓚呰繃錛屽惁鍒欑伨闅劇浣犱笉榪滀簡錛涘鏋滄寚瀹氶暱搴﹀皬浜庡師鏉ヤ覆闀垮害錛屽GetBuffer(1),瀹為檯涓婂畠浼氬垎閰?涓瓧鑺傞暱搴︼紙鍗沖師鏉ヤ覆闀垮害錛夛紱鍙﹀錛屽綋璋冪敤GetBuffer(...)鍚庡茍鏀瑰彉鍏跺唴瀹癸紝涓瀹氳璁板緱璋冪敤ReleaseBuffer(),榪欎釜鍑芥暟浼氭牴鎹覆鍐呭鏉ユ洿鏂板紩鐢ㄥ唴瀛樺潡鐨勫ご閮ㄤ俊鎭?/p>

(5) 鏈鍚庤繕鏈変竴娉ㄦ剰浜嬮」錛岀湅涓嬭堪浠g爜錛?/p>

char* p = NULL;

const char* q = NULL;

{

CString str = "abcd";

q = (LPCTSTR)str;

p = str.GetBuffer(20);

AfxMessageBox(q);// 鍚堟硶鐨?/p>

strcpy(p, "this is test");//鍚堟硶鐨勶紝

}

AfxMessageBox(q);// 闈炴硶鐨勶紝鍙兘瀹岃泲

strcpy(p, "this is test");//闈炴硶鐨勶紝鍙兘瀹岃泲

榪欓噷瑕佽鐨勫氨鏄紝褰撹繑鍥炶繖浜涙寚閽堝悗錛?濡傛灉CString瀵硅薄鐢熷懡緇撴潫錛岃繖浜涙寚閽堜篃鐩稿簲鏃犳晥銆?/p>


3錛庢嫹璐?& 璧嬪?& "寮曠敤鍐呭瓨鍧? 浠涔堟椂鍊欓噴鏀撅紵


涓嬮潰婕旂ず涓孌典唬鐮佹墽琛岃繃紼?/p>

void Test()

{

CString str("abcd");

//str鎸囧悜涓寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

CString a;

//a鎸囧悜涓鍒濆鏁版嵁鐘舵侊紝

a = str;

//a涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

CString b(a);

//a銆乥涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

{

LPCTSTR temp = (LPCTSTR)a;

//temp鎸囧悜寮曠敤鍐呭瓨鍧楃殑涓查鍦板潃銆傦紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

CString d = a;

//a銆乥銆乨涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?, 闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

b = "testa";

//榪欐潯璇彞瀹為檯鏄皟鐢–String::operator=(CString&)鍑芥暟銆?b鎸囧悜涓鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧椼傦紙鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧楃殑 寮曠敤璁℃暟涓?, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?/p>

//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. a銆乨涓巗tr浠嶆寚鍚戝師 寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?

}

//鐢變簬d鐢熷懡緇撴潫錛岃皟鐢ㄦ瀽鏋勫嚱鏁幫紝瀵艱嚦寮曠敤璁℃暟鍑?錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負2,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>

LPTSTR temp = a.GetBuffer(10);

//姝よ鍙ヤ篃浼氬鑷撮噸鏂板垎閰嶆柊鍐呭瓨鍧椼倀emp鎸囧悜鏂板垎閰嶅紩鐢ㄥ唴瀛樺潡鐨勪覆棣栧湴鍧錛堟柊 鍒嗛厤鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0錛?/p>

//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. 鍙湁str浠?鎸囧悜鍘熷紩鐢ㄥ唴瀛樺潡 錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?

strcpy(temp, "temp");

//a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0 a.ReleaseBuffer();//娉ㄦ剰:a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0

}

//鎵ц鍒版錛屾墍鏈夌殑灞閮ㄥ彉閲忕敓鍛藉懆鏈熼兘宸茬粨鏉熴傚璞tr a b 鍚勮嚜璋冪敤鑷繁鐨勬瀽鏋勬瀯

//鍑芥暟錛屾墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡涔熺浉搴斿噺1

//娉ㄦ剰錛宻tr a b 鎵鍒嗗埆鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勮鏁板潎涓?,榪欏鑷存墍鍒嗛厤鐨勫唴瀛樺潡閲婃斁


閫氳繃瑙傚療涓婇潰鎵ц榪囩▼錛屾垜浠細鍙戠幇CString铏界劧鍙互澶氫釜瀵硅薄鎸囧悜鍚屼竴寮曠敤鍐呭潡瀛橈紝浣嗘槸瀹冧滑鍦ㄨ繘琛屽悇縐嶆嫹璐濄佽祴鍊煎強鏀瑰彉涓插唴瀹規椂錛屽畠鐨勫鐞嗘槸寰堟櫤鑳藉茍涓旈潪甯稿畨鍏ㄧ殑錛屽畬鍏ㄥ仛鍒頒簡浜掍笉騫叉秹銆佷簰涓嶅獎鍝嶃傚綋鐒跺繀欏昏姹備綘鐨勪唬鐮佷嬌鐢ㄦ紜伆褰擄紝鐗瑰埆鏄疄闄呬嬌鐢ㄤ腑浼氭湁鏇村鏉傜殑鎯呭喌錛屽鍋氬嚱鏁板弬鏁般佸紩鐢ㄣ佸強鏈夋椂闇淇濆瓨鍒癈StringList褰撲腑錛屽鏋滃摢鎬曟湁涓灝忓潡鍦版柟浣跨敤涓嶅綋錛屽叾緇撴灉涔熶細瀵艱嚧鍙戠敓涓嶅彲棰勭煡鐨勯敊璇?/p>


5 FreeExtra()鐨勪綔鐢?/p>

鐪嬭繖孌典唬鐮?/p>

(1) CString str("test");

(2) LPTSTR temp = str.GetBuffer(50);

(3) strcpy(temp, "there are 22 character");

(4) str.ReleaseBuffer();

(5) str.FreeExtra();

涓婇潰浠g爜鎵ц鍒扮(4)琛屾椂錛屽ぇ瀹墮兘鐭ラ亾str鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟涓?,闀垮害涓?2,鍒嗛厤闀垮害涓?0. 閭d箞鎵цstr.FreeExtra()鏃訛紝瀹冧細閲婃斁鎵鍒嗛厤鐨勫浣欑殑鍐呭瓨銆?寮曠敤鍐呭瓨鍧楄鏁頒負1,闀垮害涓?2,鍒嗛厤闀垮害涓?2)


6 Format(...) 涓?FormatV(...)

榪欐潯璇彞鍦ㄤ嬌鐢ㄤ腑鏄渶瀹規槗鍑洪敊鐨勩傚洜涓哄畠鏈瀵屾湁鎶宸фэ紝涔熺浉褰撶伒媧匯傚湪榪欓噷錛屾垜娌℃墦綆楀瀹冪粏緇嗗垎鏋愶紝瀹為檯涓妔printf(...)鎬庝箞鐢紝瀹冨氨鎬庝箞鐢ㄣ傛垜鍙彁閱掍嬌鐢ㄦ椂闇娉ㄦ剰涓鐐癸細灝辨槸瀹冪殑鍙傛暟鐨勭壒孌婃э紝鐢變簬緙栬瘧鍣ㄥ湪緙栬瘧鏃跺茍涓嶈兘鍘繪牎楠屾牸寮忎覆鍙傛暟涓庡搴旂殑鍙樺厓鐨勭被鍨嬪強闀垮害銆傛墍浠ヤ綘蹇呴』瑕佹敞鎰忥紝涓よ呬竴瀹氳瀵瑰簲涓婏紝

鍚﹀垯灝變細鍑洪敊銆傚錛?/p>

CString str;

int a = 12;

str.Format("first:%l, second: %s", a, "error");//result?璇曡瘯


7 LockBuffer() 涓?UnlockBuffer()

欏懼悕鎬濊錛岃繖涓や釜鍑芥暟鐨勪綔鐢ㄥ氨鏄寮曠敤鍐呭瓨鍧楄繘琛屽姞閿佸強瑙i攣銆備絾浣跨敤瀹冩湁浠涔堜綔鐢ㄥ強鎵ц榪囧畠鍚庡CString涓叉湁浠涔堝疄璐ㄤ笂鐨勫獎鍝嶃傚叾瀹炴尯綆鍗曪紝鐪嬩笅闈唬鐮?

(1) CString str("test");

(2) str.LockBuffer();

(3) CString temp = str;

(4) str.UnlockBuffer();

(5) str.LockBuffer();

(6) str = "error";

(7) str.ReleaseBuffer();

鎵ц瀹?3)鍚庯紝涓庨氬父鎯呭喌涓嬩笉鍚岋紝temp涓巗tr騫朵笉鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧椼備綘鍙互鍦╳atch紿楀彛鐢ㄨ繖涓〃杈懼紡(CStringData*)((CStringData*)(str.m_pchData)-1)鐪嬬湅銆?/p>

鍏跺疄鍦╩sdn涓湁璇存槑錛?/p>

While in a locked state, the string is protected in two ways:


No other string can get a reference to the data in the locked string, even if that string is assigned to the locked string.

The locked string will never reference another string, even if that other string is copied to the locked string.


8 CString 鍙槸澶勭悊涓插悧錛?/p>

涓嶅錛孋String涓嶅彧鏄兘鎿嶄綔涓詫紝鑰屼笖榪樿兘澶勭悊鍐呭瓨鍧楁暟鎹傚姛鑳藉畬鍠勫惂錛佺湅榪欐浠g爜

char p[20];

for(int loop=0; loop<sizeof(p); loop++)

{

p[loop] = 10-loop;

}

CString str((LPCTSTR)p, 20);

char temp[20];

memcpy(temp, str, str.GetLength());

str瀹屽叏鑳藉杞澆鍐呭瓨鍧梡鍒板唴瀛樺潡temp涓傛墍浠ヨ兘鐢–String鏉ュ鐞嗕簩榪涘埗鏁版嵁


8 AllocSysString()涓嶴etSysString(BSTR*)

榪欎袱涓嚱鏁版彁渚涗簡涓蹭笌BSTR鐨勮漿鎹€備嬌鐢ㄦ椂欏繪敞鎰忎竴鐐癸細褰撹皟鐢ˋllocSysString()鍚庯紝欏昏皟鐢ㄥ畠SysFreeString(...)


9 鍙傛暟鐨勫畨鍏ㄦ楠?/p>

鍦∕FC涓彁渚涗簡澶氫釜瀹忔潵榪涜鍙傛暟鐨勫畨鍏ㄦ鏌ワ紝濡傦細ASSERT. 鍏朵腑鍦–String涓篃涓嶄緥澶栵紝鏈夎澶氳繖鏍風殑鍙傛暟媯楠岋紝鍏跺疄榪欎篃璇存槑浜嗕唬鐮佺殑瀹夊叏鎬ч珮錛屽彲鏈夋椂鎴戜滑浼氬彂鐜拌繖寰堢儲錛屼篃瀵艱嚧Debug涓嶳elease鐗堟湰涓嶄竴鏍鳳紝濡傛湁鏃剁▼搴廌ebug閫氭甯革紝鑰孯elease鍒欑▼搴忓穿婧冿紱鑰屾湁鏃舵伆鐩稿弽錛孌ebug涓嶈錛孯elease琛屻傚叾瀹炴垜涓漢璁や負錛屾垜浠CString鐨勪嬌鐢ㄨ繃紼嬩腑錛屽簲鍔涙眰浠g爜璐ㄩ噺楂橈紝涓嶈兘鍦―ebug鐗堟湰涓嚭鐜頒換浣曟柇璦妗嗭紝鍝時elease榪愯浼間箮鐪嬭搗鏉ヤ竴鍒囨甯搞備絾寰堜笉瀹夊叏銆傚涓嬩唬鐮侊細

(1) CString str("test");

(2) str.LockBuffer();

(3) LPTSTR temp = str.GetBuffer(10);

(4) strcpy(temp, "error");

(5) str.ReleaseBuffer();

(6) str.ReleaseBuffer();//鎵ц鍒版鏃訛紝Debug鐗堟湰浼氬脊鍑洪敊妗?/p>


10 CString鐨勫紓甯稿鐞?/p>

鎴戝彧鎯沖己璋冧竴鐐癸細鍙湁鍒嗛厤鍐呭瓨鏃訛紝鎵嶆湁鍙兘瀵艱嚧鎶涘嚭CMemoryException.

鍚屾牱錛屽湪msdn涓殑鍑芥暟澹版槑涓紝娉ㄦ湁throw( CMemoryException)鐨勫嚱鏁伴兘鏈夐噸鏂板垎閰嶆垨璋冩暣鍐呭瓨鐨勫彲鑳姐?/p>


11 璺ㄦā鍧楁椂鐨凜string銆傚嵆涓涓狣LL鐨勬帴鍙e嚱鏁頒腑鐨勫弬鏁頒負CString&鏃訛紝瀹冧細鍙戠敓鎬庢牱鐨勭幇璞°傝В絳旀垜閬囧埌鐨勯棶棰樸傛垜鐨勯棶棰樺師鏉ュ凡緇忓彂璐達紝鍦板潃涓猴細

http://www.csdn.net/expert/topic/741/741921.xml?temp=.2283136


鏋勯犱竴涓繖鏍稢String瀵硅薄鏃訛紝濡侰String str錛屼綘鍙煡閬撴鏃剁殑str鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鍚楋紵涔熻浣犱細璁や負瀹冩寚鍚慛ULL銆傚叾瀹炰笉瀵癸紝濡傛灉榪欐牱鐨勮瘽錛孋String鎵閲囩敤鐨勫紩鐢ㄦ満鍒剁鐞嗗唴瀛樺潡灝變細鏈夐夯鐑︿簡錛屾墍浠String鍦ㄦ瀯閫犱竴涓┖涓茬殑瀵硅薄鏃訛紝瀹冧細鎸囧悜涓涓浐瀹氱殑鍒濆鍖栧湴鍧錛岃繖鍧楁暟鎹殑澹版槑濡備笅錛?/p>

AFX_STATIC_DATA int _afxInitData[] = {-1,0,0,0};

綆瑕佹弿榪版鎷竴涓嬶細褰撴煇涓狢String瀵硅薄涓茬疆絀虹殑璇濓紝濡侲mpty(),CString a絳夛紝瀹冪殑鎴愬憳鍙橀噺m_pchData灝變細鎸囧悜_afxInitData榪欎釜鍙橀噺鐨勫湴鍧銆傚綋榪欎釜CString瀵硅薄鐢熷懡鍛ㄦ湡緇撴潫鏃訛紝姝e父鎯呭喌涓嬪畠浼氬幓瀵規墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟鍑?錛屽鏋滃紩鐢ㄨ鏁頒負0(鍗蟲病鏈変換浣旵String寮曠敤瀹冩椂)錛屽垯閲婃斁榪欏潡寮曠敤鍐呭瓨銆傝岀幇鍦ㄧ殑鎯呭喌鏄鏋淐String鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鏄垵濮嬪寲鍐呭瓨鍧楁椂錛屽垯涓嶄細閲婃斁浠諱綍鍐呭瓨銆?/p>


璇翠簡榪欎箞澶氾紝榪欎笌鎴戦亣鍒扮殑闂鏈変粈涔堝叧緋誨憿錛熷叾瀹炲叧緋誨ぇ鐫鍛紵鍏剁湡姝e師鍥犲氨鏄鏋渆xe妯″潡涓巇ll妯″潡鏈変竴涓槸static緙栬瘧榪炴帴鐨勮瘽銆傞偅涔堣繖涓狢String鍒濆鍖栨暟鎹湪exe妯″潡涓巇ll妯″潡涓湁涓嶅悓鐨勫湴鍧錛屽洜涓簊tatic榪炴帴鍒欎細鍦ㄦ湰妯″潡涓湁涓浠芥簮浠g爜鐨勬嫹璐濄傚彟澶栦竴縐嶆儏鍐碉紝濡傛灉涓や釜妯″潡閮芥槸share榪炴帴鐨勶紝CString鐨勫疄鐜頒唬鐮佸垯鍦ㄥ彟涓涓崟鐙殑dll涓疄鐜幫紝鑰孉FX_STATIC_DATA鎸囧畾鍙橀噺鍙涓嬈★紝鎵浠ヤ袱涓ā鍧椾腑_afxInitData鏈夌浉鍚岀殑鍦板潃銆?/p>

鐜板湪闂瀹屽叏鏄庣櫧浜嗗惂錛佷綘鍙互鑷繁鍘繪紨紺轟竴涓嬨?/p>

__declspec (dllexport) void test(CString& str)

{

str = "abdefakdfj";//濡傛灉鏄痵tatic榪炴帴錛屽茍涓斾紶鍏ョ殑str涓虹┖涓茬殑璇濓紝榪欓噷鍑洪敊銆?/p>

}


鏈鍚庝竴鐐規兂娉曪細鍐欏緱榪欓噷錛屽叾瀹濩String涓繕鏈夎澶氭妧宸фх殑濂戒笢涓滐紝鎴戝茍娌″幓瑙i噴銆傚寰堝閲嶈澆鐨勬搷浣滅銆佹煡鎵劇瓑銆傛垜璁や負榪樻槸璇︾粏鐪嬬湅msdn錛岃繖鏍蜂篃璁鎬細姣旀垜璁茬殑濂藉浜嗐傛垜鍙晶閲嶉偅浜涘彲鑳戒細鍑洪敊鐨勬儏鍐點傚綋鐒訛紝濡傛垜涓婇潰鍙欒堪涓湁閿欒錛屾暚璇烽珮鎵嬫寚鐐癸紝涓嶈儨鎰熻阿錛?/p>


msdn錛?a >http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring_class_members.asp



yunboy 2009-07-31 13:46 鍙戣〃璇勮
]]>
setsockopt鍙傛暟璇︾粏璇存槑(杞澆)http://m.shnenglu.com/yunboy4/archive/2009/07/29/91551.htmlyunboyyunboyWed, 29 Jul 2009 00:33:00 GMThttp://m.shnenglu.com/yunboy4/archive/2009/07/29/91551.htmlhttp://m.shnenglu.com/yunboy4/comments/91551.htmlhttp://m.shnenglu.com/yunboy4/archive/2009/07/29/91551.html#Feedback0http://m.shnenglu.com/yunboy4/comments/commentRss/91551.htmlhttp://m.shnenglu.com/yunboy4/services/trackbacks/91551.html

int setsockopt(
  SOCKET s,
  int level,
  int optname,
  const char* optval,
  int optlen
);

s(濂楁帴瀛?: 鎸囧悜涓涓墦寮鐨勫鎺ュ彛鎻忚堪瀛?
 level:(綰у埆)錛?#160;鎸囧畾閫夐」浠g爜鐨勭被鍨嬨?
SOL_SOCKET: 鍩烘湰濂楁帴鍙?#160;
IPPROTO_IP: IPv4濂楁帴鍙?#160;
IPPROTO_IPV6: IPv6濂楁帴鍙?#160;
IPPROTO_TCP: TCP濂楁帴鍙?#160;
optname(閫夐」鍚?錛?#160;閫夐」鍚嶇О 
optval(閫夐」鍊?: 鏄竴涓寚鍚戝彉閲忕殑鎸囬拡 綾誨瀷錛氭暣褰紝濂楁帴鍙g粨鏋勶紝 鍏朵粬緇撴瀯綾誨瀷:linger{}, timeval{ } 
optlen(閫夐」闀垮害) 錛歰ptval 鐨勫ぇ灝?#160;

榪斿洖鍊鹼細鏍囧織鎵撳紑鎴栧叧闂煇涓壒寰佺殑浜岃繘鍒墮夐」
[/code:1:59df4ce128]

 

======================================================================== 
SOL_SOCKET 
------------------------------------------------------------------------ 
SO_BROADCAST 鍏佽鍙戦佸箍鎾暟鎹?#160;int 
閫傜敤鏂?#160;UDP socket銆傚叾鎰忎箟鏄厑璁?#160;UDP socket 銆屽箍鎾嶏紙broadcast錛夎鎭埌緗戣礬涓娿?

SO_DEBUG 鍏佽璋冭瘯 int 

SO_DONTROUTE 涓嶆煡鎵捐礬鐢?#160;int 

SO_ERROR 鑾峰緱濂楁帴瀛楅敊璇?#160;int 

SO_KEEPALIVE 淇濇寔榪炴帴 int 
媯嫻嬪鏂逛富鏈烘槸鍚﹀穿婧冿紝閬垮厤錛堟湇鍔″櫒錛夋案榪滈樆濉炰簬TCP榪炴帴鐨勮緭鍏ャ?#160;璁劇疆璇ラ夐」鍚庯紝濡傛灉2灝忔椂鍐呭湪姝ゅ鎺ュ彛鐨勪換涓鏂瑰悜閮芥病鏈夋暟鎹氦鎹紝TCP灝辮嚜鍔ㄧ粰瀵規柟 鍙戜竴涓繚鎸佸瓨媧繪帰嫻嬪垎鑺?keepalive probe)銆傝繖鏄竴涓鏂瑰繀欏誨搷搴旂殑TCP鍒嗚妭.瀹冧細瀵艱嚧浠ヤ笅涓夌鎯呭喌錛?#160;瀵規柟鎺ユ敹涓鍒囨甯革細浠ユ湡鏈涚殑ACK鍝嶅簲銆?灝忔椂鍚庯紝TCP灝嗗彂鍑哄彟涓涓帰嫻嬪垎鑺傘?#160;瀵規柟宸插穿婧冧笖宸查噸鏂板惎鍔細浠ST鍝嶅簲銆傚鎺ュ彛鐨勫緟澶勭悊閿欒琚疆涓篍CONNRESET錛屽鎺?#160;鍙f湰韜垯琚叧闂?#160;瀵規柟鏃犱換浣曞搷搴旓細婧愯嚜berkeley鐨凾CP鍙戦佸彟澶?涓帰嫻嬪垎鑺傦紝鐩擱殧75縐掍竴涓紝璇曞浘寰楀埌 涓涓搷搴斻傚湪鍙戝嚭絎竴涓帰嫻嬪垎鑺?1鍒嗛挓15縐掑悗鑻ヤ粛鏃犲搷搴斿氨鏀懼純銆傚鎺ュ彛鐨勫緟澶勭悊閿?#160;璇緗負ETIMEOUT錛屽鎺ュ彛鏈韓鍒欒鍏抽棴銆傚ICMP閿欒鏄?#8220;host unreachable(涓繪満涓?#160;鍙揪)”錛岃鏄庡鏂逛富鏈哄茍娌℃湁宕╂簝錛屼絾鏄笉鍙揪錛岃繖縐嶆儏鍐典笅寰呭鐞嗛敊璇緗負 EHOSTUNREACH銆?#160;



SO_DONTLINGER 鑻ヤ負鐪燂紝鍒橲O_LINGER閫夐」琚姝€?
SO_LINGER 寤惰繜鍏抽棴榪炴帴 struct linger 
涓婇潰榪欎袱涓夐」褰卞搷close琛屼負
閫夐」 闂撮殧 鍏抽棴鏂瑰紡 絳夊緟鍏抽棴涓庡惁
SO_DONTLINGER 涓嶅叧蹇?#160;浼橀泤 鍚?
SO_LINGER 闆?#160;寮哄埗 鍚?
SO_LINGER 闈為浂 浼橀泤 鏄?
鑻ヨ緗簡SO_LINGER錛堜害鍗砽inger緇撴瀯涓殑l_onoff鍩熻涓洪潪闆訛紝鍙傝2.4錛?.1.7鍜?.1.21鍚勮妭錛夛紝騫惰緗簡闆惰秴鏃墮棿闅旓紝鍒檆losesocket()涓嶈闃誨绔嬪嵆鎵ц錛屼笉璁烘槸鍚︽湁鎺掗槦鏁版嵁鏈彂閫佹垨鏈紜銆傝繖縐嶅叧闂柟寮忕О涓?#8220;寮哄埗”鎴?#8220;澶辨晥”鍏抽棴錛屽洜涓哄鎺ュ彛鐨勮櫄鐢佃礬绔嬪嵆琚浣嶏紝涓斾涪澶變簡鏈彂閫佺殑鏁版嵁銆傚湪榪滅鐨剅ecv()璋冪敤灝嗕互WSAECONNRESET鍑洪敊銆?
鑻ヨ緗簡SO_LINGER騫剁‘瀹氫簡闈為浂鐨勮秴鏃墮棿闅旓紝鍒檆losesocket()璋冪敤闃誨榪涚▼錛岀洿鍒版墍鍓╂暟鎹彂閫佸畬姣曟垨瓚呮椂銆傝繖縐嶅叧闂О涓?#8220;浼橀泤鐨?#8221;鍏抽棴銆傝娉ㄦ剰濡傛灉濂楁帴鍙g疆涓洪潪闃誨涓擲O_LINGER璁句負闈為浂瓚呮椂錛屽垯closesocket()璋冪敤灝嗕互WSAEWOULDBLOCK閿欒榪斿洖銆?
鑻ュ湪涓涓祦綾誨鎺ュ彛涓婅緗簡SO_DONTLINGER錛堜篃灝辨槸璇村皢linger緇撴瀯鐨刲_onoff鍩熻涓洪浂錛涘弬瑙?.4錛?.1.7錛?.1.21鑺傦級錛屽垯closesocket()璋冪敤绔嬪嵆榪斿洖銆備絾鏄紝濡傛灉鍙兘錛屾帓闃熺殑鏁版嵁灝嗗湪濂楁帴鍙e叧闂墠鍙戦併傝娉ㄦ剰錛屽湪榪欑鎯呭喌涓媁INDOWS濂楁帴鍙e疄鐜板皢鍦ㄤ竴孌典笉紜畾鐨勬椂闂村唴淇濈暀濂楁帴鍙d互鍙婂叾浠栬祫婧愶紝榪欏浜庢兂鐢ㄦ墍浠ュ鎺ュ彛鐨勫簲鐢ㄧ▼搴忔潵璇存湁涓瀹氬獎鍝嶃?



SO_OOBINLINE 甯﹀鏁版嵁鏀懼叆姝e父鏁版嵁嫻?鍦ㄦ櫘閫氭暟鎹祦涓帴鏀跺甫澶栨暟鎹?#160;int 

SO_RCVBUF 鎺ユ敹緙撳啿鍖哄ぇ灝?#160;int 
璁劇疆鎺ユ敹緙撳啿鍖虹殑淇濈暀澶у皬
涓?#160;SO_MAX_MSG_SIZE 鎴朤CP婊戝姩紿楀彛鏃犲叧錛屽鏋滀竴鑸彂閫佺殑鍖呭緢澶у緢棰戠箒錛岄偅涔堜嬌鐢ㄨ繖涓夐」

SO_SNDBUF 鍙戦佺紦鍐插尯澶у皬 int 
璁劇疆鍙戦佺紦鍐插尯鐨勪繚鐣欏ぇ灝?
涓?#160;SO_MAX_MSG_SIZE 鎴朤CP婊戝姩紿楀彛鏃犲叧錛屽鏋滀竴鑸彂閫佺殑鍖呭緢澶у緢棰戠箒錛岄偅涔堜嬌鐢ㄨ繖涓夐」
姣忎釜濂楁帴鍙i兘鏈変竴涓彂閫佺紦鍐插尯鍜屼竴涓帴鏀剁紦鍐插尯銆?#160;鎺ユ敹緙撳啿鍖鴻TCP鍜孶DP鐢ㄦ潵灝嗘帴鏀跺埌鐨勬暟鎹竴鐩翠繚瀛樺埌鐢卞簲鐢ㄨ繘紼嬫潵璇匯?#160;TCP錛歍CP閫氬憡鍙︿竴绔殑紿楀彛澶у皬銆?#160;TCP濂楁帴鍙f帴鏀剁紦鍐插尯涓嶅彲鑳芥孩鍑猴紝鍥犱負瀵規柟涓嶅厑璁稿彂鍑鴻秴榪囨墍閫氬憡紿楀彛澶у皬鐨勬暟鎹?#160;榪欏氨鏄疶CP鐨勬祦閲忔帶鍒訛紝濡傛灉瀵規柟鏃犺紿楀彛澶у皬鑰屽彂鍑轟簡瓚呰繃瀹欏彛澶у皬鐨勬暟鎹紝鍒欐帴 鏀舵柟TCP灝嗕涪寮冨畠銆?#160;UDP錛氬綋鎺ユ敹鍒扮殑鏁版嵁鎶ヨ涓嶈繘濂楁帴鍙f帴鏀剁紦鍐插尯鏃訛紝姝ゆ暟鎹姤灝辮涓㈠純銆俇DP鏄病鏈?#160;嫻侀噺鎺у埗鐨勶紱蹇殑鍙戦佽呭彲浠ュ緢瀹規槗鍦板氨娣規病鎱㈢殑鎺ユ敹鑰咃紝瀵艱嚧鎺ユ敹鏂圭殑UDP涓㈠純鏁版嵁鎶ャ?



SO_RCVLOWAT 鎺ユ敹緙撳啿鍖轟笅闄?#160;int 
SO_SNDLOWAT 鍙戦佺紦鍐插尯涓嬮檺 int 
姣忎釜濂楁帴鍙i兘鏈変竴涓帴鏀朵綆娼檺搴﹀拰涓涓彂閫佷綆娼檺搴︺傚畠浠槸鍑芥暟selectt浣跨敤鐨勶紝 鎺ユ敹浣庢疆闄愬害鏄select榪斿洖“鍙”鑰屽湪濂楁帴鍙f帴鏀剁紦鍐插尯涓繀欏繪湁鐨勬暟鎹婚噺銆?#160;鈥斺斿浜庝竴涓猅CP鎴朥DP濂楁帴鍙o紝姝ゅ肩己鐪佷負1銆傚彂閫佷綆娼檺搴︽槸璁﹕elect榪斿洖“鍙啓” 鑰屽湪濂楁帴鍙e彂閫佺紦鍐插尯涓繀欏繪湁鐨勫彲鐢ㄧ┖闂淬傚浜嶵CP濂楁帴鍙o紝姝ゅ煎父緙虹渷涓?048銆?#160;瀵逛簬UDP浣跨敤浣庢疆闄愬害錛?#160;鐢變簬鍏跺彂閫佺紦鍐插尯涓彲鐢ㄧ┖闂寸殑瀛楄妭鏁版槸浠庝笉鍙樺寲鐨勶紝鍙 UDP濂楁帴鍙e彂閫佺紦鍐插尯澶у皬澶т簬濂楁帴鍙g殑浣庢疆闄愬害錛岃繖鏍風殑UDP濂楁帴鍙e氨鎬繪槸鍙啓鐨勩?#160;UDP娌℃湁鍙戦佺紦鍐插尯錛屽彧鏈夊彂閫佺紦鍐插尯鐨勫ぇ灝忋?

SO_RCVTIMEO 鎺ユ敹瓚呮椂 struct timeval 
SO_SNDTIMEO 鍙戦佽秴鏃?#160;struct timeval 
SO_REUSERADDR 鍏佽閲嶇敤鏈湴鍦板潃鍜岀鍙?#160;int 
鍏呰緇戝畾宸茶浣跨敤鐨勫湴鍧錛堟垨绔彛鍙鳳級錛屽彲浠ュ弬鑰僢ind鐨刴an

SO_EXCLUSIVEADDRUSE
鐙崰妯″紡浣跨敤绔彛,灝辨槸涓嶅厖璁稿拰鍏跺畠紼嬪簭浣跨敤SO_REUSEADDR鍏變韓鐨勪嬌鐢ㄦ煇涓绔彛銆?
鍦ㄧ‘瀹氬閲嶇粦瀹氫嬌鐢ㄨ皝鐨勬椂鍊欙紝鏍規嵁涓鏉″師鍒欐槸璋佺殑鎸囧畾鏈鏄庣‘鍒欏皢鍖呴掍氦緇欒皝錛岃屼笖娌℃湁鏉冮檺涔嬪垎錛屼篃灝辨槸璇翠綆綰ф潈闄愮殑鐢ㄦ埛鏄彲浠ラ噸緇戝畾鍦ㄩ珮綰ф潈闄愬鏈嶅姟鍚姩鐨勭鍙d笂鐨?榪欐槸闈炲父閲嶅ぇ鐨勪竴涓畨鍏ㄩ殣鎮?
濡傛灉涓嶆兂璁╄嚜宸辯▼搴忚鐩戝惉錛岄偅涔堜嬌鐢ㄨ繖涓夐」

SO_TYPE 鑾峰緱濂楁帴瀛楃被鍨?#160;int 
SO_BSDCOMPAT 涓嶣SD緋葷粺鍏煎 int 











========================================================================== 
IPPROTO_IP 
-------------------------------------------------------------------------- 
IP_HDRINCL 鍦ㄦ暟鎹寘涓寘鍚獻P棣栭儴 int 
   榪欎釜閫夐」甯哥敤浜庨粦瀹㈡妧鏈腑錛岄殣钘忚嚜宸辯殑IP鍦板潃

IP_OPTINOS IP棣栭儴閫夐」 int 
IP_TOS 鏈嶅姟綾誨瀷 
IP_TTL 鐢熷瓨鏃墮棿 int 

浠ヤ笅IPV4閫夐」鐢ㄤ簬緇勬挱
IPv4 閫夐」 鏁版嵁綾誨瀷 鎻?#160;榪?
銆銆IP_ADD_MEMBERSHIP struct ip_mreq 鍔犲叆鍒扮粍鎾粍涓?
銆銆IP_ROP_MEMBERSHIP struct ip_mreq 浠庣粍鎾粍涓鍑?
銆銆IP_MULTICAST_IF struct ip_mreq 鎸囧畾鎻愪氦緇勬挱鎶ユ枃鐨勬帴鍙?
銆銆IP_MULTICAST_TTL u_char 鎸囧畾鎻愪氦緇勬挱鎶ユ枃鐨凾TL
銆銆IP_MULTICAST_LOOP u_char 浣跨粍鎾姤鏂囩幆璺湁鏁堟垨鏃犳晥
鍦ㄥご鏂囦歡涓畾涔変簡ip_mreq緇撴瀯錛?
[code:1:63724de67f]
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
};
[/code:1:63724de67f]
鑻ヨ繘紼嬭鍔犲叆鍒頒竴涓粍鎾粍涓紝鐢╯oket鐨剆etsockopt()鍑芥暟鍙戦佽閫夐」銆傝閫夐」綾誨瀷鏄痠p_mreq緇撴瀯錛屽畠鐨勭涓涓瓧孌礽mr_multiaddr鎸囧畾浜嗙粍鎾粍鐨勫湴鍧錛岀浜屼釜瀛楁imr_interface鎸囧畾浜嗘帴鍙g殑IPv4鍦板潃銆?
銆銆IP_DROP_MEMBERSHIP
銆銆璇ラ夐」鐢ㄦ潵浠庢煇涓粍鎾粍涓鍑恒傛暟鎹粨鏋刬p_mreq鐨勪嬌鐢ㄦ柟娉曚笌涓婇潰鐩稿悓銆?
銆銆IP_MULTICAST_IF
銆銆璇ラ夐」鍙互淇敼緗戠粶鎺ュ彛錛屽湪緇撴瀯ip_mreq涓畾涔夋柊鐨勬帴鍙c?
銆銆IP_MULTICAST_TTL
銆銆璁劇疆緇勬挱鎶ユ枃鐨勬暟鎹寘鐨凾TL錛堢敓瀛樻椂闂達級銆傞粯璁ゅ兼槸1錛岃〃紺烘暟鎹寘鍙兘鍦ㄦ湰鍦扮殑瀛愮綉涓紶閫併?
銆銆IP_MULTICAST_LOOP
銆銆緇勬挱緇勪腑鐨勬垚鍛樿嚜宸變篃浼氭敹鍒板畠鍚戞湰緇勫彂閫佺殑鎶ユ枃銆傝繖涓夐」鐢ㄤ簬閫夋嫨鏄惁嬋媧昏繖縐嶇姸鎬併?br>

 鏃犲弻 鍥炲浜庯細2003-05-08 21:21:52

IPPRO_TCP 
-------------------------------------------------------------------------- 
TCP_MAXSEG TCP鏈澶ф暟鎹鐨勫ぇ灝?#160;int 
鑾峰彇鎴栬緗甌CP榪炴帴鐨勬渶澶у垎鑺傚ぇ灝?MSS)銆傝繑鍥炲兼槸鎴戜滑鐨凾CP鍙戦佺粰鍙︿竴绔殑鏈澶?#160;鏁版嵁閲忥紝瀹冨父甯稿氨鏄敱鍙︿竴绔敤SYN鍒嗚妭閫氬憡鐨凪SS錛岄櫎闈炴垜浠殑TCP閫夋嫨浣跨敤涓涓瘮 瀵規柟閫氬憡鐨凪SS灝忎簺鐨勫箋傚鏋滄鍊煎湪濂楁帴鍙h繛鎺ヤ箣鍓嶅彇寰楋紝鍒欒繑鍥炲間負鏈粠鍙?#183;鈥旂 鏀跺埌Mss閫夐」鐨勬儏鍐典笅鎵鐢ㄧ殑緙虹渷鍊箋傚皬浜庢榪斿洖鍊肩殑淇″彲鑳界湡姝g敤鍦ㄨ繛鎺ヤ笂錛屽洜涓鴻 濡傝浣跨敤鏃墮棿鎴抽夐」鐨勮瘽錛屽畠鍦ㄦ瘡涓垎鑺備笂鍗犵敤12瀛楄妭鐨凾CP閫夐」瀹歸噺銆傛垜浠殑TcP灝?#160;鍙戦佺殑姣忎釜鍒嗚妭鐨勬渶澶ф暟鎹噺涔熷彲鍦ㄨ繛鎺ュ瓨媧繪湡鍐呮敼鍙橈紝浣嗗墠鎻愭槸TCP瑕佹敮鎸佽礬寰凪TU 鍙戠幇鍔熻兘銆傚鏋滃埌瀵規柟鐨勮礬寰勬敼鍙樹簡錛屾鍊煎彲涓婁笅璋冩暣銆?
TCP_NODELAY 涓嶄嬌鐢∟agle綆楁硶 int 

鎸囧畾TCP寮濮嬪彂閫佷繚鎸佸瓨媧繪帰嫻嬪垎鑺傚墠浠ョ涓哄崟浣嶇殑榪炴帴絀洪棽鏃墮棿銆傜己鐪佸艱嚦灝戝繀欏諱負7200縐掞紝鍗?灝忔椂銆傛閫夐」浠呭湪SO_KEPALIVEE濂楁帴鍙i夐」鎵撳紑鏃舵墠鏈夋晥銆?

TCP_NODELAY 鍜?#160;TCP_CORK錛?
榪欎袱涓夐」閮藉緗戠粶榪炴帴鐨勮涓哄叿鏈夐噸瑕佺殑浣滅敤銆傝澶歎NIX緋葷粺閮藉疄鐜頒簡TCP_NODELAY閫夐」錛屼絾鏄紝TCP_CORK鍒欐槸Linux緋葷粺鎵鐙湁鐨勮屼笖鐩稿杈冩柊錛涘畠棣栧厛鍦ㄥ唴鏍哥増鏈?.4涓婂緱浠ュ疄鐜般傛澶栵紝鍏朵粬UNIX緋葷粺鐗堟湰涔熸湁鍔熻兘綾諱技鐨勯夐」錛屽煎緱娉ㄦ剰鐨勬槸錛屽湪鏌愮鐢盉SD媧劇敓鐨勭郴緇熶笂鐨凾CP_NOPUSH閫夐」鍏跺疄灝辨槸TCP_CORK鐨勪竴閮ㄥ垎鍏蜂綋瀹炵幇銆?
TCP_NODELAY鍜孴CP_CORK鍩烘湰涓婃帶鍒朵簡鍖呯殑“Nagle鍖?#8221;錛孨agle鍖栧湪榪欓噷鐨勫惈涔夋槸閲囩敤Nagle綆楁硶鎶婅緝灝忕殑鍖呯粍瑁呬負鏇村ぇ鐨勫撫銆侸ohn Nagle鏄疦agle綆楁硶鐨勫彂鏄庝漢錛屽悗鑰呭氨鏄敤浠栫殑鍚嶅瓧鏉ュ懡鍚嶇殑錛屼粬鍦?984騫撮嬈$敤榪欑鏂規硶鏉ュ皾璇曡В鍐崇鐗規苯杞﹀叕鍙哥殑緗戠粶鎷ュ闂錛堟浜嗚В璇︽儏璇峰弬鐪婭ETF RFC 896錛夈備粬瑙e喅鐨勯棶棰樺氨鏄墍璋撶殑silly window syndrome 錛屼腑鏂囩О“鎰氳牏紿楀彛鐥囧欑兢”錛屽叿浣撳惈涔夋槸錛屽洜涓烘櫘閬嶇粓绔簲鐢ㄧ▼搴忔瘡浜х敓涓嬈″嚮閿搷浣滃氨浼氬彂閫佷竴涓寘錛岃屽吀鍨嬫儏鍐典笅涓涓寘浼氭嫢鏈変竴涓瓧鑺傜殑鏁版嵁杞借嵎浠ュ強40涓瓧鑺傞暱鐨勫寘澶達紝浜庢槸浜х敓4000%鐨勮繃杞斤紝寰堣交鏄撳湴灝辮兘浠ょ綉緇滃彂鐢熸嫢濉?銆?#160;Nagle鍖栧悗鏉ユ垚浜嗕竴縐嶆爣鍑嗗茍涓旂珛鍗沖湪鍥犵壒緗戜笂寰椾互瀹炵幇銆傚畠鐜板湪宸茬粡鎴愪負緙虹渷閰嶇疆浜嗭紝浣嗗湪鎴戜滑鐪嬫潵錛屾湁浜涘満鍚堜笅鎶婅繖涓閫夐」鍏蟲帀涔熸槸鍚堜箮闇瑕佺殑銆?
鐜板湪璁╂垜浠亣璁炬煇涓簲鐢ㄧ▼搴忓彂鍑轟簡涓涓姹傦紝甯屾湜鍙戦佸皬鍧楁暟鎹傛垜浠彲浠ラ夋嫨绔嬪嵆鍙戦佹暟鎹垨鑰呯瓑寰呬駭鐢熸洿澶氱殑鏁版嵁鐒跺悗鍐嶄竴嬈″彂閫佷袱縐嶇瓥鐣ャ傚鏋滄垜浠┈涓婂彂閫佹暟鎹紝閭d箞浜や簰鎬х殑浠ュ強瀹㈡埛/鏈嶅姟鍣ㄥ瀷鐨勫簲鐢ㄧ▼搴忓皢鏋佸ぇ鍦板彈鐩娿備緥濡傦紝褰撴垜浠鍦ㄥ彂閫佷竴涓緝鐭殑璇鋒眰騫朵笖絳夊欒緝澶х殑鍝嶅簲鏃訛紝鐩稿叧榪囪澆涓庝紶杈撶殑鏁版嵁鎬婚噺鐩告瘮灝變細姣旇緝浣庯紝鑰屼笖錛屽鏋滆姹傜珛鍗沖彂鍑洪偅涔堝搷搴旀椂闂翠篃浼氬揩涓浜涖備互涓婃搷浣滃彲浠ラ氳繃璁劇疆濂楁帴瀛楃殑TCP_NODELAY閫夐」鏉ュ畬鎴愶紝榪欐牱灝辯鐢ㄤ簡Nagle綆楁硶銆?
鍙﹀涓縐嶆儏鍐靛垯闇瑕佹垜浠瓑鍒版暟鎹噺杈懼埌鏈澶ф椂鎵嶉氳繃緗戠粶涓嬈″彂閫佸叏閮ㄦ暟鎹紝榪欑鏁版嵁浼犺緭鏂瑰紡鏈夌泭浜庡ぇ閲忔暟鎹殑閫氫俊鎬ц兘錛屽吀鍨嬬殑搴旂敤灝辨槸鏂囦歡鏈嶅姟鍣ㄣ傚簲鐢∟agle綆楁硶鍦ㄨ繖縐嶆儏鍐典笅灝變細浜х敓闂銆備絾鏄紝濡傛灉浣犳鍦ㄥ彂閫佸ぇ閲忔暟鎹紝浣犲彲浠ヨ緗甌CP_CORK閫夐」紱佺敤Nagle鍖栵紝鍏舵柟寮忔濂藉悓TCP_NODELAY鐩稿弽錛圱CP_CORK 鍜?#160;TCP_NODELAY 鏄簰鐩告帓鏂ョ殑錛夈備笅闈㈠氨璁╂垜浠粩緇嗗垎鏋愪笅鍏跺伐浣滃師鐞嗐?
鍋囪搴旂敤紼嬪簭浣跨敤sendfile()鍑芥暟鏉ヨ漿縐誨ぇ閲忔暟鎹傚簲鐢ㄥ崗璁氬父瑕佹眰鍙戦佹煇浜涗俊鎭潵棰勫厛瑙i噴鏁版嵁錛岃繖浜涗俊鎭叾瀹炲氨鏄姤澶村唴瀹廣傚吀鍨嬫儏鍐典笅鎶ュご寰堝皬錛岃屼笖濂楁帴瀛椾笂璁劇疆浜員CP_NODELAY銆傛湁鎶ュご鐨勫寘灝嗚绔嬪嵆浼犺緭錛屽湪鏌愪簺鎯呭喌涓嬶紙鍙栧喅浜庡唴閮ㄧ殑鍖呰鏁板櫒錛夛紝鍥犱負榪欎釜鍖呮垚鍔熷湴琚鏂規敹鍒板悗闇瑕佽姹傚鏂圭‘璁ゃ傝繖鏍鳳紝澶ч噺鏁版嵁鐨勪紶杈撳氨浼氳鎺ㄨ繜鑰屼笖浜х敓浜嗕笉蹇呰鐨勭綉緇滄祦閲忎氦鎹€?
浣嗘槸錛屽鏋滄垜浠湪濂楁帴瀛椾笂璁劇疆浜員CP_CORK錛堝彲浠ユ瘮鍠諱負鍦ㄧ閬撲笂鎻掑叆“濉炲瓙”錛夐夐」錛屽叿鏈夋姤澶寸殑鍖呭氨浼氬~琛ュぇ閲忕殑鏁版嵁錛屾墍鏈夌殑鏁版嵁閮芥牴鎹ぇ灝忚嚜鍔ㄥ湴閫氳繃鍖呬紶杈撳嚭鍘匯傚綋鏁版嵁浼犺緭瀹屾垚鏃訛紝鏈濂藉彇娑圱CP_CORK 閫夐」璁劇疆緇欒繛鎺?#8220;鎷斿幓濉炲瓙”浠ヤ究浠諱竴閮ㄥ垎鐨勫撫閮借兘鍙戦佸嚭鍘匯傝繖鍚?#8220;濉炰綇”緗戠粶榪炴帴鍚岀瓑閲嶈銆?
鎬昏岃█涔嬶紝濡傛灉浣犺偗瀹氳兘涓璧峰彂閫佸涓暟鎹泦鍚堬紙渚嬪HTTP鍝嶅簲鐨勫ご鍜屾鏂囷級錛岄偅涔堟垜浠緩璁綘璁劇疆TCP_CORK閫夐」錛岃繖鏍峰湪榪欎簺鏁版嵁涔嬮棿涓嶅瓨鍦ㄥ歡榪熴傝兘鏋佸ぇ鍦版湁鐩婁簬WWW銆丗TP浠ュ強鏂囦歡鏈嶅姟鍣ㄧ殑鎬ц兘錛屽悓鏃朵篃綆鍖栦簡浣犵殑宸ヤ綔銆傜ず渚嬩唬鐮佸涓嬶細

intfd, on = 1;

/* 姝ゅ鏄垱寤哄鎺ュ瓧絳夋搷浣滐紝鍑轟簬綃囧箙鐨勮冭檻鐪佺暐*/

setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* cork */
write (fd, …);
fprintf (fd, …);
sendfile (fd, …);
write (fd, …);
sendfile (fd, …);

on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 鎷斿幓濉炲瓙 */


涓嶅垢鐨勬槸錛岃澶氬父鐢ㄧ殑紼嬪簭騫舵病鏈夎冭檻鍒頒互涓婇棶棰樸備緥濡傦紝Eric Allman緙栧啓鐨剆endmail灝辨病鏈夊鍏跺鎺ュ瓧璁劇疆浠諱綍閫夐」銆?

Apache HTTPD鏄洜鐗圭綉涓婃渶嫻佽鐨刉eb鏈嶅姟鍣紝瀹冪殑鎵鏈夊鎺ュ瓧灝遍兘璁劇疆浜員CP_NODELAY閫夐」錛岃屼笖鍏舵ц兘涔熸繁鍙楀ぇ澶氭暟鐢ㄦ埛鐨勬弧鎰忋傝繖鏄負浠涔堝憿錛熺瓟妗堝氨鍦ㄤ簬瀹炵幇鐨勫樊鍒箣涓娿傜敱BSD琛嶇敓鐨凾CP/IP鍗忚鏍堬紙鍊煎緱娉ㄦ剰鐨勬槸FreeBSD錛夊湪榪欑鐘跺喌涓嬬殑鎿嶄綔灝變笉鍚屻傚綋鍦═CP_NODELAY 妯″紡涓嬫彁浜ゅぇ閲忓皬鏁版嵁鍧椾紶杈撴椂錛屽ぇ閲忎俊鎭皢鎸夌収涓嬈rite()鍑芥暟璋冪敤鍙戦佷竴鍧楁暟鎹殑鏂瑰紡鍙戦佸嚭鍘匯傜劧鑰岋紝鍥犱負璐熻矗璇鋒眰浜や粯紜鐨勮鏁板櫒鏄潰鍚戝瓧鑺傝岄潪闈㈠悜鍖咃紙鍦↙inux涓婏級鐨勶紝鎵浠ュ紩鍏ュ歡榪熺殑姒傜巼灝遍檷浣庝簡寰堝銆傜粨鏋滀粎浠呭拰鍏ㄩ儴鏁版嵁鐨勫ぇ灝忔湁鍏崇郴銆傝?#160;Linux 鍦ㄧ涓鍖呭埌杈句箣鍚庡氨瑕佹眰紜錛孎reeBSD鍒欏湪榪涜濡傛鎿嶄綔涔嬪墠浼氱瓑寰呭ソ鍑犵櫨涓寘銆?

鍦↙inux緋葷粺涓婏紝TCP_NODELAY鐨勬晥鏋滃悓涔犳儻浜嶣SD TCP/IP鍗忚鏍堢殑寮鍙戣呮墍鏈熸湜鐨勬晥鏋滄湁寰堝ぇ涓嶅悓錛岃屼笖鍦↙inux涓婄殑Apache鎬ц兘琛ㄧ幇涔熶細鏇村樊浜涖傚叾浠栧湪Linux涓婇綣侀噰鐢═CP_NODELAY鐨勫簲鐢ㄧ▼搴忎篃鏈夊悓鏍風殑闂銆?


TCP_DEFER_ACCEPT

鎴戜滑棣栧厛鑰冭檻鐨勭1涓夐」鏄疶CP_DEFER_ACCEPT錛堣繖鏄疞inux緋葷粺涓婄殑鍙硶錛屽叾浠栦竴浜涙搷浣滅郴緇熶笂涔熸湁鍚屾牱鐨勯夐」浣嗕嬌鐢ㄤ笉鍚岀殑鍚嶅瓧錛夈備負浜嗙悊瑙CP_DEFER_ACCEPT閫夐」鐨勫叿浣撴濇兂錛屾垜浠湁蹇呰澶ц嚧闃愯堪涓涓嬪吀鍨嬬殑HTTP瀹㈡埛/鏈嶅姟鍣ㄤ氦浜掕繃紼嬨傝鍥炴兂涓婽CP鏄浣曚笌浼犺緭鏁版嵁鐨勭洰鏍囧緩绔嬭繛鎺ョ殑銆傚湪緗戠粶涓婏紝鍦ㄥ垎紱葷殑鍗曞厓涔嬮棿浼犺緭鐨勪俊鎭О涓篒P鍖咃紙鎴朓P 鏁版嵁鎶ワ級銆備竴涓寘鎬繪湁涓涓惡甯︽湇鍔′俊鎭殑鍖呭ご錛屽寘澶寸敤浜庡唴閮ㄥ崗璁殑澶勭悊錛屽茍涓斿畠涔熷彲浠ユ惡甯︽暟鎹礋杞姐傛湇鍔′俊鎭殑鍏稿瀷渚嬪瓙灝辨槸涓濂楁墍璋撶殑鏍囧織錛屽畠鎶婂寘鏍囪浠h〃TCP/IP鍗忚鏍堝唴鐨勭壒孌婂惈涔夛紝渚嬪鏀跺埌鍖呯殑鎴愬姛紜絳夌瓑銆傞氬父錛屽湪緇忚繃“鏍囪”鐨勫寘閲屾惡甯﹁礋杞芥槸瀹屽叏鍙兘鐨勶紝浣嗘湁鏃訛紝鍐呴儴閫昏緫榪嬌TCP/IP鍗忚鏍堝彂鍑哄彧鏈夊寘澶寸殑IP鍖呫傝繖浜涘寘緇忓父浼氬紩鍙戣鍘岀殑緗戠粶寤惰繜鑰屼笖榪樺鍔犱簡緋葷粺鐨勮礋杞斤紝緇撴灉瀵艱嚧緗戠粶鎬ц兘鍦ㄦ暣浣撲笂闄嶄綆銆?
鐜板湪鏈嶅姟鍣ㄥ垱寤轟簡涓涓鎺ュ瓧鍚屾椂絳夊緟榪炴帴銆俆CP/IP寮忕殑榪炴帴榪囩▼灝辨槸鎵璋?#8220;3嬈℃彙鎵?#8221;銆傞鍏堬紝瀹㈡埛紼嬪簭鍙戦佷竴涓緗甋YN鏍囧織鑰屼笖涓嶅甫鏁版嵁璐熻澆鐨凾CP鍖咃紙涓涓猄YN鍖咃級銆傛湇鍔″櫒鍒欎互鍙戝嚭甯YN/ACK鏍囧織鐨勬暟鎹寘錛堜竴涓猄YN/ACK鍖咃級浣滀負鍒氭墠鏀跺埌鍖呯殑紜鍝嶅簲銆傚鎴烽殢鍚庡彂閫佷竴涓狝CK鍖呯‘璁ゆ敹鍒頒簡絎?涓寘浠庤岀粨鏉熻繛鎺ヨ繃紼嬨傚湪鏀跺埌瀹㈡埛鍙戞潵鐨勮繖涓猄YN/ACK鍖呬箣鍚庯紝鏈嶅姟鍣ㄤ細鍞ら啋涓涓帴鏀惰繘紼嬬瓑寰呮暟鎹埌杈俱傚綋3嬈℃彙鎵嬪畬鎴愬悗錛屽鎴風▼搴忓嵆寮濮嬫妸“鏈夌敤鐨?#8221;鐨勬暟鎹彂閫佺粰鏈嶅姟鍣ㄣ傞氬父錛屼竴涓狧TTP璇鋒眰鐨勯噺鏄緢灝忕殑鑰屼笖瀹屽叏鍙互瑁呭埌涓涓寘閲屻備絾鏄紝鍦ㄤ互涓婄殑鎯呭喌涓嬶紝鑷沖皯鏈?涓寘灝嗙敤鏉ヨ繘琛屽弻鍚戜紶杈擄紝榪欐牱灝卞鍔犱簡鍙鐨勫歡榪熸椂闂淬傛澶栵紝浣犺繕寰楁敞鎰忓埌錛屽湪“鏈夌敤鐨?#8221;鏁版嵁琚彂閫佷箣鍓嶏紝鎺ユ敹鏂瑰凡緇忓紑濮嬪湪絳夊緟淇℃伅浜嗐?
涓轟簡鍑忚交榪欎簺闂鎵甯︽潵鐨勫獎鍝嶏紝Linux錛堜互鍙婂叾浠栫殑涓浜涙搷浣滅郴緇燂級鍦ㄥ叾TCP瀹炵幇涓寘鎷簡TCP_DEFER_ACCEPT閫夐」銆傚畠浠緗湪渚﹀惉濂楁帴瀛楃殑鏈嶅姟鍣ㄦ柟錛岃閫夐」鍛戒護鍐呮牳涓嶇瓑寰呮渶鍚庣殑ACK鍖呰屼笖鍦ㄧ1涓湡姝f湁鏁版嵁鐨勫寘鍒拌揪鎵嶅垵濮嬪寲渚﹀惉榪涚▼銆傚湪鍙戦丼YN/ACK鍖呬箣鍚庯紝鏈嶅姟鍣ㄥ氨浼氱瓑寰呭鎴風▼搴忓彂閫佸惈鏁版嵁鐨処P鍖呫傜幇鍦紝鍙渶瑕佸湪緗戠粶涓婁紶閫?涓寘浜嗭紝鑰屼笖榪樻樉钁楅檷浣庝簡榪炴帴寤虹珛鐨勫歡榪燂紝瀵笻TTP閫氫俊鑰岃█灝ゅ叾濡傛銆?
榪欎竴閫夐」鍦ㄥソ浜涙搷浣滅郴緇熶笂閮芥湁鐩稿簲鐨勫絳夌墿銆備緥濡傦紝鍦‵reeBSD涓婏紝鍚屾牱鐨勮涓哄彲浠ョ敤浠ヤ笅浠g爜瀹炵幇錛?

/* 涓烘槑鏅拌搗瑙侊紝姝ゅ鐣ュ幓鏃犲叧浠g爜 */
struct accept_filter_arg af = { "dataready", "" };
setsockopt(s, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af));
榪欎釜鐗瑰緛鍦‵reeBSD涓婂彨鍋?#8220;鎺ュ彈榪囨護鍣?#8221;錛岃屼笖鍏鋒湁澶氱鐢ㄦ硶銆備笉榪囷紝鍦ㄥ嚑涔庢墍鏈夌殑鎯呭喌涓嬪叾鏁堟灉涓嶵CP_DEFER_ACCEPT鏄竴鏍風殑錛氭湇鍔″櫒涓嶇瓑寰呮渶鍚庣殑ACK鍖呰屼粎浠呯瓑寰呮惡甯︽暟鎹礋杞界殑鍖呫傝浜嗚В璇ラ夐」鍙婂叾瀵歸珮鎬ц兘Web鏈嶅姟鍣ㄧ殑閲嶈鎰忎箟鐨勬洿澶氫俊鎭鍙傝傾pache鏂囨。涓婄殑鏈夊叧鍐呭銆?
灝盚TTP瀹㈡埛/鏈嶅姟鍣ㄤ氦浜掕岃█錛屾湁鍙兘闇瑕佹敼鍙樺鎴風▼搴忕殑琛屼負銆傚鎴風▼搴忎負浠涔堣鍙戦佽繖縐?#8220;鏃犵敤鐨?#8221;ACK鍖呭憿錛熻繖鏄洜涓猴紝TCP鍗忚鏍堟棤娉曠煡閬揂CK鍖呯殑鐘舵併傚鏋滈噰鐢‵TP鑰岄潪HTTP錛岄偅涔堝鎴風▼搴忕洿鍒版帴鏀朵簡FTP鏈嶅姟鍣ㄦ彁紺虹殑鏁版嵁鍖呬箣鍚庢墠鍙戦佹暟鎹傚湪榪欑鎯呭喌涓嬶紝寤惰繜鐨凙CK灝嗗鑷村鎴?鏈嶅姟鍣ㄤ氦浜掑嚭鐜板歡榪熴備負浜嗙‘瀹欰CK鏄惁蹇呰錛屽鎴風▼搴忓繀欏葷煡閬撳簲鐢ㄧ▼搴忓崗璁強鍏跺綋鍓嶇姸鎬併傝繖鏍鳳紝淇敼瀹㈡埛琛屼負灝辨垚涓哄繀瑕佷簡銆?
瀵筁inux瀹㈡埛紼嬪簭鏉ヨ錛屾垜浠繕鍙互閲囩敤鍙︿竴涓夐」錛屽畠涔熻鍙仛TCP_DEFER_ACCEPT銆傛垜浠煡閬擄紝濂楁帴瀛楀垎鎴愪袱縐嶇被鍨嬶紝渚﹀惉濂楁帴瀛楀拰榪炴帴濂楁帴瀛楋紝鎵浠ュ畠浠篃鍚勮嚜鍏鋒湁鐩稿簲鐨凾CP閫夐」闆嗗悎銆傚洜姝わ紝緇忓父鍚屾椂閲囩敤鐨勮繖涓ょ被閫夐」鍗村叿鏈夊悓鏍風殑鍚嶅瓧涔熸槸瀹屽叏鍙兘鐨勩傚湪榪炴帴濂楁帴瀛椾笂璁劇疆璇ラ夐」浠ュ悗錛屽鎴峰湪鏀跺埌涓涓猄YN/ACK鍖呬箣鍚庡氨涓嶅啀鍙戦丄CK鍖咃紝鑰屾槸絳夊緟鐢ㄦ埛紼嬪簭鐨勪笅涓涓彂閫佹暟鎹姹傦紱鍥犳錛屾湇鍔″櫒鍙戦佺殑鍖呬篃灝辯浉搴斿噺灝戜簡銆?

TCP_QUICKACK

闃繪鍥犲彂閫佹棤鐢ㄥ寘鑰屽紩鍙戝歡榪熺殑鍙︿竴涓柟娉曟槸浣跨敤TCP_QUICKACK閫夐」銆傝繖涓閫夐」涓?#160;TCP_DEFER_ACCEPT涓嶅悓錛屽畠涓嶄絾鑳界敤浣滅鐞嗚繛鎺ュ緩绔嬭繃紼嬭屼笖鍦ㄦ甯告暟鎹紶杈撹繃紼嬫湡闂翠篃鍙互浣跨敤銆傚彟澶栵紝瀹冭兘鍦ㄥ鎴?鏈嶅姟鍣ㄨ繛鎺ョ殑浠諱綍涓鏂硅緗傚鏋滅煡閬撴暟鎹笉涔呭嵆灝嗗彂閫侊紝閭d箞鎺ㄨ繜ACK鍖呯殑鍙戦佸氨浼氭淳涓婄敤鍦猴紝鑰屼笖鏈濂藉湪閭d釜鎼哄甫鏁版嵁鐨勬暟鎹寘涓婅緗瓵CK 鏍囧織浠ヤ究鎶婄綉緇滆礋杞藉噺鍒版渶灝忋傚綋鍙戦佹柟鑲畾鏁版嵁灝嗚绔嬪嵆鍙戦侊紙澶氫釜鍖咃級鏃訛紝TCP_QUICKACK閫夐」鍙互璁劇疆涓?銆傚澶勪簬“榪炴帴”鐘舵佷笅鐨勫鎺ュ瓧璇ラ夐」鐨勭己鐪佸兼槸1錛岄嬈′嬌鐢ㄤ互鍚庡唴鏍稿皢鎶婅閫夐」绔嬪嵆澶嶄綅涓?錛堣繖鏄釜涓嬈℃х殑閫夐」錛夈?
鍦ㄦ煇浜涙儏褰笅錛屽彂鍑篈CK鍖呭垯闈炲父鏈夌敤銆侫CK鍖呭皢紜鏁版嵁鍧楃殑鎺ユ敹錛岃屼笖錛屽綋涓嬩竴鍧楄澶勭悊鏃朵笉鑷充簬寮曞叆寤惰繜銆傝繖縐嶆暟鎹紶杈撴ā寮忓浜や簰榪囩▼鏄浉褰撳吀鍨嬬殑錛屽洜涓烘綾繪儏鍐典笅鐢ㄦ埛鐨勮緭鍏ユ椂鍒繪棤娉曢嫻嬨傚湪Linux緋葷粺涓婅繖灝辨槸緙虹渷鐨勫鎺ュ瓧琛屼負銆?
鍦ㄤ笂榪版儏鍐典笅錛屽鎴風▼搴忓湪鍚戞湇鍔″櫒鍙戦丠TTP璇鋒眰錛岃岄鍏堝氨鐭ラ亾璇鋒眰鍖呭緢鐭墍浠ュ湪榪炴帴寤虹珛涔嬪悗灝卞簲璇ョ珛鍗沖彂閫侊紝榪欏彲璋揌TTP鐨勫吀鍨嬪伐浣滄柟寮忋傛棦鐒舵病鏈夊繀瑕佸彂閫佷竴涓函綺圭殑ACK鍖咃紝鎵浠ヨ緗甌CP_QUICKACK涓?浠ユ彁楂樻ц兘鏄畬鍏ㄥ彲鑳界殑銆傚湪鏈嶅姟鍣ㄦ柟錛岃繖涓ょ閫夐」閮藉彧鑳藉湪渚﹀惉濂楁帴瀛椾笂璁劇疆涓嬈°傛墍鏈夌殑濂楁帴瀛楋紝涔熷氨鏄鎺ュ彈鍛煎彨闂存帴鍒涘緩鐨勫鎺ュ瓧鍒欎細緇ф壙鍘熸湁濂楁帴瀛楃殑鎵鏈夐夐」銆?
閫氳繃TCP_CORK銆乀CP_DEFER_ACCEPT鍜孴CP_QUICKACK閫夐」鐨勭粍鍚堬紝鍙備笌姣忎竴HTTP浜や簰鐨勬暟鎹寘鏁伴噺灝嗚闄嶄綆鍒版渶灝忕殑鍙帴鍙楁按騫籌紙鏍規嵁TCP鍗忚鐨勮姹傚拰瀹夊叏鏂歸潰鐨勮冭檻錛夈傜粨鏋滀笉浠呮槸鑾峰緱鏇村揩鐨勬暟鎹紶杈撳拰璇鋒眰澶勭悊閫熷害鑰屼笖榪樹嬌瀹㈡埛/鏈嶅姟鍣ㄥ弻鍚戝歡榪熷疄鐜頒簡鏈灝忓寲銆?



yunboy 2009-07-29 08:33 鍙戣〃璇勮
]]>
闈為樆濉炲鎺ュ瓧鐨勬ā寮?/title><link>http://m.shnenglu.com/yunboy4/archive/2009/07/26/91231.html</link><dc:creator>yunboy</dc:creator><author>yunboy</author><pubDate>Sun, 26 Jul 2009 03:13:00 GMT</pubDate><guid>http://m.shnenglu.com/yunboy4/archive/2009/07/26/91231.html</guid><wfw:comment>http://m.shnenglu.com/yunboy4/comments/91231.html</wfw:comment><comments>http://m.shnenglu.com/yunboy4/archive/2009/07/26/91231.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/yunboy4/comments/commentRss/91231.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yunboy4/services/trackbacks/91231.html</trackback:ping><description><![CDATA[<p> </p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.闈為樆濉炲鎺ュ瓧鐨勬ā寮?br>(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)鏈嶅姟鍣ㄧ<br>    閫氬父socket榪愯鍚庨粯璁や負闃誨妯″紡銆傝璋冪敤ioctlsocket鍑芥暟璁劇疆闈為樆濉炴ā寮忋?br>濡傦細<br><br>    WSAData Data;<br>    WSAStartup(MAKEWORD(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">), </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Data);<br>    SerSocket </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(INVALID_SOCKET </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> SerSocket)<br>        cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Invalid Socket!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    u_long iMode </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>    ioctlsocket(SerSocket, FIONBIO, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">iMode);<br>    <br>    鍦ㄦ帴鍙楀鎴風璇鋒眰鐨勭嚎紼嬩腑錛岃嫢鎺ュ彈鎴愬姛灝辮繑鍥炲鎴風鐨勫鎺ュ瓧錛屽惁鍒欒繑鍥濱NVALID_SOCKET閿欒錛?br>鑻ラ敊璇唬鐮佷負WSAEWOULDBLOCK錛岃鏄庡綋鍓嶆病鏈夊鎴風璇鋒眰銆?br>濡傦細<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鎺ュ彈瀹㈡埛绔姹傜嚎紼?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">DWORD WINAPI AcceptClientPro(LPVOID LpP)<br>{<br>    SOCKADDR_IN ClientAdrr;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> AddrLen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(SOCKADDR);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">闈為樆濉炴ā寮?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsConnet)<br>    {<br>        ClientSock </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> accept(SerSocket, (SOCKADDR </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">ClientAdrr, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">AddrLen );<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(INVALID_SOCKET </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> ClientSock)<br>        {<br>            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WSAGetLastError();<br>            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">娌℃湁瀹㈡埛绔姹?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEWOULDBLOCK </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> n)    <br>            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">娌℃湁瀹㈡埛绔彂鍑鴻姹?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>                </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>            }</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">鍑虹幇閿欒!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>            }<br>        }</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>        {<br>            cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宸茶繛鎺ュ鎴風!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>            IsConnet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>            </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>        }<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br>    <br>    灝眗ecv鍑芥暟鏉ヨ錛屽湪闃誨妯″紡涓紝濡傛灉娌℃湁瀹㈡埛绔彂閫佹暟鎹繃鏉ワ紝綰跨▼鍒拌繖閲屼細闃誨錛岀洿鍒版湁鏁?br>鎹彂閫佽繃鏉ヤ負姝€傚湪闈為樆濉炴ā寮忎腑錛屾病鏈夊鎴風鍙戦佹暟鎹繃鏉ワ紝榪斿洖SOCKER_ERROR錛岄敊璇唬鐮佷負WSAEWOULDBLOCK銆?br>濡傦細<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鎺ユ敹鏁版嵁綰跨▼</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">DWORD WINAPI ReceiveDataPro(LPVOID LpP)<br>{<br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsConnet);        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">淇濊瘉榪炴帴鍚庡啀鎺ュ彈鏁版嵁</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>    {<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(IsReadyRecei)        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">淇濊瘉緙撳啿鍖哄湪鏈鐞嗘椂涓嶅彈鏂版潵鐨勬暟鎹殑褰卞搷</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">        {<br>            <br>            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ReceiLen </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> recv(ClientSock, (</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">DataPack, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DataPack), </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SOCKET_ERROR </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> ReceiLen)<br>            {<br>                </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> Err </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WSAGetLastError();<br>                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEWOULDBLOCK </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> Err)<br>                {<br>                    cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">娌℃湁鏀跺埌鏁版嵁</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                    </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>                }<br>                </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WSAENETDOWN </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> Err </span><span style="COLOR: #000000">||</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">瀹㈡埛绔叧闂簡榪炴帴</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">                    WSAETIMEDOUT </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> Err </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br>                    WSAECONNRESET </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> Err )    <br>                {<br>                    cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">鏈嶅姟鍣ㄥ叧闂簡榪炴帴</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                    </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>                }<br>            }<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> ReceiLen)        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">瀹㈡埛绔叧闂簡榪炴帴</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ReceiLen = 0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>            }<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ReceiLen </span><span style="COLOR: #000000">>=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DataPack))        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鎴愬姛鎺ユ敹</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宸叉敹鍒版暟鎹細</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">DataPack.buf</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                IsReadyRecei </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>                </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>            }<br>        }<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}    <br><br>(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)瀹㈡埛绔?br>    鍦ㄥ鎴風鐨勮繛鎺ヨ姹傜嚎紼嬩腑錛宑onnect鍑芥暟浼氳繑鍥濻OCKET_ERROR錛岃繖騫朵笉鏄鏄庤繛鎺ュけ璐ワ紝鍏蜂綋鎯呭喌<br>瑕佺湅瀹冪殑WSAGetLastError()榪斿洖鍊鹼紝鑻ュ畠涓夋榪斿洖SOCKET_ERROR鐨凟rror浠g爜渚濇涓篧SAEWOULDBLOCK錛?br>WSAEINVAL錛學SAEISCONN錛屽氨璇存槑榪炴帴鏈嶅姟鍣ㄦ垚鍔燂紝鍚﹀垯澶辮觸銆備絾鏈夌殑鏃跺橶SAEINVAL娌℃湁鍑虹幇灝辨湁WSAEISCONN<br>浜嗭紝鎵浠ユ垜榪樻槸浠SAEISCONN涓鴻繛鎺ュ畬鎴愮殑鏍囧織錛屼絾瑕佹敞鎰忓叾瀹炲湪涓夋榪斿洖浠g爜涓紝絎竴嬈$殑WSAEWOULDBLOCK<br>涔嬪墠鐨刢onnect鎿嶄綔灝辨垚鍔熶簡錛屽鏋滄病鍑烘剰澶栨湇鍔″櫒灝辮鍝嶅簲浜嗐?br>濡傦細<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">榪炴帴鏈嶅姟鍣ㄧ嚎紼?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">DWORD WINAPI ConnetServerPro(LPVOID LpP)<br>{<br>    SOCKADDR_IN ServerAddr;<br>    ServerAddr.sin_family </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> AF_INET;<br>    ServerAddr.sin_port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> htons(</span><span style="COLOR: #000000">1200</span><span style="COLOR: #000000">);<br>    ServerAddr.sin_addr.s_addr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> inet_addr(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">192.168.1.100</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> BlockFlag </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> InvalFlag </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsConnet)<br>    {<br>        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nResu </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> connect(ClientSock, (SOCKADDR </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">ServerAddr, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(SOCKADDR));<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SOCKET_ERROR </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> nResu)<br>        {<br>            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WSAGetLastError();<br>            <br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEWOULDBLOCK </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> n )        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">涓嶈兘绔嬪嵆瀹屾垚</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">榪囩▼1!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                BlockFlag</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>                </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>            }<br>            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEINVAL </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> n)        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鐩戝惉鐘舵?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">榪囩▼2!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                InvalFlag</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>                </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>            }<br>            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEISCONN </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> n)        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">榪炴帴瀹屾垚</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宸茶繛鎺ユ湇鍔″櫒!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                IsConnet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>                </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>            }<br>            </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> <br>            {<br>                cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">鍑虹幇鍏朵粬閿欒!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>                Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>            }<br>        }<br>    }<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br>    鍦ㄥ彂閫佹暟鎹嚎紼嬩腑錛宻end()榪斿洖鐨勬槸鍙戦佹暟鎹殑闀垮害璇存槑鍙戦佹垚鍔燂紱榪斿洖SOCKET_ERROR鏃訛紝鑻?br>閿欒浠g爜涓篧SAEWOULDBLOCK灝卞啀閲嶈瘯錛屼笉鏄疻SAEWOULDBLOCK灝辮鏄庢湁閿欒銆傘?br>濡傦細<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鍙戦佹暟鎹嚎紼?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">DWORD WINAPI SendDataPro(LPVOID LpP)<br>{<br>    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsConnet);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">淇濊瘉宸茶繛鎺ユ湇鍔″櫒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>    {<br>        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> len </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> send(ClientSock, (</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">DataPack, DataPack.Head.len, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SOCKET_ERROR </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> len)<br>        {<br>            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> Error </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WSAGetLastError();<br>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(WSAEWOULDBLOCK </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> Error)<br>                </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>        }<br>        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鍙戦佹垚鍔?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">        {<br>            cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">鍙戦佹垚鍔?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br>            </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>        }<br>    }<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> <img src ="http://m.shnenglu.com/yunboy4/aggbug/91231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yunboy4/" target="_blank">yunboy</a> 2009-07-26 11:13 <a href="http://m.shnenglu.com/yunboy4/archive/2009/07/26/91231.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>闃誨妯″紡http://m.shnenglu.com/yunboy4/archive/2009/07/26/91230.htmlyunboyyunboySun, 26 Jul 2009 03:09:00 GMThttp://m.shnenglu.com/yunboy4/archive/2009/07/26/91230.htmlhttp://m.shnenglu.com/yunboy4/comments/91230.htmlhttp://m.shnenglu.com/yunboy4/archive/2009/07/26/91230.html#Feedback0http://m.shnenglu.com/yunboy4/comments/commentRss/91230.htmlhttp://m.shnenglu.com/yunboy4/services/trackbacks/91230.html 

1.闃誨妯″紡
    浼氶犳垚綰跨▼闃誨鐨勬湁涓嬪垪鍥涚鎿嶄綔錛?br>(
1) 鎺ュ彈榪炴帴璇鋒眰錛歛ccept()
(
2) 鎺ュ彈鏁版嵁錛歳ecv()錛宺ecvfrom()
(
3) 璇鋒眰榪炴帴錛歝onnect()
(
4) 鍙戦佹暟鎹細send()錛宻endto()
    鍏朵腑1銆?鏈瀹規槗鍙戠敓闃誨銆?br>    
2銆佸綰跨▼鐨勯樆濉炴ā寮?br>class CServerDlg : public CDialog
{
    SOCKET m_ClientSock;
    SOCKET m_ServerSock;
    HANDLE m_RecvThread;
    HANDLE m_AcceptThread;
    .
    friend  DWORD WINAPI RecvThreadPro(LPVOID LpP);
    friend  DWORD WINAPI AcceptThreadPro(LPVOID LpP);
};
//鍒涘緩綰跨▼
BOOL CServerDlg::OnInitDialog()
{
    
    
//鍒涘緩綰跨▼
    DWORD ThreadID;
    m_RecvThread 
= CreateThread(NULL, 0, RecvThreadPro, this, CREATE_SUSPENDED, &ThreadID);
    m_AcceptThread 
= CreateThread(NULL, 0, AcceptThreadPro, this, CREATE_SUSPENDED, &ThreadID);
    
int Count = ResumeThread(m_AcceptThread);
    
}
//鎺ユ敹鏁版嵁綰跨▼
DWORD WINAPI RecvThreadPro(LPVOID LpP)
{
    CServerDlg 
*pServer = (CServerDlg *)LpP;
    ZeroMemory(buf, 
20);
    
int nLen = recv(pServer->m_ClientSock, buf, 200);
    
if(SOCKET_ERROR == nLen) 
        AfxMessageBox(
"Recv Failed!");
    
else
        AfxMessageBox(buf);
    
return 0;
}
//鎺ュ彈瀹㈡埛绔姹傜嚎紼?/span>
DWORD WINAPI AcceptThreadPro(LPVOID LpP)
{
    CServerDlg 
*pServer = (CServerDlg *)LpP;
    
struct sockaddr ClientAddr;
    
int len = sizeof(SOCKADDR_IN);
    pServer
->m_ClientSock = accept(pServer->m_ServerSock, &ClientAddr, &len);
    
if(SOCKET_ERROR == pServer->m_ClientSock)
        AfxMessageBox(
"Accept Failed!");
    
return 0;
}
//緇撴潫綰跨▼
void CServerDlg::OnClose() 
{
    
// TODO: Add your message handler code here and/or call default
    
//緇撴潫AcceptThread
    DWORD ThreadState;
    GetExitCodeThread(m_AcceptThread, 
&ThreadState);
    
if(ThreadState == STILL_ACTIVE)
    {
        
//TerminateThread(m_hThread, 0);
        WaitForSingleObject(m_AcceptThread,0xffffffff); 
        CloseHandle(m_AcceptThread); 
    }
    
//緇撴潫RecvThread
    GetExitCodeThread(m_RecvThread, &ThreadState);
    
if(ThreadState == STILL_ACTIVE)
    {
        
//TerminateThread(m_RecvThread, 0);
        WaitForSingleObject(m_RecvThread,0xffffffff); 
        CloseHandle(m_RecvThread); 
    }
    
    
    CDialog::OnClose();
}


yunboy 2009-07-26 11:09 鍙戣〃璇勮
]]>
綰跨▼鐨勫悓姝?/title><link>http://m.shnenglu.com/yunboy4/archive/2009/07/25/91181.html</link><dc:creator>yunboy</dc:creator><author>yunboy</author><pubDate>Sat, 25 Jul 2009 14:48:00 GMT</pubDate><guid>http://m.shnenglu.com/yunboy4/archive/2009/07/25/91181.html</guid><wfw:comment>http://m.shnenglu.com/yunboy4/comments/91181.html</wfw:comment><comments>http://m.shnenglu.com/yunboy4/archive/2009/07/25/91181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yunboy4/comments/commentRss/91181.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yunboy4/services/trackbacks/91181.html</trackback:ping><description><![CDATA[<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.鐢ㄤ簨浠跺璞℃潵鎺у埗綰跨▼<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Define thread function</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">DWORD __stdcall ThreadFunOne(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        WaitForSingleObject(hEvent, INFINITE);      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">闃誨綰跨▼錛岀洿鍒頒簨浠跺璞′負閫氱煡鐘舵?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br><br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadOne print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>        }<br>        SetEvent(hEvent);       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">璁劇疆浜嬩歡涓洪氱煡鐘舵?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    }    <br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br>DWORD __stdcall ThreadFunTwo(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        WaitForSingleObject(hEvent, INFINITE);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadTwo print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>        }<br>        SetEvent(hEvent);<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main()<br>{<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Define thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    HANDLE hThread1,hThread2;<br>    hEvent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateEvent(NULL, FALSE, TRUE, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Event</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Create thread</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    hThread1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunOne,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    hThread2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunTwo,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Close thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    CloseHandle(hThread1);<br>    CloseHandle(hThread2);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Note: Prevent process exiting</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br>    {<br>        ;<br>    }<br>}<br><br></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.鐢ㄤ復鐣屽尯鏉ユ帶鍒剁嚎紼?br>DWORD __stdcall ThreadFunOne(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        EnterCriticalSection(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Section);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br><br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadOne print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>        }<br>        LeaveCriticalSection(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Section);<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br>DWORD __stdcall ThreadFunTwo(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        EnterCriticalSection(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Section);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadTwo print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>        }<br>        LeaveCriticalSection(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Section);<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main()<br>{<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Define thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    HANDLE hThread1,hThread2;<br>    InitializeCriticalSection(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">Section);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Create thread</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    hThread1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunOne,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    hThread2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunTwo,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Close thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    CloseHandle(hThread1);<br>    CloseHandle(hThread2);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Note: Prevent process exiting</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br>    {<br>        ;<br>    }<br>}<br><br></span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.鐢ㄤ簰鏂ユ潵鎺у埗綰跨▼<br>DWORD __stdcall ThreadFunOne(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        WaitForSingleObject(hMutex, INFINITE);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br><br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadOne print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>        }<br>        ReleaseMutex(hMutex);<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br>DWORD __stdcall ThreadFunTwo(LPVOID lParam)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;;)<br>    {<br>        WaitForSingleObject(hMutex, INFINITE);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (WorkerID</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">MAXWORKERID)<br>        {<br>            WorkerID </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ThreadTwo print out: %i \n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,WorkerID);<br>            Sleep(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br>        }<br>        ReleaseMutex(hMutex);<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main()<br>{<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Define thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    HANDLE hThread1,hThread2;<br>    hMutex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateMutex(NULL, FALSE, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mutex</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Create thread</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    hThread1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunOne,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    hThread2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::CreateThread(NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,ThreadFunTwo,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,NULL);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Close thread handle</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    CloseHandle(hThread1);<br>    CloseHandle(hThread2);<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Note: Prevent process exiting</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br>    {<br>        ;<br>    }<br>}</span></div> <img src ="http://m.shnenglu.com/yunboy4/aggbug/91181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yunboy4/" target="_blank">yunboy</a> 2009-07-25 22:48 <a href="http://m.shnenglu.com/yunboy4/archive/2009/07/25/91181.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.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://taoseav8.com" target="_blank">亚洲精品乱码久久久久久黑人</a>| <a href="http://576193.com" target="_blank">美女成人午夜</a>| <a href="http://8135777.com" target="_blank">午夜日韩av</a>| <a href="http://777888789.com" target="_blank">99这里只有久久精品视频</a>| <a href="http://spyfaw.com" target="_blank">久久综合久久88</a>| <a href="http://05511253.com" target="_blank">激情另类综合</a>| <a href="http://4534com.com" target="_blank">久久综合久久美利坚合众国</a>| <a href="http://zhiuh.com" target="_blank">欧美激情精品久久久久久变态</a>| <a href="http://by71222.com" target="_blank">国产亚洲欧美一区二区三区</a>| <a href="http://kgg93.com" target="_blank">久久婷婷国产麻豆91天堂</a>| <a href="http://7788444.com" target="_blank">亚洲自啪免费</a>| <a href="http://y1bbs.com" target="_blank">在线观看中文字幕亚洲</a>| <a href="http://498626.com" target="_blank">欧美国产精品久久</a>| <a href="http://8eb26.com" target="_blank">欧美日韩国产999</a>| <a href="http://56667r.com" target="_blank">亚洲欧美日本在线</a>| <a href="http://hazymall.com" target="_blank">欧美一区国产一区</a>| <a href="http://wwwgay456.com" target="_blank">亚洲国产精品激情在线观看</a>| <a href="http://136hao.com" target="_blank">欧美不卡福利</a>| <a href="http://www227ee.com" target="_blank">国产精品理论片</a>| <a href="http://pourporn.com" target="_blank">欧美综合77777色婷婷</a>| <a href="http://2938423.com" target="_blank">久久蜜臀精品av</a>| <a href="http://49028b.com" target="_blank">一区二区电影免费在线观看</a>| <a href="http://xiuxiu124.com" target="_blank">99riav久久精品riav</a>| <a href="http://www-6410c.com" target="_blank">国产精品区二区三区日本</a>| <a href="http://psykoptic.com" target="_blank">噜噜噜91成人网</a>| <a href="http://baostat.com" target="_blank">欧美日韩一区二区三区免费</a>| <a href="http://jnjpsm.com" target="_blank">麻豆精品国产91久久久久久</a>| <a href="http://yh-hy.com" target="_blank">欧美亚州一区二区三区</a>| <a href="http://354eee.com" target="_blank">亚洲一区二区三区四区中文</a>| <a href="http://713b.com" target="_blank">亚洲精品四区</a>| <a href="http://v63xs.com" target="_blank">在线看国产日韩</a>| <a href="http://51120guahao.com" target="_blank">亚洲麻豆视频</a>| <a href="http://seanzhau.com" target="_blank">亚洲欧洲日本国产</a>| <a href="http://798814.com" target="_blank">欧美一区二区网站</a>| <a href="http://668527.com" target="_blank">午夜精品久久久久久99热</a>| <a href="http://qdzhudai.com" target="_blank">欧美一区激情</a>| <a href="http://taotuango.com" target="_blank">午夜在线成人av</a>| <a href="http://www-kj777.com" target="_blank">国产精品捆绑调教</a>| <a href="http://cz-sensor.com" target="_blank">一区二区三区免费在线观看</a>| <a href="http://tk263.com" target="_blank">亚洲第一精品久久忘忧草社区</a>| <a href="http://xiaobi13.com" target="_blank">亚洲巨乳在线</a>| <a href="http://www-222kkk.com" target="_blank">国产精品私房写真福利视频</a>| <a href="http://004ttt.com" target="_blank">亚洲精品乱码久久久久久日本蜜臀</a>| <a href="http://www-36900.com" target="_blank">欧美日韩高清在线播放</a>| <a href="http://tyaisen.com" target="_blank">一区二区av在线</a>| <a href="http://nn99dd.com" target="_blank">99re6热在线精品视频播放速度</a>| <a href="http://wwwmy77757.com" target="_blank">久久精品麻豆</a>| <a href="http://8946286.com" target="_blank">麻豆精品精华液</a>| <a href="http://pp88qq.com" target="_blank">亚洲激情自拍</a>| <a href="http://baidijs.com" target="_blank">欧美激情第六页</a>| <a href="http://8847m.com" target="_blank">日韩网站在线观看</a>| <a href="http://6055365.com" target="_blank">亚洲午夜国产成人av电影男同</a>| <a href="http://876769.com" target="_blank">欧美韩日精品</a>| <a href="http://zw1019.com" target="_blank">亚洲天堂网在线观看</a>| <a href="http://nxyhbz.com" target="_blank">夜夜嗨av一区二区三区中文字幕</a>| <a href="http://cgnwp.com" target="_blank">欧美成人国产va精品日本一级</a>| <a href="http://miaoxp.com" target="_blank">久久综合狠狠综合久久综青草 </a>| <a href="http://wwwnnnn.com" target="_blank">亚洲乱码国产乱码精品精天堂</a>| <a href="http://713b.com" target="_blank">亚洲国产精品毛片</a>| <a href="http://894322.com" target="_blank">欧美日韩卡一卡二</a>| <a href="http://www22336.com" target="_blank">中文久久精品</a>| <a href="http://98tangav.com" target="_blank">美女诱惑黄网站一区</a>| <a href="http://xpj694.com" target="_blank">日韩一级精品</a>| <a href="http://954k.com" target="_blank">亚洲乱码久久</a>| <a href="http://ae262.com" target="_blank">欧美专区在线播放</a>| <a href="http://caihongie.com" target="_blank">亚洲高清在线观看一区</a>| <a href="http://bjzgmember.com" target="_blank">国内精品久久国产</a>| <a href="http://www-787788.com" target="_blank">欧美精品18videos性欧美</a>| <a href="http://yw-95588.com" target="_blank">日韩午夜av电影</a>| <a href="http://zgslwtc.com" target="_blank">久久久久国产精品厨房</a>| <a href="http://2061826.com" target="_blank">亚洲无人区一区</a>| <a href="http://jrtkpx.com" target="_blank">韩国女主播一区</a>| <a href="http://xilxx.com" target="_blank">欧美调教视频</a>| <a href="http://163263.com" target="_blank">欧美成人福利视频</a>| <a href="http://www4411n.com" target="_blank">久久成人国产</a>| <a href="http://elpezomaha.com" target="_blank">亚洲性感美女99在线</a>| <a href="http://95gun.com" target="_blank">久久青草欧美一区二区三区</a>| <a href="http://czsanlin.com" target="_blank">亚洲福利视频一区</a>| <a href="http://gztgo.com" target="_blank">国产欧美日韩中文字幕在线</a>| <a href="http://xjhzgy.com" target="_blank">美女黄毛**国产精品啪啪</a>| <a href="http://www-13978.com" target="_blank">宅男噜噜噜66国产日韩在线观看</a>| <a href="http://goldteddy.com" target="_blank">久久久五月天</a>| <a href="http://668527.com" target="_blank">亚洲中无吗在线</a>| <a href="http://fobdoer.com" target="_blank">99在线精品视频</a>| <a href="http://sdjzzs.com" target="_blank">亚洲激情一区</a>| <a href="http://482896.com" target="_blank">中文精品99久久国产香蕉</a>| <a href="http://ca88tv.com" target="_blank">亚洲国产精品黑人久久久</a>| <a href="http://aimashe.com" target="_blank">欧美一区在线看</a>| <a href="http://www-577511.com" target="_blank">午夜精品久久久久久久99樱桃 </a>| <a href="http://59jf.com" target="_blank">亚洲视频一区在线</a>| <a href="http://chunhuigk.com" target="_blank">亚洲自拍另类</a>| <a href="http://85181890.com" target="_blank">欧美激情国产高清</a>| <a href="http://5254f.com" target="_blank">黄色成人在线免费</a>| <a href="http://03qt.com" target="_blank">亚洲一区二区在线免费观看</a>| <a href="http://xxtv123.com" target="_blank">欧美制服第一页</a>| <a href="http://036762.com" target="_blank">亚洲三级影院</a>| <a href="http://3531888.com" target="_blank">免费成人你懂的</a>| <a href="http://pao449.com" target="_blank">国产一区日韩欧美</a>| <a href="http://www-222kkk.com" target="_blank">在线一区欧美</a>| <a href="http://9885888.com" target="_blank">久久精品视频va</a>| <a href="http://ncyy4.com" target="_blank">久久gogo国模裸体人体</a>| <a href="http://9e67.com" target="_blank">久久久免费观看视频</a>| <a href="http://44ie.com" target="_blank">美日韩精品免费观看视频</a>| <a href="http://6661639.com" target="_blank">久久久蜜桃一区二区人</a>| <a href="http://4009935888.com" target="_blank">老司机成人在线视频</a>| <a href="http://www-4890.com" target="_blank">欧美网站在线</a>| <a href="http://www92444.com" target="_blank">国产亚洲精品久久久久婷婷瑜伽</a>| <a href="http://www51avav.com" target="_blank">国模叶桐国产精品一区</a>| <a href="http://9238479.com" target="_blank">亚洲蜜桃精久久久久久久</a>| <a href="http://8090567.com" target="_blank">亚洲欧美制服中文字幕</a>| <a href="http://www369cf.com" target="_blank">免费观看不卡av</a>| <a href="http://b46n.com" target="_blank">亚洲天堂激情</a>| <a href="http://zgztby.com" target="_blank">欧美精品一区二区三区在线播放 </a>| <a href="http://05511253.com" target="_blank">亚洲欧美成人网</a>| <a href="http://412342.com" target="_blank">久久综合国产精品台湾中文娱乐网</a>| <a href="http://xshgwy.com" target="_blank">欧美国产另类</a>| <a href="http://3dmh145.com" target="_blank">亚洲欧美一区二区三区在线 </a>| <a href="http://wg135.com" target="_blank">国产精品永久免费观看</a>| <a href="http://wwww999.com" target="_blank">亚洲国产精品123</a>| <a href="http://5138555.com" target="_blank">午夜久久资源</a>| <a href="http://188267.com" target="_blank">99精品欧美一区二区蜜桃免费</a>| <a href="http://s0247.com" target="_blank">欧美在线二区</a>| <a href="http://xmt86.com" target="_blank">欧美日韩美女</a>| <a href="http://wwwby2232.com" target="_blank">亚洲伦理网站</a>| <a href="http://99999zc.com" target="_blank">久久精品99</a>| <a href="http://0855dyw.com" target="_blank">国产精品xnxxcom</a>| <a href="http://133868.com" target="_blank">亚洲精品视频在线播放</a>| <a href="http://91chaopron.com" target="_blank">欧美国产一区二区</a>| <a href="http://799868.com" target="_blank">欧美日韩高清在线观看</a>| <a href="http://cabenn.com" target="_blank">亚洲欧美日韩国产一区二区三区</a>| <a href="http://737sihu.com" target="_blank">亚洲视频免费观看</a>| <a href="http://huokemima.com" target="_blank">国产精品激情电影</a>| <a href="http://hfztkyhfz.com" target="_blank">亚洲欧美另类久久久精品2019</a>| <a href="http://www278999.com" target="_blank">亚洲美洲欧洲综合国产一区</a>| <a href="http://173168.com" target="_blank">欧美屁股在线</a>| <a href="http://777888789.com" target="_blank">欧美亚洲色图校园春色</a>| <a href="http://86868o.com" target="_blank">久久精品视频在线观看</a>| <a href="http://91chaopron.com" target="_blank">亚洲精品三级</a>| <a href="http://rxbbei.com" target="_blank">久久国产精品一区二区</a>| <a href="http://www-65581.com" target="_blank">亚洲小说春色综合另类电影</a>| <a href="http://shruhan.com" target="_blank">亚洲欧美色一区</a>| <a href="http://645955.com" target="_blank">亚洲高清视频的网址</a>| <a href="http://057232.com" target="_blank">一本一本久久</a>| <a href="http://aijiaoji.com" target="_blank">亚洲国产成人tv</a>| <a href="http://ssni888.com" target="_blank">午夜激情综合网</a>| <a href="http://huokemima.com" target="_blank">亚洲精品免费在线观看</a>| <a href="http://41818c.com" target="_blank">亚洲一区图片</a>| <a href="http://yw-95588.com" target="_blank">亚洲免费久久</a>| <a href="http://phdy999.com" target="_blank">久久综合精品国产一区二区三区</a>| <a href="http://www13256.com" target="_blank">9人人澡人人爽人人精品</a>| <a href="http://0855dyw.com" target="_blank">香蕉成人啪国产精品视频综合网</a>| <a href="http://mimi78.com" target="_blank">91久久精品一区二区别</a>| <a href="http://126900.com" target="_blank">久久精品1区</a>| <a href="http://678665.com" target="_blank">欧美亚洲视频</a>| <a href="http://a6a3.com" target="_blank">国产欧美日韩麻豆91</a>| <a href="http://456316.com" target="_blank">在线亚洲观看</a>| <a href="http://ckk755.com" target="_blank">亚洲午夜国产成人av电影男同</a>| <a href="http://855821.com" target="_blank">久久久一本精品99久久精品66</a>| <a href="http://329374.com" target="_blank">欧美一区二区三区在线观看</a>| <a href="http://www0505nn.com" target="_blank">亚洲社区在线观看</a>| <a href="http://75yyyy.com" target="_blank">欧美精品久久久久久久</a>| <a href="http://chufengguanye.com" target="_blank">精品福利电影</a>| <a href="http://66666556.com" target="_blank">久色成人在线</a>| <a href="http://aaddgg66.com" target="_blank">玖玖玖国产精品</a>| <a href="http://hs045.com" target="_blank">红桃视频国产一区</a>| <a href="http://xianconnector.com" target="_blank">久久天堂精品</a>| <a href="http://www-919198.com" target="_blank">欧美77777</a>| <a href="http://1616mz.com" target="_blank">亚洲美女精品久久</a>| <a href="http://www66617.com" target="_blank">欧美日韩视频专区在线播放 </a>| <a href="http://118936.com" target="_blank">快射av在线播放一区</a>| <a href="http://instantptt.com" target="_blank">欧美亚日韩国产aⅴ精品中极品</a>| <a href="http://love136.com" target="_blank">午夜精品免费视频</a>| <a href="http://wwwwy9001.com" target="_blank">亚洲级视频在线观看免费1级</a>| <a href="http://259758.com" target="_blank">欧美在线日韩在线</a>| <a href="http://1235656.com" target="_blank">亚洲网站在线观看</a>| <a href="http://119553.com" target="_blank">欧美mv日韩mv国产网站</a>| <a href="http://maoshimh.com" target="_blank">亚洲欧洲一二三</a>| <a href="http://70909g.com" target="_blank">欧美va天堂</a>| <a href="http://zhouqie.com" target="_blank">亚洲人在线视频</a>| <a href="http://138268.com" target="_blank">亚洲一区在线播放</a>| <a href="http://959425.com" target="_blank">欧美一区日本一区韩国一区</a>| <a href="http://cca22.com" target="_blank">久久久久国产一区二区三区</a>| <a href="http://dtwave-ind.com" target="_blank">久久综合影视</a>| <a href="http://sz-jyqj.com" target="_blank">亚洲国产综合91精品麻豆</a>| <a href="http://4884888.com" target="_blank">亚洲日本视频</a>| <a href="http://hg98688.com" target="_blank">久久久综合网站</a>| <a href="http://713b.com" target="_blank">国产精品天美传媒入口</a>| <a href="http://m-pisiwa.com" target="_blank">在线成人www免费观看视频</a>| <a href="http://8888590.com" target="_blank">亚洲一级一区</a>| <a href="http://xunlei520.com" target="_blank">亚洲高清一二三区</a>| <a href="http://569688.com" target="_blank">香蕉成人久久</a>| <a href="http://y66776.com" target="_blank">亚洲夜晚福利在线观看</a>| <a href="http://794579.com" target="_blank">亚洲精品日韩久久</a>| <a href="http://by1422.com" target="_blank">一区二区三区欧美亚洲</a>| <a href="http://yy6024.com" target="_blank">亚洲欧美日韩在线综合</a>| <a href="http://lampreydb.com" target="_blank">欧美一级片一区</a>| <a href="http://am3757.com" target="_blank">欧美一区二区在线免费观看</a>| <a href="http://7234hh.com" target="_blank">久久精品99国产精品酒店日本</a>| <a href="http://fulong-tj.com" target="_blank">欧美一区二视频</a>| <a href="http://3bmmxyz.com" target="_blank">久久综合伊人77777蜜臀</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>