锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
1. 闈欐佸嚱鏁板簱
榪欑被搴撶殑鍚嶅瓧涓鑸槸libxxx.a錛涘埄鐢ㄩ潤鎬佸嚱鏁板簱緙栬瘧鎴愮殑鏂囦歡姣旇緝澶э紝鍥犱負鏁翠釜 鍑芥暟搴撶殑鎵鏈夋暟鎹兘浼氳鏁村悎榪涚洰鏍囦唬鐮佷腑錛屼粬鐨勪紭鐐瑰氨鏄捐屾槗瑙佷簡錛屽嵆緙栬瘧鍚庣殑鎵ц紼嬪簭涓嶉渶瑕佸閮ㄧ殑鍑芥暟搴撴敮鎸侊紝鍥犱負鎵鏈変嬌鐢ㄧ殑鍑芥暟閮藉凡緇忚緙栬瘧榪涘幓浜嗐傚綋鐒惰繖涔熶細鎴愪負浠栫殑緙虹偣錛屽洜涓哄鏋滈潤鎬佸嚱鏁板簱鏀瑰彉浜嗭紝閭d箞浣犵殑紼嬪簭蹇呴』閲嶆柊緙栬瘧銆?/p>
2. 鍔ㄦ佸嚱鏁板簱
榪欑被搴撶殑鍚嶅瓧涓鑸槸libxxx.so;鐩稿浜庨潤鎬佸嚱鏁板簱錛屽姩鎬佸嚱鏁板簱鍦ㄧ紪璇戠殑鏃跺?騫舵病鏈夎緙栬瘧榪涚洰鏍囦唬鐮佷腑錛屼綘鐨勭▼搴忔墽琛屽埌鐩稿叧鍑芥暟鏃舵墠璋冪敤璇ュ嚱鏁板簱閲岀殑鐩稿簲鍑芥暟錛屽洜姝ゅ姩鎬佸嚱鏁板簱鎵浜х敓鐨勫彲鎵ц鏂囦歡姣旇緝灝忋傜敱浜庡嚱鏁板簱娌℃湁琚暣鍚堣繘浣犵殑紼嬪簭錛岃屾槸紼嬪簭榪愯鏃跺姩鎬佺殑鐢寵騫惰皟鐢紝鎵浠ョ▼搴忕殑榪愯鐜涓繀欏繪彁渚涚浉搴旂殑搴撱傚姩鎬佸嚱鏁板簱鐨勬敼鍙樺茍涓嶅獎鍝嶄綘鐨勭▼搴忥紝鎵浠ュ姩鎬佸嚱鏁板簱鐨勫崌綰ф瘮杈冩柟渚褲?nbsp;
linux緋葷粺鏈夊嚑涓噸瑕佺殑鐩綍瀛樻斁鐩稿簲鐨勫嚱鏁板簱錛屽/lib /usr/lib銆?/p>
闈欐佸簱鐨勬搷浣滃伐鍏鳳細gcc鍜宎r 鍛戒護銆?nbsp;
緙栧啓鍙婁嬌鐢ㄩ潤鎬佸簱
(1)璁捐搴撴簮鐮?pr1.c 鍜?pr2.c
[root@billstone make_lib]# cat pr1.c
void print1()
{
printf("This is the first lib src!\n");
}
[root@billstone make_lib]# cat pr2.c
void print2()
{
printf("This is the second src lib!\n");
}
(2) 緙栬瘧.c 鏂囦歡
[bill@billstone make_lib]$ cc -O -c pr1.c pr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r-- 1 bill bill 804 4 鏈?nbsp; 15 11:11 pr1.o
-rw-rw-r-- 1 bill bill 804 4 鏈?nbsp; 15 11:11 pr2.o
(3) 閾炬帴闈欐佸簱
涓轟簡鍦ㄧ紪璇戠▼搴忎腑姝g‘鎵懼埌搴撴枃浠?闈欐佸簱蹇呴』鎸夌収 lib[name].a 鐨勮鍒欏懡鍚?濡備笅渚嬩腑[name]=pr.
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ls -l *.a
-rw-rw-r-- 1 bill bill 1822 4 鏈?nbsp; 15 11:12 libpr.a
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4) 璋冪敤搴撳嚱鏁頒唬鐮?main.c
[bill@billstone make_lib]$ cat main.c
int main()
{
print1();
print2();
return 0;
}
(5) 緙栬瘧閾炬帴閫夐」
-L 鍙?l 鍙傛暟鏀懼湪鍚庨潰.鍏朵腑,-L 鍔犺澆搴撴枃浠惰礬寰?-l 鎸囨槑搴撴枃浠跺悕瀛?
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr
[bill@billstone make_lib]$ ls -l main*
-rwxrwxr-x 1 bill bill 11805 4 鏈?nbsp; 15 11:17 main
-rw-rw-r-- 1 bill bill 50 4 鏈?nbsp; 15 11:15 main.c
(6)鎵ц鐩爣紼嬪簭
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!
[bill@billstone make_lib]$
緙栧啓鍔ㄦ佸簱
(1)璁捐搴撲唬鐮?/strong>
[bill@billstone make_lib]$ cat pr1.c
int p = 2;
void print(){
printf("This is the first dll src!\n");
}
[bill@billstone make_lib]$
(2)鐢熸垚鍔ㄦ佸簱
[bill@billstone make_lib]$ gcc -O -fpic -shared -o dl.so pr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x 1 bill bill 6592 4 鏈?nbsp; 15 15:19 dl.so
[bill@billstone make_lib]$
鍔ㄦ佸簱鐨勯殣寮忚皟鐢?/strong>
鍦ㄧ紪璇戣皟鐢ㄥ簱鍑芥暟浠g爜鏃舵寚鏄庡姩鎬佸簱鐨勪綅緗強鍚嶅瓧, 鐪嬩笅闈㈠疄渚?nbsp;
[bill@billstone make_lib]$ cat main.c
int main()
{
print();
return 0;
}
[bill@billstone make_lib]$ gcc -o tdl main.c ./dl.so
[bill@billstone make_lib]$ ./tdl
This is the first dll src!
[bill@billstone make_lib]$
褰撳姩鎬佸簱鐨勪綅緗椿鍚嶅瓧鍙戠敓鏀瑰彉鏃? 紼嬪簭灝嗘棤娉曟甯歌繍琛? 鑰屽姩鎬佸簱鍙栦唬闈欐佸簱鐨勫ソ澶勪箣涓鍒欐槸閫氳繃鏇存柊鍔ㄦ佸簱鑰岄殢鏃跺崌綰у簱鐨勫唴瀹?
鍔ㄦ佸簱鐨勬樉寮忚皟鐢?/strong>
鏄懼紡璋冪敤鍔ㄦ佸簱闇瑕佸洓涓嚱鏁扮殑鏀寔, 鍑芥暟 dlopen 鎵撳紑鍔ㄦ佸簱, 鍑芥暟 dlsym 鑾峰彇鍔ㄦ佸簱涓璞″熀鍧, 鍑?/strong>鏁?dlerror 鑾峰彇鏄懼紡鍔ㄦ佸簱鎿嶄綔涓殑閿欒淇℃伅, 鍑芥暟 doclose 鍏抽棴鍔ㄦ佸簱.
[bill@billstone make_lib]$ cat main.c
#include <dlfcn.h>
int main()
{
void *pHandle;
void (*pFunc)(); // 鎸囧悜鍑芥暟鐨勬寚閽?nbsp;
int *p;
pHandle = dlopen("./d1.so", RTLD_NOW); // 鎵撳紑鍔ㄦ佸簱
if(!pHandle){
printf("Can't find d1.so \n");
exit(1);
}
pFunc = (void (*)())dlsym(pHandle, "print"); // 鑾峰彇搴撳嚱鏁?print 鐨勫湴鍧
if(pFunc)
pFunc();
else
printf("Can't find function print\n");
p = (int *)dlsym(pHandle, "p"); // 鑾峰彇搴撳彉閲?p 鐨勫湴鍧
if(p)
printf("p = %d\n", *p);
else
printf("Can't find int p\n");
dlclose(pHandle); // 鍏抽棴鍔ㄦ佸簱
return 0;
}
[bill@billstone make_lib]$ gcc -o tds main.c –ld1 –L.
姝ゆ椂榪樹笉鑳界珛鍗?/tds錛屽洜涓哄湪鍔ㄦ佸嚱鏁板簱浣跨敤鏃訛紝浼氭煡鎵?usr/lib銆?lib鐩綍涓嬬殑鍔ㄦ佸嚱鏁板簱錛岃屾鏃舵垜浠敓鎴愮殑搴撲笉鍦ㄩ噷杈廣?榪欎釜鏃跺欐湁濂藉嚑縐嶆柟娉曞彲浠ヨ浠栨垚鍔熻繍琛岋細 鏈鐩存帴鏈綆鍗曠殑鏂規硶灝辨槸鎶妉ibstr_out.so鎷夊埌/usr/lib鎴?lib涓幓銆?榪樻湁涓縐嶆柟娉?export LD_LIBRARY_PATH=$(pwd) 鍙﹀榪樺彲浠ュ湪/etc/ld.so.conf鏂囦歡閲屽姞鍏ユ垜浠敓鎴愮殑搴撶殑鐩綍錛岀劧鍚?sbin/ldconfig銆?/etc/ld.so.conf鏄潪甯擱噸瑕佺殑涓涓洰褰曪紝閲岄潰瀛樻斁鐨勬槸閾炬帴鍣ㄥ拰鍔犺澆鍣ㄦ悳绱㈠叡浜簱鏃惰媯鏌ョ殑鐩綍錛岄粯璁ゆ槸浠?usr/lib /lib涓鍙栫殑錛屾墍浠ユ兂瑕侀『鍒╄繍琛岋紝鎴戜滑涔熷彲浠ユ妸鎴戜滑搴撶殑鐩綍鍔犲叆鍒拌繖涓枃浠朵腑騫舵墽琛?sbin/ldconfig 銆傚彟澶栬繕鏈変釜鏂囦歡闇瑕佷簡瑙?etc/ld.so.cache,閲岄潰淇濆瓨浜嗗父鐢ㄧ殑鍔ㄦ佸嚱鏁板簱錛屼笖浼氬厛鎶婁粬浠姞杞藉埌鍐呭瓨涓紝鍥犱負鍐呭瓨鐨勮闂熷害榪滆繙澶т簬紜洏鐨勮闂熷害錛岃繖鏍峰彲浠ユ彁楂樿蔣浠跺姞杞藉姩鎬佸嚱鏁板簱鐨勯熷害浜嗐?/p>
浣跨敤ldd鍛戒護鏉ユ煡鐪嬫墽琛屾枃浠朵緷璧栦簬鍝簺搴撱?/p>
璇ュ懡浠ょ敤浜庡垽鏂煇涓彲鎵ц鐨?binary 妗f鍚湁浠涔堝姩鎬佸嚱寮忓簱銆?br />
[root@test root]# ldd [-vdr] [filename]
鍙傛暟璇存槑錛?br />
--version銆銆鎵撳嵃ldd鐨勭増鏈彿
-v --verbose銆銆鎵撳嵃鎵鏈変俊鎭紝渚嬪鍖呮嫭絎﹀彿鐨勭増鏈俊鎭?br />
-d --data-relocs銆銆鎵ц絎﹀彿閲嶉儴緗詫紝騫舵姤鍛婄己灝戠殑鐩爣瀵硅薄錛堝彧瀵笶LF鏍煎紡閫傜敤錛?br />
-r --function-relocs銆銆瀵圭洰鏍囧璞″拰鍑芥暟鎵ц閲嶆柊閮ㄧ講錛屽茍鎶ュ憡緙哄皯鐨勭洰鏍囧璞″拰鍑芥暟錛堝彧瀵笶LF鏍煎紡閫傜敤錛?br />
--help 鐢ㄦ硶淇℃伅銆?/p>
濡傛灉鍛戒護琛屼腑緇欏畾鐨勫簱鍚嶅瓧鍖呭惈'/'錛岃繖涓▼搴忕殑libc5鐗堟湰灝嗕嬌鐢ㄥ畠浣滀負搴撳悕瀛楋紱鍚﹀垯瀹冨皢鍦ㄦ爣鍑嗕綅緗悳绱㈠簱銆傝繍琛屼竴涓綋鍓嶇洰褰曚笅鐨勫叡浜簱錛屽姞鍓嶇紑"./"銆?/p>
@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
鍋囪緇忚繃涓孌墊椂闂寸殑浣跨敤錛岀數鑴戦噷榪愯浜嗗緢澶氱▼搴忥紝榪欎簺紼嬪簭鏈変簺淇濈暀鍦ㄥ唴瀛樹腑錛屾湁浜?#8220;鏆傚瓨”鍦ㄧ‖鐩樹腑銆傚鏋滆繖鏃跺欐垜浠笉鎵撶畻浣跨敤鐢佃剳錛岄偅涔?#8220;鍏蟲満”銆?#8220;浼戠湢”錛屽拰“鐫$湢”鐨勪笉鍚岀偣灝卞彲浠ヤ綋鐜板嚭鏉ヤ簡銆?/p>
榪?涔熷氨鏄錛屽鏋滆璁╃數鑴戝叧鏈猴紝Windows棣栧厛瑕佸叧闂墍鏈夎繍琛屼腑鐨勭▼搴忥紝鐒跺悗鍏抽棴緋葷粺鍚庡彴鐨勬湇鍔★紝鎺ョ潃鍚戜富鏉垮拰鐢墊簮鍙戝嚭鐗規畩鐨勪俊鍙鳳紝璁╃數婧愬垏鏂鎵鏈夎 澶囩殑渚涚數錛岀數鑴戝交搴曞叧闂備笅嬈″紑鏈哄悗錛岀數鑴戝畬鎴愯嚜媯宸ヤ綔錛岀劧鍚庡皢Windows緋葷粺杞藉叆鍐呭瓨錛屾帴鐫緇х畫鍔犺澆鍏朵粬鍚庡彴鏈嶅姟錛屽茍鏄劇ず鐧誨綍鐣岄潰銆傜櫥褰曞悗錛屾墠鍙互 榪愯鑷繁鐨勭▼搴忥紝寮濮嬩嬌鐢ㄧ數鑴戙傛暣涓繃紼嬪洜涓鴻褰誨簳鍏抽棴騫墮噸澶村紑濮嬪惎鍔ㄧ郴緇熷拰紼嬪簭錛屽洜姝ゆ墍闇鐨勬椂闂存渶甯搞?br />
瀵逛簬寰呮満妯″紡錛屽鏋滆灝嗙數鑴戞斁鍏?寰呮満妯″紡錛學indows浼氳嚜鍔ㄥ悜鐢墊簮鍙戝嚭鍙︿竴縐嶇壒孌婁俊鍙鳳紝闅忓悗鐢墊簮浼氬垏鏂櫎浜嗗唴瀛樺鍏朵粬璁懼鐨勪緵鐢碉紝鍐呭瓨涓緷鐒朵繚瀛樹簡緋葷粺榪愯涓殑鎵鏈夋暟鎹紝榪欎釜榪囩▼涓 涓ょ閽熷氨鍙互瀹屾垚銆傚綋浠庡緟鏈虹姸鎬佽繘鍏ユ甯哥姸鎬佹椂錛屽彧瑕侀氱數錛岀劧鍚嶹indows灝變細緇х畫浠庡唴瀛樹腑淇濆瓨鐨勪笂涓嬈$殑“鐘舵佹暟鎹?#8221;涓嬭繍琛岋紝榪欎釜榪囩▼涔熷彧闇瑕佸嚑縐?閽熴?br />
鍙錛屽浜庡緟鏈虹姸鎬侊紝瀹屽叏鍙互涓嶇敤鍏抽棴鑷繁鐨勭▼搴忥紝濡傛灉闇瑕侊紝闅忔椂鍙互寰呮満銆傝岃鎭㈠鏃朵篃鍙渶瑕佹寜涓嬬數婧愭寜閽紝鍑犵閽熷嵆鍙仮澶嶃備絾榪?縐嶆ā寮忚櫧鐒舵柟渚匡紝浣嗘湁涓涓嚧鍛界殑緙洪櫡錛氫笉鑳藉仠姝㈠鍐呭瓨鐨勪緵鐢點傚洜涓哄唴瀛樻槸涓縐嶆槗澶辨у瓨鍌ㄨ澶囷紝蹇呴』鍦ㄤ繚璇佷緵鐢電殑鎯呭喌涓嬫墠鑳界淮鎸佸叾涓殑鏁版嵁銆傚洜姝や竴鏃︾數鑴戝湪 寰呮満鐘舵佷笅鏂數錛屽摢鎬曚笉鍒頒竴縐掗挓錛屽唴瀛樹腑鐨勬暟鎹皢涓㈠け錛屼笅嬈″紑鏈虹殑鏃跺欙紝Windows浼氬儚浠庡叧鏈虹姸鎬佷笅鍚姩閭f牱閲嶆柊寮濮嬨?br />
浼戠湢妯″紡鍜屽緟 鏈烘ā寮忕被浼鹼紝鍙笉榪囧湪浼戠湢鐘舵佷笅錛學indows浼氬皢鍐呭瓨涓殑鏁版嵁淇濆瓨鍒扮‖鐩樹笂緋葷粺鐩樻牴鐩綍涓嬬殑涓涓枃浠朵腑錛堝彲浠ュ皢榪欎釜鏂囦歡鐞嗚В涓哄唴瀛樼姸鎬佺殑“闀滃儚”錛夈?鑰屼笅嬈″紑鏈哄悗鍒欎粠鍐呭瓨涓婄殑浼戠湢鏂囦歡鍐呰鍙栨暟鎹紝騫惰澆鍏ョ墿鐞嗗唴瀛樸備紤鐪犳ā寮忓彲浠ュ疄鐜板拰寰呮満妯″紡綾諱技鐨勫姛鑳斤紝鍙笉榪囨仮澶嶉熷害紼嶆參錛岃屼笖闇瑕佸湪紜洏涓婂崰鎹竴鍧楀拰 鐗╃悊鍐呭瓨涓鏍峰ぇ鐨勭┖闂存潵淇濆瓨浼戠湢鏂囦歡銆傜墿鐞嗗唴瀛樿秺澶氾紝鍗犵敤鐨勭┖闂村氨瓚婂錛岃岃繘鍏ョ姸鎬佸拰浠庣姸鎬佹仮澶嶆墍闇鐨勬椂闂翠篃灝辮秺闀匡紙姣曠珶闇瑕佹妸鏂囦歡浠庣‖鐩樿鍏ュ唴瀛橈紝鑰岀‖ 鐩樼殑閫熷害涓鐩撮兘鏄渶鎱㈢殑錛夈備絾榪欑妯″紡鐨勪紭鐐逛篃鏈夊緢澶氾紝涓嶆曟柇鐢碉紒姣曠珶鏂數鍚庣‖鐩樹笂鐨勬暟鎹茍涓嶄細涓㈠け銆?br />
Windows Vista涓紑濮嬫柊澧炰簡鐨勪竴縐嶇潯鐪犳ā寮忓垯緇撳悎浜嗗緟鏈哄拰浼戠湢妯″紡鐨勬墍鏈変紭鐐廣傚湪榪涘叆鐫$湢妯″紡鍚庯紝Windows浼氶鍏堝皢鍐呭瓨涓殑鏁版嵁淇濆瓨鍒扮‖鐩樹笂錛堣繖涓鐐圭被 浼間紤鐪狅級錛屽悓鏃跺垏鏂櫎浜嗗唴瀛樺鍏朵粬璁懼鐨勪緵鐢碉紙榪欎竴鐐圭被浼煎緟鏈猴級銆傚湪鎭㈠鏃訛紝濡傛灉娌℃湁鏂繃鐢碉紝閭d箞緋葷粺浼氫粠鍐呭瓨涓洿鎺ユ仮澶嶏紝鍙渶瑕佸嚑縐掗挓錛涜屽氨綆楁柇鐢碉紝鍥?涓虹‖鐩樹腑榪樹繚瀛樻湁鍐呭瓨鐨勭姸鎬侀暅鍍忥紝鍥犳榪樺彲浠ヤ粠紜洏涓婃仮澶嶏紝铏界劧閫熷害瑕佺◢寰參涓浜涳紝浣嗚嚦灝戜笉鐢ㄦ媴蹇冩暟鎹涪澶便?/p>
| 榪涘叆閫熷害 | 鎭㈠閫熷害 | 鏄惁鑰楃數 | 鏂數鍚庣粨鏋?/span> | |
|---|---|---|---|---|
| 鐫$湢 | 鍑犵閽?/span> | 涓嶆柇鐢電殑鎯呭喌涓嬪嚑縐掗挓 | 闇瑕佸鍐呭瓨榪涜灝戦噺渚涚數 | 鏂數鍚庯紝鏈繚瀛樻暟鎹笉鍙楁崯錛屼絾鎭㈠閫熷害闇瑕佺暐寰歡闀夸簺 |
| 浼戠湢 | 涓ゅ垎閽熷乏鍙?/span> | 涓ゅ垎閽熷乏鍙?/span> | 瀹屽叏涓嶈楃數 | 鏈繚瀛樻暟鎹笉浼氫涪澶?/span> |
| 寰呮満 | 鍑犵閽?/span> | 鍑犵閽?/span> | 闇瑕佸鍐呭瓨榪涜灝戦噺渚涚數 | 鏂數鍚庢墍鏈夋湭淇濆瓨鏁版嵁閮戒細涓㈠け |
緇間笂鎵榪幫紝榪欏嚑縐嶆ā寮忓悇鏈夊埄寮婏紝浣嗗彧瑕乄indows鍜屾墍鐢ㄧ‖浠舵敮鎸侊紝鍒?span style="background-color: yellow; ">寮虹儓寤鴻浣跨敤鐫$湢鍔熻兘浠f浛浠ュ線涔犳儻鐨勫叧鏈烘搷浣?/span>銆傛瘯绔熺潯鐪犲姛鑳界殑浼樺娍鏄捐屾槗瑙侊紝涓嶄粎鍙互閬垮厤婕暱鐨勫惎鍔ㄨ繃紼嬶紝鑰屼笖瀹屽叏鍙互鎶婄數鑴戝綋浣滅數瑙嗕竴鏍風殑涓鑸數鍣紝闅忓紑闅忓叧錛屽畬鍏ㄤ笉鐢ㄦ媴蹇冧涪澶辨暟鎹?/p>
WINDOWS瀹屾垚绔彛緙栫▼
鎽樿錛氬紑鍙戠綉緇滅▼搴忎粠鏉ラ兘涓嶆槸涓浠跺鏄撶殑浜嬫儏錛屽敖綆″彧闇瑕侀伒瀹堝緢灝戠殑涓浜涜鍒?鍒涘緩socket,鍙戣搗榪炴帴錛屾帴鍙楄繛鎺ワ紝鍙戦佸拰鎺ュ彈鏁版嵁銆傜湡姝g殑鍥伴毦鍦ㄤ簬錛氳浣犵殑紼嬪簭鍙互閫傚簲浠庡崟鍗曚竴涓繛鎺ュ埌鍑犲崈涓繛鎺ヤ箖鑷充簬涓婁竾涓繛鎺ャ傚埄鐢╓indows騫沖彴瀹屾垚绔彛榪涜閲嶅彔I/O鐨勬妧鏈拰Linux鍦?.6鐗堟湰鐨勫唴鏍鎬腑寮曞叆鐨?strong>EPOll鎶鏈紝鍙互寰堟柟渚垮湪鍦ㄥ湪Windows鍜孡inux騫沖彴涓婂紑鍙戝嚭鏀寔澶ч噺榪炴帴鐨勭綉緇滄湇鍔$▼搴忋傛湰鏂囦粙緇嶅湪Windows鍜孡inux騫沖彴涓婁嬌鐢ㄧ殑瀹屾垚绔彛鍜?strong>EPoll妯″瀷寮鍙戠殑鍩烘湰鍘熺悊錛屽悓鏃剁粰鍑哄疄闄呯殑渚嬪瓙銆傛湰鏂囦富瑕佸叧娉–/S緇撴瀯鐨勬湇鍔″櫒绔▼搴忥紝鍥犱負涓鑸潵璇達紝寮鍙戜竴涓ぇ瀹歸噺錛屽叿鍙墿灞曟х殑winsock紼嬪簭涓鑸氨鏄寚鏈嶅姟紼嬪簭銆?br />
1銆佸熀鏈蹇?br />
璁懼---windows鎿嶄綔緋葷粺涓婂厑璁擱氫俊鐨勪換浣曚笢瑗匡紝姣斿鏂囦歡銆佺洰褰曘佷覆琛屽彛銆佸茍琛屽彛銆侀偖浠舵Ы銆佸懡鍚嶇閬撱佹棤鍚嶇閬撱佸鎺ュ瓧銆佹帶鍒跺彴銆侀昏緫紓佺洏銆佺墿鐞嗙鐩樼瓑銆傜粷澶у鏁頒笌璁懼鎵撲氦閬撶殑鍑芥暟閮芥槸CreateFile/ReadFile/WriteFile絳夈傛墍浠ユ垜浠笉鑳界湅鍒?*File鍑芥暟灝卞彧鎯沖埌鏂囦歡璁懼銆備笌璁懼閫氫俊鏈変袱縐嶆柟寮忥紝鍚屾鏂瑰紡鍜屽紓姝ユ柟寮忋傚悓姝ユ柟寮忎笅錛屽綋璋冪敤ReadFile鍑芥暟鏃訛紝鍑芥暟浼氱瓑寰呯郴緇熸墽琛屽畬鎵瑕佹眰鐨勫伐浣滐紝鐒跺悗鎵嶈繑鍥烇紱寮傛鏂瑰紡涓嬶紝ReadFile榪欑被鍑芥暟浼氱洿鎺ヨ繑鍥烇紝緋葷粺鑷繁鍘誨畬鎴愬璁懼鐨勬搷浣滐紝鐒跺悗浠ユ煇縐嶆柟寮忛氱煡瀹屾垚鎿嶄綔銆?br />
閲嶅彔I/O----欏懼悕鎬濅箟錛屽綋浣犺皟鐢ㄤ簡鏌愪釜鍑芥暟錛堟瘮濡俁eadFile錛夊氨绔嬪埢榪斿洖鍋氳嚜宸辯殑鍏朵粬鍔ㄤ綔鐨勬椂鍊欙紝鍚屾椂緋葷粺涔熷湪瀵笽/0璁懼榪涜浣犺姹傜殑鎿嶄綔錛屽湪榪欐鏃墮棿鍐呬綘鐨勭▼搴忓拰緋葷粺鐨勫唴閮ㄥ姩浣滄槸閲嶅彔鐨勶紝鍥犳鏈夋洿濂界殑鎬ц兘銆傛墍浠ワ紝閲嶅彔I/O鏄敤浜庡紓姝ユ柟寮忎笅浣跨敤I/O璁懼鐨勩?閲嶅彔I/O闇瑕佷嬌鐢ㄧ殑涓涓潪甯擱噸瑕佺殑鏁版嵁緇撴瀯OVERLAPPED銆?br />
2銆乄INDOWS瀹屾垚绔彛鐨勭壒鐐?br />
Win32閲嶅彔I/O(Overlapped I/O)鏈哄埗鍏佽鍙戣搗涓涓搷浣滐紝鐒跺悗鍦ㄦ搷浣滃畬鎴愪箣鍚庢帴鍙楀埌淇℃伅銆傚浜庨偅縐嶉渶瑕佸緢闀挎椂闂存墠鑳藉畬鎴愮殑鎿嶄綔鏉ヨ錛岄噸鍙營O鏈哄埗灝ゅ叾鏈夌敤錛屽洜涓哄彂璧烽噸鍙犳搷浣滅殑綰跨▼鍦ㄩ噸鍙犺姹傚彂鍑哄悗灝卞彲浠ヨ嚜鐢辯殑鍋氬埆鐨勪簨鎯呬簡銆傚湪WinNT鍜學in2000涓婏紝鎻愪緵鐨勭湡姝g殑鍙墿灞曠殑I/O妯″瀷灝辨槸浣跨敤瀹屾垚绔彛錛圕ompletion Port錛夌殑閲嶅彔I/O.瀹屾垚绔彛---鏄竴縐峎INDOWS鍐呮牳瀵硅薄銆?strong>瀹屾垚绔彛鐢ㄤ簬寮傛鏂瑰紡鐨勯噸鍙營/0鎯呭喌涓嬶紝褰撶劧閲嶅彔I/O涓嶄竴瀹氶潪浣跨敤瀹屾垚绔彛涓嶅彲錛岃繕鏈夎澶囧唴鏍稿璞°佷簨浠跺璞°佸憡璀/0絳夈備絾鏄?strong>瀹屾垚绔彛鍐呴儴鎻愪緵浜嗙嚎紼嬫睜鐨勭鐞嗭紝鍙互閬垮厤鍙嶅鍒涘緩綰跨▼鐨勫紑閿錛屽悓鏃跺彲浠ユ牴鎹瓹PU鐨勪釜鏁扮伒媧葷殑鍐沖畾綰跨▼涓暟錛岃屼笖鍙互璁╁噺灝戠嚎紼嬭皟搴︾殑嬈℃暟浠庤屾彁楂樻ц兘鍏跺疄綾諱技浜嶹SAAsyncSelect鍜宻elect鍑芥暟鐨勬満鍒舵洿瀹規槗鍏煎Unix錛屼絾鏄毦浠ュ疄鐜版垜浠兂瑕佺殑“鎵╁睍鎬?#8221;銆傝屼笖windows鐨?strong>瀹屾垚绔彛鏈哄埗鍦ㄦ搷浣滅郴緇熷唴閮ㄥ凡緇忎綔浜嗕紭鍖栵紝鎻愪緵浜嗘洿楂樼殑鏁堢巼銆傛墍浠ワ紝鎴戜滑閫夋嫨瀹屾垚绔彛寮濮嬫垜浠殑鏈嶅姟鍣ㄧ▼搴忕殑寮鍙戙?br />
1銆佸彂璧鋒搷浣滀笉涓瀹氬畬鎴愶紝緋葷粺浼氬湪瀹屾垚鐨勬椂鍊欓氱煡浣狅紝閫氳繃鐢ㄦ埛鍦?strong>瀹屾垚绔彛涓婄殑絳夊緟錛屽鐞嗘搷浣滅殑緇撴灉銆傛墍浠ヨ鏈夋鏌?strong>瀹屾垚绔彛錛屽彇鎿嶄綔緇撴灉鐨勭嚎紼嬨傚湪瀹屾垚绔彛涓婂畧鍊欑殑綰跨▼緋葷粺鏈変紭鍖栵紝闄ら潪鍦ㄦ墽琛岀殑綰跨▼闃誨錛屼笉浼氭湁鏂扮殑綰跨▼琚縺媧伙紝浠ユ鏉ュ噺灝戠嚎紼嬪垏鎹㈤犳垚鐨勬ц兘浠d環銆傛墍浠ュ鏋滅▼搴忎腑娌℃湁澶鐨勯樆濉炴搷浣滐紝娌℃湁蹇呰鍚姩澶鐨勭嚎紼嬶紝CPU鏁伴噺鐨勪袱鍊嶏紝涓鑸繖鏍鋒潵鍚姩綰跨▼銆?br />
2銆佹搷浣滀笌鐩稿叧鏁版嵁鐨勭粦瀹氭柟寮忥細鍦ㄦ彁浜ゆ暟鎹殑鏃跺欑敤鎴峰鏁版嵁鎵撶浉搴旂殑鏍囪錛岃褰曟搷浣滅殑綾誨瀷錛屽湪鐢ㄦ埛澶勭悊鎿嶄綔緇撴灉鐨勬椂鍊欙紝閫氳繃媯鏌ヨ嚜宸辨墦鐨勬爣璁板拰緋葷粺鐨勬搷浣滅粨鏋滆繘琛岀浉搴旂殑澶勭悊銆?nbsp;
3銆佹搷浣滆繑鍥炵殑鏂瑰紡:涓鑸搷浣滃畬鎴愬悗瑕侀氱煡紼嬪簭榪涜鍚庣畫澶勭悊銆備絾鍐欐搷浣滃彲浠ヤ笉閫氱煡鐢ㄦ埛錛屾鏃跺鏋滅敤鎴峰啓鎿嶄綔涓嶈兘椹笂瀹屾垚錛屽啓鎿嶄綔鐨勭浉鍏蟲暟鎹細琚殏瀛樺埌鍒伴潪浜ゆ崲緙撳啿鍖轟腑錛屽湪鎿嶄綔瀹屾垚鐨勬椂鍊欙紝緋葷粺浼氳嚜鍔ㄩ噴鏀劇紦鍐插尯銆傛鏃跺彂璧峰畬鍐欐搷浣滐紝浣跨敤鐨勫唴瀛樺氨鍙互閲婃斁浜嗐傛鏃跺鏋滃崰鐢ㄩ潪浜ゆ崲緙撳啿澶浼氫嬌緋葷粺鍋滄鍝嶅簲銆?br />
3銆?strong>瀹屾垚绔彛錛圕ompletion Ports 錛夌浉鍏蟲暟鎹粨鏋勫拰鍒涘緩
鍏跺疄鍙互鎶?strong>瀹屾垚绔彛鐪嬫垚緋葷粺緇存姢鐨勪竴涓槦鍒楋紝鎿嶄綔緋葷粺鎶婇噸鍙營O鎿嶄綔瀹屾垚鐨勪簨浠墮氱煡鏀懼埌璇ラ槦鍒楅噷錛岀敱浜庢槸鏆撮湶 “鎿嶄綔瀹屾垚”鐨勪簨浠墮氱煡錛屾墍浠ュ懡鍚嶄負“瀹屾垚绔彛”錛圕Ompletion Ports錛夈備竴涓猻ocket琚垱寤哄悗錛屽彲浠ュ湪浠諱綍鏃跺埢鍜屼竴涓?strong>瀹屾垚绔彛鑱旂郴璧鋒潵銆?br />
瀹屾垚绔彛鐩稿叧鏈閲嶈鐨勬槸OVERLAPPED鏁版嵁緇撴瀯
typedef struct _OVERLAPPED {
ULONG_PTR Internal;//琚郴緇熷唴閮ㄨ祴鍊鹼紝鐢ㄦ潵琛ㄧず緋葷粺鐘舵?nbsp;
ULONG_PTR InternalHigh;// 琚郴緇熷唴閮ㄨ祴鍊鹼紝浼犺緭鐨勫瓧鑺傛暟
union {
struct {
DWORD Offset;//鍜孫ffsetHigh鍚堟垚涓涓?4浣嶇殑鏁存暟錛岀敤鏉ヨ〃紺轟粠鏂囦歡澶撮儴鐨勫灝戝瓧鑺傚紑濮?nbsp;
DWORD OffsetHigh;//鎿嶄綔錛屽鏋滀笉鏄鏂囦歡I/O鏉ユ搷浣滐紝鍒欏繀欏昏瀹氫負0
};
PVOID Pointer;
};
HANDLE hEvent;//濡傛灉涓嶄嬌鐢紝灝卞姟蹇呰涓?,鍚﹀垯璇瘋祴涓涓湁鏁堢殑Event鍙ユ焺
} OVERLAPPED, *LPOVERLAPPED;
涓嬮潰鏄紓姝ユ柟寮忎嬌鐢≧eadFile鐨勪竴涓緥瀛?nbsp;
OVERLAPPED Overlapped;
Overlapped.Offset=345;
Overlapped.OffsetHigh=0;
Overlapped.hEvent=0;
//鍋囧畾鍏朵粬鍙傛暟閮藉凡緇忚鍒濆鍖?nbsp;
ReadFile(hFile,buffer,sizeof(buffer),&dwNumBytesRead,&Overlapped);
榪欐牱灝卞畬鎴愪簡寮傛鏂瑰紡璇繪枃浠剁殑鎿嶄綔錛岀劧鍚嶳eadFile鍑芥暟榪斿洖錛岀敱鎿嶄綔緋葷粺鍋氳嚜宸辯殑浜嬫儏錛屼笅闈粙緇嶅嚑涓笌OVERLAPPED緇撴瀯鐩稿叧鐨勫嚱鏁?nbsp;
絳夊緟閲嶅彔I/0鎿嶄綔瀹屾垚鐨勫嚱鏁?nbsp;
BOOL GetOverlappedResult (
HANDLE hFile,
LPOVERLAPPED lpOverlapped,//鎺ュ彈榪斿洖鐨勯噸鍙營/0緇撴瀯
LPDWORD lpcbTransfer,//鎴愬姛浼犺緭浜嗗灝戝瓧鑺傛暟
BOOL fWait //TRUE鍙湁褰撴搷浣滃畬鎴愭墠榪斿洖錛孎ALSE鐩存帴榪斿洖錛屽鏋滄搷浣滄病鏈夊畬鎴愶紝閫氳繃璋?/鐢℅etLastError ( )鍑芥暟浼氳繑鍥濫RROR_IO_INCOMPLETE
);
瀹廐asOverlappedIoCompleted鍙互甯姪鎴戜滑嫻嬭瘯閲嶅彔I/0鎿嶄綔鏄惁瀹屾垚錛岃瀹忓OVERLAPPED緇撴瀯鐨処nternal鎴愬憳榪涜浜嗘祴璇曪紝鏌ョ湅鏄惁絳変簬STATUS_PENDING鍊箋?/p>
涓鑸潵璇達紝涓涓簲鐢ㄧ▼搴忓彲浠ュ垱寤哄涓伐浣滅嚎紼嬫潵澶勭悊瀹屾垚绔彛涓婄殑閫氱煡浜嬩歡銆傚伐浣滅嚎紼嬬殑鏁伴噺渚濊禆浜庣▼搴忕殑鍏蜂綋闇瑕併備絾鏄湪鐞嗘兂鐨勬儏鍐典笅錛屽簲璇ュ搴斾竴涓狢PU鍒涘緩涓涓嚎紼嬨傚洜涓哄湪瀹屾垚绔彛鐞嗘兂妯″瀷涓紝姣忎釜綰跨▼閮藉彲浠ヤ粠緋葷粺鑾峰緱涓涓?#8220;鍘熷瓙”鎬х殑鏃墮棿鐗囷紝杞暘榪愯騫舵鏌?strong>瀹屾垚绔彛錛岀嚎紼嬬殑鍒囨崲鏄澶栫殑寮閿銆傚湪瀹為檯寮鍙戠殑鏃跺欙紝榪樿鑰冭檻榪欎簺綰跨▼鏄惁鐗墊秹鍒板叾浠栧牭濉炴搷浣滅殑鎯呭喌銆傚鏋滄煇綰跨▼榪涜鍫靛鎿嶄綔錛岀郴緇熷垯灝嗗叾鎸傝搗錛岃鍒殑綰跨▼鑾峰緱榪愯鏃墮棿銆傚洜姝わ紝濡傛灉鏈夎繖鏍風殑鎯呭喌錛屽彲浠ュ鍒涘緩鍑犱釜綰跨▼鏉ュ敖閲忓埄鐢ㄦ椂闂淬?br />
搴旂敤瀹屾垚绔彛錛?br />
鍒涘緩瀹屾垚绔彛錛?strong>瀹屾垚绔彛鏄竴涓唴鏍稿璞★紝浣跨敤鏃朵粬鎬繪槸瑕佸拰鑷沖皯涓涓湁鏁堢殑璁懼鍙ユ焺榪涜鍏寵仈錛?strong>瀹屾垚绔彛鏄竴涓鏉傜殑鍐呮牳瀵硅薄錛屽垱寤哄畠鐨勫嚱鏁版槸錛?br />
HANDLE CreateIoCompletionPort(
IN HANDLE FileHandle,
IN HANDLE ExistingCompletionPort,
IN ULONG_PTR CompletionKey,
IN DWORD NumberOfConcurrentThreads
);
閫氬父鍒涘緩宸ヤ綔鍒嗕袱姝ワ細
絎竴姝ワ紝鍒涘緩涓涓柊鐨?strong>瀹屾垚绔彛鍐呮牳瀵硅薄錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍑芥暟錛?br />
HANDLE CreateNewCompletionPort(DWORD dwNumberOfThreads)
{
return CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,dwNumberOfThreads);
};
絎簩姝ワ紝灝嗗垰鍒涘緩鐨?strong>瀹屾垚绔彛鍜屼竴涓湁鏁堢殑璁懼鍙ユ焺鍏寵仈璧鋒潵錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍑芥暟錛?br />
bool AssicoateDeviceWithCompletionPort(HANDLE hCompPort,HANDLE hDevice,DWORD dwCompKey)
{
HANDLE h=CreateIoCompletionPort(hDevice,hCompPort,dwCompKey,0);
return h==hCompPort;
};
璇存槑
1錛?CreateIoCompletionPort鍑芥暟涔熷彲浠ヤ竴嬈℃х殑鏃㈠垱寤?strong>瀹屾垚绔彛瀵硅薄錛屽張鍏寵仈鍒頒竴涓湁鏁堢殑璁懼鍙ユ焺
2錛?CompletionKey鏄竴涓彲浠ヨ嚜宸卞畾涔夌殑鍙傛暟錛屾垜浠彲浠ユ妸涓涓粨鏋勭殑鍦板潃璧嬬粰瀹冿紝鐒跺悗鍦ㄥ悎閫傜殑鏃跺欏彇鍑烘潵浣跨敤錛屾渶濂借淇濊瘉緇撴瀯閲岄潰鐨勫唴瀛樹笉鏄垎閰嶅湪鏍堜笂錛岄櫎闈炰綘鏈夊崄鍒嗙殑鎶婃彙鍐呭瓨浼氫繚鐣欏埌浣犺浣跨敤鐨勯偅涓鍒匯?br />
3錛?NumberOfConcurrentThreads閫氬父鐢ㄦ潵鎸囧畾瑕佸厑璁稿悓鏃惰繍琛岀殑鐨勭嚎紼嬬殑鏈澶т釜鏁般傞氬父鎴戜滑鎸囧畾涓?錛岃繖鏍風郴緇熶細鏍規嵁CPU鐨勪釜鏁版潵鑷姩紜畾銆傚垱寤哄拰鍏寵仈鐨勫姩浣滃畬鎴愬悗錛岀郴緇熶細灝?strong>瀹屾垚绔彛鍏寵仈鐨勮澶囧彞鏌勩佸畬鎴愰敭浣滀負涓鏉$邯褰曞姞鍏ュ埌榪欎釜瀹屾垚绔彛鐨勮澶囧垪琛ㄤ腑銆傚鏋滀綘鏈夊涓?strong>瀹屾垚绔彛錛屽氨浼氭湁澶氫釜瀵瑰簲鐨勮澶囧垪琛ㄣ傚鏋滆澶囧彞鏌勮鍏抽棴錛屽垯琛ㄤ腑鑷姩鍒犻櫎璇ョ邯褰曘?br />
4銆?strong>瀹屾垚绔彛綰跨▼鐨勫伐浣滃師鐞?/strong>
瀹屾垚绔彛鍙互甯姪鎴戜滑綆$悊綰跨▼姹狅紝浣嗘槸綰跨▼姹犱腑鐨勭嚎紼嬮渶瑕佹垜浠嬌鐢╛beginthreadex鏉ュ垱寤猴紝鍑粈涔堥氱煡瀹屾垚绔彛綆$悊鎴戜滑鐨勬柊綰跨▼鍛紵絳旀鍦ㄥ嚱鏁癎etQueuedCompletionStatus銆傝鍑芥暟鍘熷瀷錛?nbsp;
BOOL GetQueuedCompletionStatus(
IN HANDLE CompletionPort,
OUT LPDWORD lpNumberOfBytesTransferred,
OUT PULONG_PTR lpCompletionKey,
OUT LPOVERLAPPED *lpOverlapped,
IN DWORD dwMilliseconds
);
榪欎釜鍑芥暟璇曞浘浠庢寚瀹氱殑瀹屾垚绔彛鐨処/0瀹屾垚闃熷垪涓娊鍙栫邯褰曘傚彧鏈夊綋閲嶅彔I/O鍔ㄤ綔瀹屾垚鐨勬椂鍊欙紝瀹屾垚闃熷垪涓墠鏈夌邯褰曘傚嚒鏄皟鐢ㄨ繖涓嚱鏁扮殑綰跨▼灝嗚鏀懼叆鍒?strong>瀹屾垚绔彛鐨勭瓑寰呯嚎紼嬮槦鍒椾腑錛屽洜姝?strong>瀹屾垚绔彛灝卞彲浠ュ湪鑷繁鐨勭嚎紼嬫睜涓府鍔╂垜浠淮鎶よ繖涓嚎紼嬨?strong>瀹屾垚绔彛鐨処/0瀹屾垚闃熷垪涓瓨鏀句簡褰撻噸鍙營/0瀹屾垚鐨勭粨鏋?--- 涓鏉$邯褰曪紝璇ョ邯褰曟嫢鏈夊洓涓瓧孌碉紝鍓嶄笁欏瑰氨瀵瑰簲GetQueuedCompletionStatus鍑芥暟鐨?銆?銆?鍙傛暟錛屾渶鍚庝竴涓瓧孌墊槸閿欒淇℃伅dwError銆傛垜浠篃鍙互閫氳繃璋冪敤PostQueudCompletionStatus妯℃嫙瀹屾垚浜嗕竴涓噸鍙營/0鎿嶄綔銆?nbsp;
褰揑/0瀹屾垚闃熷垪涓嚭鐜頒簡綰綍錛?strong>瀹屾垚绔彛灝嗕細媯鏌ョ瓑寰呯嚎紼嬮槦鍒楋紝璇ラ槦鍒椾腑鐨勭嚎紼嬮兘鏄氳繃璋冪敤GetQueuedCompletionStatus鍑芥暟浣胯嚜宸卞姞鍏ラ槦鍒楃殑銆傜瓑寰呯嚎紼嬮槦鍒楀緢綆鍗曪紝鍙槸淇濆瓨浜嗚繖浜涚嚎紼嬬殑ID銆?strong>瀹屾垚绔彛浼氭寜鐓у悗榪涘厛鍑虹殑鍘熷垯灝嗕竴涓嚎紼嬮槦鍒楃殑ID鏀懼叆鍒伴噴鏀劇嚎紼嬪垪琛ㄤ腑錛屽悓鏃惰綰跨▼灝嗕粠絳夊緟GetQueuedCompletionStatus鍑芥暟榪斿洖鐨勭潯鐪犵姸鎬佷腑鍙樹負鍙皟搴︾姸鎬佺瓑寰匔PU鐨勮皟搴︺傛墍浠ユ垜浠殑綰跨▼瑕佹兂鎴愪負瀹屾垚绔彛綆$悊鐨勭嚎紼嬶紝灝卞繀欏昏璋冪敤GetQueuedCompletionStatus鍑芥暟銆傚嚭浜庢ц兘鐨勪紭鍖栵紝瀹為檯涓?strong>瀹屾垚绔彛榪樼淮鎶や簡涓涓殏鍋滅嚎紼嬪垪琛紝鍏蜂綋緇嗚妭鍙互鍙傝冦奧indows楂樼駭緙栫▼鎸囧崡銆嬶紝鎴戜滑鐜板湪鐭ラ亾鐨勭煡璇嗭紝宸茬粡瓚沖浜嗐?nbsp;瀹屾垚绔彛綰跨▼闂存暟鎹紶閫掔嚎紼嬮棿浼犻掓暟鎹渶甯哥敤鐨勫姙娉曟槸鍦╛beginthreadex鍑芥暟涓皢鍙傛暟浼犻掔粰綰跨▼鍑芥暟錛屾垨鑰呬嬌鐢ㄥ叏灞鍙橀噺銆備絾鏄?strong>瀹屾垚绔彛榪樻湁鑷繁鐨勪紶閫掓暟鎹殑鏂規硶錛岀瓟妗堝氨鍦ㄤ簬CompletionKey鍜孫VERLAPPED鍙傛暟銆?br />
CompletionKey琚繚瀛樺湪瀹屾垚绔彛鐨勮澶囪〃涓紝鏄拰璁懼鍙ユ焺涓涓瀵瑰簲鐨勶紝鎴戜滑鍙互灝嗕笌璁懼鍙ユ焺鐩稿叧鐨勬暟鎹繚瀛樺埌CompletionKey涓紝鎴栬呭皢CompletionKey琛ㄧず涓虹粨鏋勬寚閽堬紝榪欐牱灝卞彲浠ヤ紶閫掓洿鍔犱赴瀵岀殑鍐呭銆傝繖浜涘唴瀹瑰彧鑳藉湪涓寮濮嬪叧鑱?strong>瀹屾垚绔彛鍜岃澶囧彞鏌勭殑鏃跺欏仛錛屽洜姝や笉鑳藉湪浠ュ悗鍔ㄦ佹敼鍙樸?br />
OVERLAPPED鍙傛暟鏄湪姣忔璋冪敤ReadFile榪欐牱鐨勬敮鎸侀噸鍙營/0鐨勫嚱鏁版椂浼犻掔粰瀹屾垚绔彛鐨勩傛垜浠彲浠ョ湅鍒幫紝濡傛灉鎴戜滑涓嶆槸瀵規枃浠惰澶囧仛鎿嶄綔錛岃緇撴瀯鐨勬垚鍛樺彉閲忓氨瀵規垜浠嚑涔庢鏃犱綔鐢ㄣ傛垜浠渶瑕侀檮鍔犱俊鎭紝鍙互鍒涘緩鑷繁鐨勭粨鏋勶紝鐒跺悗灝哋VERLAPPED緇撴瀯鍙橀噺浣滀負鎴戜滑緇撴瀯鍙橀噺鐨勭涓涓垚鍛橈紝鐒跺悗浼犻掔涓涓垚鍛樺彉閲忕殑鍦板潃緇橰eadFile鍑芥暟銆傚洜涓虹被鍨嬪尮閰嶏紝褰撶劧鍙互閫氳繃緙栬瘧銆傚綋GetQueuedCompletionStatus鍑芥暟榪斿洖鏃訛紝鎴戜滑鍙互鑾峰彇鍒扮涓涓垚鍛樺彉閲忕殑鍦板潃錛岀劧鍚庝竴涓畝鍗曠殑寮哄埗杞崲錛屾垜浠氨鍙互鎶婂畠褰撲綔瀹屾暣鐨勮嚜瀹氫箟緇撴瀯鐨勬寚閽堜嬌鐢紝榪欐牱灝卞彲浠ヤ紶閫掑緢澶氶檮鍔犵殑鏁版嵁浜嗐傚お濂戒簡錛佸彧鏈変竴鐐硅娉ㄦ剰錛屽鏋滆法綰跨▼浼犻掞紝璇鋒敞鎰忓皢鏁版嵁鍒嗛厤鍒板爢涓婏紝騫朵笖鎺ユ敹绔簲璇ュ皢鏁版嵁鐢ㄥ畬鍚庨噴鏀俱傛垜浠氬父闇瑕佸皢ReadFile榪欐牱鐨勫紓姝ュ嚱鏁扮殑鎵闇瑕佺殑緙撳啿鍖烘斁鍒版垜浠嚜瀹氫箟鐨勭粨鏋勪腑錛岃繖鏍峰綋GetQueuedCompletionStatus琚繑鍥炴椂錛屾垜浠殑鑷畾涔夌粨鏋勭殑緙撳啿鍖哄彉閲忎腑灝卞瓨鏀句簡I/0鎿嶄綔鐨勬暟鎹侰ompletionKey鍜孫VERLAPPED鍙傛暟錛岄兘鍙互閫氳繃GetQueuedCompletionStatus鍑芥暟鑾峰緱銆?br />
綰跨▼鐨勫畨鍏ㄩ鍑?br />
寰堝綰跨▼涓轟簡涓嶆涓嬈$殑鎵ц寮傛鏁版嵁澶勭悊錛岄渶瑕佷嬌鐢ㄥ涓嬭鍙?br />
while (true)
{
......
GetQueuedCompletionStatus(...);
......
}
閭d箞濡備綍閫鍑哄憿錛岀瓟妗堝氨鍦ㄤ簬涓婇潰鏇炬彁鍒扮殑PostQueudCompletionStatus鍑芥暟錛屾垜浠彲浠ョ敤瀹冨彂閫佷竴涓嚜瀹氫箟鐨勫寘鍚簡OVERLAPPED鎴愬憳鍙橀噺鐨勭粨鏋勫湴鍧錛岄噷闈㈠寘鍚竴涓姸鎬佸彉閲忥紝褰撶姸鎬佸彉閲忎負閫鍑烘爣蹇楁椂錛岀嚎紼嬪氨鎵ц娓呴櫎鍔ㄤ綔鐒跺悗閫鍑恒?br />
5銆乄indows瀹屾垚绔彛鐨勫疄渚嬩唬鐮侊細
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
ULONG_PTR *PerHandleKey;
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus,
*newolp;
DWORD dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
// Need a new OVERLAPPEDPLUS structure
// for the newly accepted socket. Perhaps
// keep a look aside list of free structures.
newolp = AllocateOverlappedPlus();
if (!newolp)
{
// Error
}
newolp->s = OverlapPlus->sclient;
newolp->OpCode = OP_READ;
// This function divpares the data to be sent
PrepareSendBuffer(&newolp->wbuf);
ret = WSASend(
newolp->s,
&newolp->wbuf,
1,
&newolp->dwBytes,
0,
&newolp.ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
// Put structure in look aside list for later use
FreeOverlappedPlus(OverlapPlus);
// Signal accept thread to issue another AcceptEx
SetEvent(hAcceptThread);
break;
case OP_READ:
// Process the data read
// Repost the read if necessary, reusing the same
// receive buffer as before
memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED));
ret = WSARecv(
OverlapPlus->s,
&OverlapPlus->wbuf,
1,
&OverlapPlus->dwBytes,
&OverlapPlus->dwFlags,
&OverlapPlus->ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
break;
case OP_WRITE:
// Process the data sent, etc.
break;
} // switch
} // while
} // WorkerThread
鏌ョ湅浠ヤ笂浠g爜錛屾敞鎰忓鏋淥verlapped鎿嶄綔绔嬪埢澶辮觸錛堟瘮濡傦紝榪斿洖SOCKET_ERROR鎴栧叾浠栭潪WSA_IO_PENDING鐨勯敊璇級錛屽垯娌℃湁浠諱綍瀹屾垚閫氱煡鏃墮棿浼氳鏀懼埌瀹屾垚绔彛闃熷垪閲屻傚弽涔嬶紝鍒欎竴瀹氭湁鐩稿簲鐨勯氱煡鏃墮棿琚斁鍒?strong>瀹屾垚绔彛闃熷垪銆傛洿瀹屽杽鐨勫叧浜嶹insock鐨?strong>瀹屾垚绔彛鏈哄埗錛屽彲浠ュ弬鑰僊SDN鐨凪icrosoft PlatFormSDK錛岄偅閲屾湁瀹屾垚绔彛鐨勪緥瀛愩傝闂?a >http://msdn.microsoft.com/library/techart/msdn_servrapp.htm鍙互鑾峰緱鏇村淇℃伅銆?/p>
Linux鐨?strong>EPoll妯″瀷
Linux 2.6鍐呮牳涓彁楂樼綉緇淚/O鎬ц兘鐨勬柊鏂規硶-epoll I/O澶氳礬澶嶇敤鎶鏈湪姣旇緝澶氱殑TCP緗戠粶鏈嶅姟鍣ㄤ腑鏈変嬌鐢紝鍗蟲瘮杈冨鐨勭敤鍒皊elect鍑芥暟銆?br />
1銆佷負浠涔坰elect钀藉悗
棣栧厛錛屽湪Linux鍐呮牳涓紝select鎵鐢ㄥ埌鐨凢D_SET鏄湁闄愮殑錛屽嵆鍐呮牳涓湁涓弬鏁癬_FD_SETSIZE瀹氫箟浜嗘瘡涓狥D_SET鐨勫彞鏌勪釜鏁幫紝鍦ㄦ垜鐢ㄧ殑2.6.15-25-386鍐呮牳涓紝璇ュ兼槸1024錛屾悳绱㈠唴鏍告簮浠g爜寰楀埌錛?br />
include/linux/posix_types.h:#define __FD_SETSIZE 1024
涔熷氨鏄錛屽鏋滄兂瑕佸悓鏃舵嫻?025涓彞鏌勭殑鍙鐘舵佹槸涓嶅彲鑳界敤select瀹炵幇鐨勩傛垨鑰呭悓鏃舵嫻?025涓彞鏌勭殑鍙啓鐘舵佷篃鏄笉鍙兘鐨勩傚叾嬈★紝鍐呮牳涓疄鐜皊elect鏄敤杞鏂規硶錛屽嵆姣忔媯嫻嬮兘浼氶亶鍘嗘墍鏈塅D_SET涓殑鍙ユ焺錛屾樉鐒訛紝select鍑芥暟鎵ц鏃墮棿涓嶧D_SET涓殑鍙ユ焺涓暟鏈変竴涓瘮渚嬪叧緋伙紝鍗硈elect瑕佹嫻嬬殑鍙ユ焺鏁拌秺澶氬氨浼氳秺璐規椂銆傚綋鐒訛紝鍦ㄥ墠鏂囦腑鎴戝茍娌℃湁鎻愬強poll鏂規硶錛屼簨瀹炰笂鐢╯elect鐨勬湅鍙嬩竴瀹氫篃璇曡繃poll錛屾垜涓漢瑙夊緱select鍜宲oll澶у悓灝忓紓錛屼釜浜哄亸濂戒簬鐢╯elect鑰屽凡銆?/p>
2銆佸唴鏍鎬腑鎻愰珮I/O鎬ц兘鐨勬柊鏂規硶epoll
epoll鏄粈涔堬紵鎸夌収man鎵嬪唽鐨勮娉曪細鏄負澶勭悊澶ф壒閲忓彞鏌勮屼綔浜嗘敼榪涚殑poll銆傝浣跨敤epoll鍙渶瑕佽繖涓変釜緋葷粺璋冪敤錛?strong>epoll_create(2)錛?nbsp;epoll_ctl(2)錛?nbsp;epoll_wait(2)銆?br />
褰撶劧錛岃繖涓嶆槸2.6鍐呮牳鎵嶆湁鐨勶紝瀹冩槸鍦?.5.44鍐呮牳涓寮曡繘鐨?epoll(4) is a new API introduced in Linux kernel 2.5.44)
Linux2.6鍐呮牳epoll浠嬬粛
鍏堜粙緇?鏈功銆奣he Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel銆嬶紝浠?.4鍐呮牳璁茶ВLinux TCP/IP瀹炵幇錛岀浉褰撲笉閿?浣滀負涓涓幇瀹炰笘鐣屼腑鐨勫疄鐜幫紝寰堝鏃跺欎綘蹇呴』浣滃緢澶氭潈琛★紝榪欐椂鍊欏弬鑰冧竴涓箙緇忚冮獙鐨勭郴緇熸洿鏈夊疄闄呮剰涔夈備婦涓緥瀛?linux鍐呮牳涓璼k_buff緇撴瀯涓轟簡榪芥眰閫熷害鍜屽畨鍏紝鐗虹壊浜嗛儴鍒嗗唴瀛橈紝鎵浠ュ湪鍙戦乀CP鍖呯殑鏃跺欙紝鏃犺搴旂敤灞傛暟鎹澶?sk_buff鏈灝忎篃鏈?72鐨勫瓧鑺?鍏跺疄瀵逛簬socket搴旂敤灞傜▼搴忔潵璇達紝鍙﹀涓鏈功銆奤NIX Network Programming Volume 1銆嬫剰涔夋洿澶т竴鐐?2003騫寸殑鏃跺欙紝榪欐湰涔﹀嚭浜嗘渶鏂扮殑絎?鐗堟湰錛屼笉榪囦富瑕佽繕鏄慨璁㈢2鐗堟湰銆傚叾涓6绔犮奍/O Multiplexing銆嬫槸鏈閲嶈鐨勩係tevens緇欏嚭浜嗙綉緇淚O鐨勫熀鏈ā鍨嬨傚湪榪欓噷鏈閲嶈鐨勮帿榪囦簬select妯″瀷鍜孉synchronous I/O妯″瀷.浠庣悊璁轟笂璇達紝AIO浼間箮鏄渶楂樻晥鐨勶紝浣犵殑IO鎿嶄綔鍙互绔嬪嵆榪斿洖錛岀劧鍚庣瓑寰卭s鍛婅瘔浣營O鎿嶄綔瀹屾垚銆備絾鏄竴鐩翠互鏉ワ紝濡備綍瀹炵幇灝辨病鏈変竴涓畬緹庣殑鏂規銆傛渶钁楀悕鐨剋indows瀹屾垚绔彛瀹炵幇鐨凙IO,瀹為檯涓婁篃鏄唴閮ㄧ敤綰跨▼姹犲疄鐜扮殑緗簡錛屾渶鍚庣殑緇撴灉鏄疘O鏈変釜綰跨▼姹狅紝浣犲簲鐢ㄤ篃闇瑕佷竴涓嚎紼嬫睜...... 寰堝鏂囨。鍏跺疄宸茬粡鎸囧嚭浜嗚繖甯︽潵鐨勭嚎紼媍ontext-switch甯︽潵鐨勪唬浠楓傚湪linux 騫沖彴涓婏紝鍏充簬緗戠粶AIO涓鐩存槸鏀瑰姩鏈澶氱殑鍦版柟錛?.4鐨勫勾浠e氨鏈夊緢澶欰IO鍐呮牳patch,鏈钁楀悕鐨勫簲璇ョ畻鏄疭GI閭d釜銆備絾鏄竴鐩村埌2.6鍐呮牳鍙戝竷錛岀綉緇滄ā鍧楃殑AIO涓鐩存病鏈夎繘鍏ョǔ瀹氬唴鏍哥増鏈?澶ч儴鍒嗛兘鏄嬌鐢ㄧ敤鎴風嚎紼嬫ā鎷熸柟娉曪紝鍦ㄤ嬌鐢ㄤ簡NPTL鐨刲inux涓婇潰鍏跺疄鍜寃indows鐨?strong>瀹屾垚绔彛鍩烘湰涓婂樊涓嶅浜?銆?.6鍐呮牳鎵鏀寔鐨凙IO鐗規寚紓佺洏鐨凙IO---鏀寔io_submit(),io_getevents()浠ュ強瀵笵irect IO鐨勬敮鎸?灝辨槸緇曡繃VFS緋葷粺buffer鐩存帴鍐欑‖鐩橈紝瀵逛簬嫻佹湇鍔″櫒鍦ㄥ唴瀛樺鉤紼蟲т笂鏈夌浉褰撳府鍔?銆?br />
鎵浠ワ紝鍓╀笅鐨剆elect妯″瀷鍩烘湰涓婂氨鏄垜浠湪linux涓婇潰鐨勫敮涓閫夋嫨錛屽叾瀹烇紝濡傛灉鍔犱笂no-block socket鐨勯厤緗紝鍙互瀹屾垚涓涓?浼?AIO鐨勫疄鐜幫紝鍙笉榪囨帹鍔ㄥ姏鍦ㄤ簬浣犺屼笉鏄痮s鑰屽凡銆備笉榪囦紶緇熺殑select/poll鍑芥暟鏈夌潃涓浜涙棤娉曞繊鍙楃殑緙虹偣錛屾墍浠ユ敼榪涗竴鐩存槸2.4-2.5寮鍙戠増鏈唴鏍哥殑浠誨姟錛屽寘鎷?dev/poll錛宺ealtime signal絳夌瓑銆傛渶緇堬紝Davide Libenzi寮鍙戠殑epoll榪涘叆2.6鍐呮牳鎴愪負姝e紡鐨勮В鍐蟲柟妗?br />
3銆?strong>epoll鐨勪紭鐐?/strong>
<1>鏀寔涓涓繘紼嬫墦寮澶ф暟鐩殑socket鎻忚堪絎?FD)
select 鏈涓嶈兘蹇嶅彈鐨勬槸涓涓繘紼嬫墍鎵撳紑鐨凢D鏄湁涓瀹氶檺鍒剁殑錛岀敱FD_SETSIZE璁劇疆錛岄粯璁ゅ兼槸2048銆傚浜庨偅浜涢渶瑕佹敮鎸佺殑涓婁竾榪炴帴鏁扮洰鐨処M鏈嶅姟鍣ㄦ潵璇存樉鐒跺お灝戜簡銆傝繖鏃跺欎綘涓鏄彲浠ラ夋嫨淇敼榪欎釜瀹忕劧鍚庨噸鏂扮紪璇戝唴鏍革紝涓嶈繃璧勬枡涔熷悓鏃舵寚鍑鴻繖鏍蜂細甯︽潵緗戠粶鏁堢巼鐨勪笅闄嶏紝浜屾槸鍙互閫夋嫨澶氳繘紼嬬殑瑙e喅鏂規(浼犵粺鐨凙pache鏂規)錛屼笉榪囪櫧鐒秎inux涓婇潰鍒涘緩榪涚▼鐨勪唬浠鋒瘮杈冨皬錛屼絾浠嶆棫鏄笉鍙拷瑙嗙殑錛屽姞涓婅繘紼嬮棿鏁版嵁鍚屾榪滄瘮涓嶄笂綰跨▼闂村悓姝ョ殑楂樻晥錛屾墍浠ヤ篃涓嶆槸涓縐嶅畬緹庣殑鏂規銆備笉榪?nbsp;epoll鍒欐病鏈夎繖涓檺鍒訛紝瀹冩墍鏀寔鐨凢D涓婇檺鏄渶澶у彲浠ユ墦寮鏂囦歡鐨勬暟鐩紝榪欎釜鏁板瓧涓鑸繙澶т簬2048,涓句釜渚嬪瓙,鍦?GB鍐呭瓨鐨勬満鍣ㄤ笂澶х害鏄?0涓囧乏鍙籌紝鍏蜂綋鏁扮洰鍙互cat /proc/sys/fs/file-max瀵熺湅,涓鑸潵璇磋繖涓暟鐩拰緋葷粺鍐呭瓨鍏崇郴寰堝ぇ銆?br />
<2>IO鏁堢巼涓嶉殢FD鏁扮洰澧炲姞鑰岀嚎鎬т笅闄?br />
浼犵粺鐨剆elect/poll鍙︿竴涓嚧鍛藉急鐐瑰氨鏄綋浣犳嫢鏈変竴涓緢澶х殑socket闆嗗悎錛屼笉榪囩敱浜庣綉緇滃歡鏃訛紝浠諱竴鏃墮棿鍙湁閮ㄥ垎鐨剆ocket鏄?媧昏穬"鐨勶紝浣嗘槸select/poll姣忔璋冪敤閮戒細綰挎ф壂鎻忓叏閮ㄧ殑闆嗗悎錛屽鑷存晥鐜囧憟鐜扮嚎鎬т笅闄嶃備絾鏄?strong>epoll涓嶅瓨鍦ㄨ繖涓棶棰橈紝瀹冨彧浼氬"媧昏穬"鐨剆ocket榪涜鎿嶄綔---榪欐槸鍥犱負鍦ㄥ唴鏍稿疄鐜頒腑epoll鏄牴鎹瘡涓猣d涓婇潰鐨刢allback鍑芥暟瀹炵幇鐨勩傞偅涔堬紝鍙湁"媧昏穬"鐨剆ocket鎵嶄細涓誨姩鐨勫幓璋冪敤 callback鍑芥暟錛屽叾浠杋dle鐘舵乻ocket鍒欎笉浼氾紝鍦ㄨ繖鐐逛笂錛?strong>epoll瀹炵幇浜嗕竴涓?浼?AIO錛屽洜涓鴻繖鏃跺欐帹鍔ㄥ姏鍦╫s鍐呮牳銆傚湪涓浜?benchmark涓紝濡傛灉鎵鏈夌殑socket鍩烘湰涓婇兘鏄椿璺冪殑---姣斿涓涓珮閫烲AN鐜錛?strong>epoll騫朵笉姣攕elect/poll鏈変粈涔堟晥鐜囷紝鐩稿弽錛屽鏋滆繃澶氫嬌鐢?strong>epoll_ctl,鏁堢巼鐩告瘮榪樻湁紼嶅井鐨勪笅闄嶃備絾鏄竴鏃︿嬌鐢╥dle connections妯℃嫙WAN鐜,epoll鐨勬晥鐜囧氨榪滃湪select/poll涔嬩笂浜嗐?br />
<3>浣跨敤mmap鍔犻熷唴鏍鎬笌鐢ㄦ埛絀洪棿鐨勬秷鎭紶閫掋?br />
榪欑偣瀹為檯涓婃秹鍙婂埌epoll鐨勫叿浣撳疄鐜頒簡銆傛棤璁烘槸select,poll榪樻槸epoll閮介渶瑕佸唴鏍告妸FD娑堟伅閫氱煡緇欑敤鎴風┖闂達紝濡備綍閬垮厤涓嶅繀瑕佺殑鍐呭瓨鎷瘋礉灝卞緢閲嶈錛屽湪榪欑偣涓婏紝epoll鏄氳繃鍐呮牳浜庣敤鎴風┖闂磎map鍚屼竴鍧楀唴瀛樺疄鐜扮殑銆傝屽鏋滀綘鎯蟲垜涓鏍蜂粠2.5鍐呮牳灝卞叧娉?strong>epoll鐨勮瘽錛屼竴瀹氫笉浼氬繕璁版墜宸?mmap榪欎竴姝ョ殑銆?br />
<4>鍐呮牳寰皟
榪欎竴鐐瑰叾瀹炰笉綆?strong>epoll鐨勪紭鐐逛簡錛岃屾槸鏁翠釜linux騫沖彴鐨勪紭鐐廣備篃璁鎬綘鍙互鎬鐤憀inux騫沖彴錛屼絾鏄綘鏃犳硶鍥為伩linux騫沖彴璧嬩簣浣犲井璋冨唴鏍哥殑鑳藉姏銆傛瘮濡傦紝鍐呮牳TCP/IP鍗忚鏍堜嬌鐢ㄥ唴瀛樻睜綆$悊sk_buff緇撴瀯錛岄偅涔堝彲浠ュ湪榪愯鏃舵湡鍔ㄦ佽皟鏁磋繖涓唴瀛榩ool(skb_head_pool)鐨勫ぇ灝?-- 閫氳繃echo XXXX>/proc/sys/net/core/hot_list_length瀹屾垚銆傚啀姣斿listen鍑芥暟鐨勭2涓弬鏁?TCP瀹屾垚3嬈℃彙鎵嬬殑鏁版嵁鍖呴槦鍒楅暱搴?錛屼篃鍙互鏍規嵁浣犲鉤鍙板唴瀛樺ぇ灝忓姩鎬佽皟鏁淬傛洿鐢氳嚦鍦ㄤ竴涓暟鎹寘闈㈡暟鐩法澶т絾鍚屾椂姣忎釜鏁版嵁鍖呮湰韜ぇ灝忓嵈寰堝皬鐨勭壒孌婄郴緇熶笂灝濊瘯鏈鏂扮殑NAPI緗戝崱椹卞姩鏋舵瀯銆?br />
4銆?strong>epoll鐨勫伐浣滄ā寮?br />
浠や漢楂樺叴鐨勬槸錛?.6鍐呮牳鐨?strong>epoll姣斿叾2.5寮鍙戠増鏈殑/dev/epoll綆媧佷簡璁稿錛屾墍浠ワ紝澶ч儴鍒嗘儏鍐典笅錛屽己澶х殑涓滆タ寰寰鏄畝鍗曠殑銆傚敮涓鏈夌偣楹葷儲鏄?strong>epoll鏈?縐嶅伐浣滄柟寮?LT鍜孍T銆?br />
LT(level triggered)鏄己鐪佺殑宸ヤ綔鏂瑰紡錛屽茍涓斿悓鏃舵敮鎸乥lock鍜宯o-block socket.鍦ㄨ繖縐嶅仛娉曚腑錛屽唴鏍稿憡璇変綘涓涓枃浠舵弿榪扮鏄惁灝辯華浜嗭紝鐒跺悗浣犲彲浠ュ榪欎釜灝辯華鐨刦d榪涜IO鎿嶄綔銆傚鏋滀綘涓嶄綔浠諱綍鎿嶄綔錛屽唴鏍歌繕鏄細緇х畫閫氱煡浣犵殑錛屾墍浠ワ紝榪欑妯″紡緙栫▼鍑洪敊璇彲鑳芥ц灝忎竴鐐廣備紶緇熺殑select/poll閮芥槸榪欑妯″瀷鐨勪唬琛紟
ET (edge-triggered)鏄珮閫熷伐浣滄柟寮忥紝鍙敮鎸乶o-block socket銆傚湪榪欑妯″紡涓嬶紝褰撴弿榪扮浠庢湭灝辯華鍙樹負灝辯華鏃訛紝鍐呮牳閫氳繃epoll鍛婅瘔浣犮傜劧鍚庡畠浼氬亣璁句綘鐭ラ亾鏂囦歡鎻忚堪絎﹀凡緇忓氨緇紝騫朵笖涓嶄細鍐嶄負閭d釜鏂囦歡鎻忚堪絎﹀彂閫佹洿澶氱殑灝辯華閫氱煡錛岀洿鍒頒綘鍋氫簡鏌愪簺鎿嶄綔瀵艱嚧閭d釜鏂囦歡鎻忚堪絎︿笉鍐嶄負灝辯華鐘舵佷簡(姣斿錛屼綘鍦ㄥ彂閫侊紝鎺ユ敹鎴栬呮帴鏀惰姹傦紝鎴栬呭彂閫佹帴鏀剁殑鏁版嵁灝戜簬涓瀹氶噺鏃跺鑷翠簡涓涓狤WOULDBLOCK 閿欒錛夈備絾鏄娉ㄦ剰錛屽鏋滀竴鐩翠笉瀵硅繖涓猣d浣淚O鎿嶄綔(浠庤屽鑷村畠鍐嶆鍙樻垚鏈氨緇?錛屽唴鏍鎬笉浼氬彂閫佹洿澶氱殑閫氱煡(only once),涓嶈繃鍦═CP鍗忚涓紝ET妯″紡鐨勫姞閫熸晥鐢ㄤ粛闇瑕佹洿澶氱殑benchmark紜銆?br />
epoll鍙湁epoll_create,epoll_ctl,epoll_wait 3涓郴緇熻皟鐢紝鍏蜂綋鐢ㄦ硶璇峰弬鑰?a >http://www.xmailserver.org/linux-patches/nio-improve.html 錛屽湪http://www.kegel.com/rn/涔熸湁涓涓畬鏁寸殑渚嬪瓙錛屽ぇ瀹朵竴鐪嬪氨鐭ラ亾濡備綍浣跨敤浜?br />
Leader/follower妯″紡綰跨▼pool瀹炵幇錛屼互鍙婂拰epoll鐨勯厤鍚堛?br />
5銆?nbsp;epoll鐨勪嬌鐢ㄦ柟娉?/strong>
棣栧厛閫氳繃create_epoll(int maxfds)鏉ュ垱寤轟竴涓?strong>epoll鐨勫彞鏌勶紝鍏朵腑maxfds涓轟綘epoll鎵鏀寔鐨勬渶澶у彞鏌勬暟銆傝繖涓嚱鏁頒細榪斿洖涓涓柊鐨?strong>epoll鍙ユ焺錛屼箣鍚庣殑鎵鏈夋搷浣滃皢閫氳繃榪欎釜鍙ユ焺鏉ヨ繘琛屾搷浣溿傚湪鐢ㄥ畬涔嬪悗錛岃寰楃敤close()鏉ュ叧闂繖涓垱寤哄嚭鏉ョ殑epoll鍙ユ焺銆?涔嬪悗鍦ㄤ綘鐨勭綉緇滀富寰幆閲岄潰錛屾瘡涓甯х殑璋冪敤epoll_wait(int epfd, epoll_event events, int max events, int timeout)鏉ユ煡璇㈡墍鏈夌殑緗戠粶鎺ュ彛錛岀湅鍝竴涓彲浠ヨ錛屽摢涓涓彲浠ュ啓浜嗐傚熀鏈殑璇硶涓猴細
nfds = epoll_wait(kdpfd, events, maxevents, -1);
鍏朵腑kdpfd涓虹敤epoll_create鍒涘緩涔嬪悗鐨勫彞鏌勶紝events鏄竴涓?strong>epoll_event*鐨勬寚閽堬紝褰?strong>epoll_wait榪欎釜鍑芥暟鎿嶄綔鎴愬姛涔嬪悗錛?strong>epoll_events閲岄潰灝嗗偍瀛樻墍鏈夌殑璇誨啓浜嬩歡銆俶ax_events鏄綋鍓嶉渶瑕佺洃鍚殑鎵鏈塻ocket鍙ユ焺鏁般傛渶鍚庝竴涓猼imeout鏄?strong>epoll_wait鐨勮秴鏃訛紝涓?鐨勬椂鍊欒〃紺洪┈涓婅繑鍥烇紝涓?1鐨勬椂鍊欒〃紺轟竴鐩寸瓑涓嬪幓錛岀洿鍒版湁浜嬩歡鑼冨洿錛屼負浠繪剰姝f暣鏁扮殑鏃跺欒〃紺虹瓑榪欎箞闀跨殑鏃墮棿錛屽鏋滀竴鐩存病鏈変簨浠訛紝鍒欒寖鍥淬備竴鑸鏋滅綉緇滀富寰幆鏄崟鐙殑綰跨▼鐨勮瘽錛屽彲浠ョ敤-1鏉ョ瓑錛岃繖鏍峰彲浠ヤ繚璇佷竴浜涙晥鐜囷紝濡傛灉鏄拰涓婚昏緫鍦ㄥ悓涓涓嚎紼嬬殑璇濓紝鍒欏彲浠ョ敤0鏉ヤ繚璇佷富寰幆鐨勬晥鐜囥?/p>
epoll_wait鑼冨洿涔嬪悗搴旇鏄竴涓驚鐜紝閬嶅埄鎵鏈夌殑浜嬩歡錛?nbsp;
for(n = 0; n < nfds; ++n) {
if(events[n].data.fd == listener) { //濡傛灉鏄富socket鐨勪簨浠剁殑璇濓紝鍒欒〃紺烘湁鏂拌繛鎺ヨ繘鍏ヤ簡錛岃繘琛屾柊榪炴帴鐨勫鐞嗐?nbsp;
client = accept(listener, (struct sockaddr *) &local,
&addrlen);
if(client < 0){
perror("accept");
continue;
}
setnonblocking(client); // 灝嗘柊榪炴帴緗簬闈為樆濉炴ā寮?nbsp;
ev.events = EPOLLIN | EPOLLET; // 騫朵笖灝嗘柊榪炴帴涔熷姞鍏?strong>EPOLL鐨勭洃鍚槦鍒椼?nbsp;
娉ㄦ剰錛岃繖閲岀殑鍙傛暟EPOLLIN | EPOLLET騫舵病鏈夎緗鍐檚ocket鐨勭洃鍚紝濡傛灉鏈夊啓鎿嶄綔鐨勮瘽錛岃繖涓椂鍊?strong>epoll鏄笉浼氳繑鍥炰簨浠剁殑錛屽鏋滆瀵瑰啓鎿嶄綔涔熺洃鍚殑璇濓紝搴旇鏄疎POLLIN | EPOLLOUT | EPOLLET
ev.data.fd = client;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
// 璁劇疆濂絜vent涔嬪悗錛屽皢榪欎釜鏂扮殑event閫氳繃epoll_ctl鍔犲叆鍒?strong>epoll鐨勭洃鍚槦鍒楅噷闈紝榪欓噷鐢?strong>EPOLL_CTL_ADD鏉ュ姞涓涓柊鐨?strong>epoll浜嬩歡錛岄氳繃EPOLL_CTL_DEL鏉ュ噺灝戜竴涓?strong>epoll浜嬩歡錛岄氳繃EPOLL_CTL_MOD鏉ユ敼鍙樹竴涓簨浠剁殑鐩戝惉鏂瑰紡銆?nbsp;
fprintf(stderr, "epoll set insertion error: fd=%d0,
client);
return -1;
}
}
else // 濡傛灉涓嶆槸涓籹ocket鐨勪簨浠剁殑璇濓紝鍒欎唬琛ㄦ槸涓涓敤鎴穝ocket鐨勪簨浠訛紝鍒欐潵澶勭悊榪欎釜鐢ㄦ埛socket鐨勪簨鎯咃紝姣斿璇磖ead(fd,xxx)涔嬬被鐨勶紝鎴栬呬竴浜涘叾浠栫殑澶勭悊銆?nbsp;
do_use_fd(events[n].data.fd);
}
瀵癸紝epoll鐨勬搷浣滃氨榪欎箞綆鍗曪紝鎬誨叡涓嶈繃4涓狝PI錛?strong>epoll_create, epoll_ctl, epoll_wait鍜宑lose銆?nbsp;
濡傛灉鎮ㄥepoll鐨勬晥鐜囪繕涓嶅お浜嗚В錛岃鍙傝冩垜涔嬪墠鍏充簬緗戠粶娓告垙鐨勭綉緇滅紪紼嬬瓑鐩稿叧鐨勬枃绔犮?/p>
浠ュ墠鍏徃鐨勬湇鍔″櫒閮芥槸浣跨敤HTTP榪炴帴錛屼絾鏄繖鏍風殑璇濓紝鍦ㄦ墜鏈虹洰鍓嶇殑緗戠粶鎯呭喌涓嬩笉浣嗘樉寰楅熷害杈冩參錛岃屼笖涓嶇ǔ瀹氥傚洜姝ゅぇ瀹朵竴鑷村悓鎰忕敤SOCKET鏉ヨ繘琛岃繛鎺ャ傝櫧鐒朵嬌鐢⊿OCKET涔嬪悗錛屽浜庣敤鎴風殑璐圭敤鍙兘浼氬鍔?鐢變簬鏄敤浜咰MNET鑰岄潪CMWAP)錛屼絾鏄紝縐夌潃鐢ㄦ埛浣撻獙鑷充笂鐨勫師鍒欙紝鐩鎬俊澶у榪樻槸鑳藉鎺ュ彈鐨?甯屾湜閭d簺鐜╁鏈堟湯鏀跺埌甯愬崟涓嶅悗鑳藉淇濇寔鍏嬪埗...)銆?br />
榪欐鐨勬湇鍔″櫒璁捐涓紝鏈閲嶈鐨勪竴涓獊鐮達紝鏄嬌鐢ㄤ簡EPOLL妯″瀷錛岃櫧鐒跺涔嬩篃鏄竴鐭ュ崐瑙o紝浣嗘槸鏃㈢劧鍦ㄥ悇澶C緗戞父涓凡緇忕粡榪囦簡濡傛涓ラ叿鐨勮冮獙錛岀浉淇′粬涓嶄細璁╂垜浠け鏈涳紝浣跨敤鍚庣殑緇撴灉錛岀‘瀹炰篃鏄〃鐜扮浉褰撲笉閿欍傚湪榪欓噷錛屾垜榪樻槸涓昏澶ц嚧浠嬬粛涓涓嬭繖涓ā鍨嬬殑緇撴瀯銆?br />
6銆丩inux涓?strong>EPOll緙栫▼瀹炰緥
EPOLL妯″瀷浼間箮鍙湁涓縐嶆牸寮忥紝鎵浠ュぇ瀹跺彧瑕佸弬鑰冩垜涓嬮潰鐨勪唬鐮侊紝灝辮兘澶熷EPOLL鏈夋墍浜嗚В浜嗭紝浠g爜鐨勮В閲婇兘宸茬粡鍦ㄦ敞閲婁腑錛?/p>
while (TRUE)
{
int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//絳夊緟EPOLL鏃墮棿鐨勫彂鐢燂紝鐩稿綋浜庣洃鍚紝鑷充簬鐩稿叧鐨勭鍙o紝闇瑕佸湪鍒濆鍖?strong>EPOLL鐨勬椂鍊欑粦瀹氥?br />
if (nfds <= 0)
continue;
m_bOnTimeChecking = FALSE;
G_CurTime = time(NULL);
for (int i=0; i
{
try
{
if (m_events[i].data.fd == m_listen_http_fd)//濡傛灉鏂扮洃嫻嬪埌涓涓狧TTP鐢ㄦ埛榪炴帴鍒扮粦瀹氱殑HTTP绔彛錛屽緩绔嬫柊鐨勮繛鎺ャ傜敱浜庢垜浠柊閲囩敤浜哠OCKET榪炴帴錛屾墍浠ュ熀鏈病鐢ㄣ?br />
{
OnAcceptHttpEpoll ();
}
else if (m_events[i].data.fd == m_listen_sock_fd)//濡傛灉鏂扮洃嫻嬪埌涓涓猄OCKET鐢ㄦ埛榪炴帴鍒頒簡緇戝畾鐨凷OCKET绔彛錛屽緩绔嬫柊鐨勮繛鎺ャ?br />
{
OnAcceptSockEpoll ();
}
else if (m_events[i].events & EPOLLIN)//濡傛灉鏄凡緇忚繛鎺ョ殑鐢ㄦ埛錛屽茍涓旀敹鍒版暟鎹紝閭d箞榪涜璇誨叆銆?br />
{
OnReadEpoll (i);
}
OnWriteEpoll (i);//鏌ョ湅褰撳墠鐨勬椿鍔ㄨ繛鎺ユ槸鍚︽湁闇瑕佸啓鍑虹殑鏁版嵁銆?br />
}
catch (int)
{
PRINTF ("CATCH鎹曡幏閿欒\n");
continue;
}
}
m_bOnTimeChecking = TRUE;
OnTimer ();//榪涜涓浜涘畾鏃剁殑鎿嶄綔錛屼富瑕佸氨鏄垹闄や竴浜涚煭綰跨敤鎴風瓑銆?br />
}
鍏跺疄EPOLL鐨勭簿鍗庯紝涔熷氨鏄笂榪扮殑鍑犳鐭煭鐨勪唬鐮侊紝鐪嬫潵鏃朵唬鐪熺殑涓嶅悓浜嗭紝浠ュ墠濡備綍鎺ュ彈澶ч噺鐢ㄦ埛榪炴帴鐨勯棶棰橈紝鐜板湪鍗磋濡傛杞繪澗鐨勬悶瀹氾紝鐪熸槸璁╀漢涓嶅緱涓嶆劅鍙癸紝瀵瑰摢銆?/p>
鎬葷粨
Windows瀹屾垚绔彛涓嶭inux epoll鎶鏈柟妗堟槸榪?涓鉤鍙頒笂瀹炵幇寮傛IO鍜岃璁″紑鍙戜竴涓ぇ瀹歸噺錛屽叿鍙墿灞曟х殑winsock紼嬪簭鎸囨湇鍔$▼搴忕殑寰堝ソ鐨勯夋嫨錛屾湰鏂囧榪?涓妧鏈殑瀹炵幇鍘熺悊鍜屽疄闄呯殑浣跨敤鏂規硶鍋氫簡涓涓緇嗙殑浠嬬粛銆?/p>
@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
鍦ㄦ湰鏂囦腑錛屽皢緇欏ぇ瀹朵粙緇嶅浣曚嬌鐢?nbsp;autoconf鍜宎utomake涓や釜宸ュ叿鏉ュ府鍔╂垜浠嚜鍔ㄥ湴鐢熸垚絎﹀悎鑷敱杞歡鎯緥鐨凪akefile錛岃繖鏍峰氨鍙互璞″父瑙佺殑GNU紼嬪簭涓鏍鳳紝鍙浣跨敤“./configure”錛?#8220;make”錛?#8220;make install”灝卞彲浠ユ妸紼嬪簭瀹夎鍒癓inux緋葷粺涓幓浜嗐傝繖灝嗙壒鍒傚悎鎯沖仛寮鏀炬簮浠g爜杞歡鐨勭▼搴忓紑鍙戜漢鍛橈紝鍙堟垨濡傛灉浣犲彧鏄嚜宸卞啓浜涘皬鐨凾oy紼嬪簭錛岄偅涔堣繖涓枃绔犲浣犱篃浼氭湁寰堝ぇ鐨勫府鍔┿?/p>
緙栬瘧涓涓畝鍗曠殑婧愭枃浠秏ain.c,闇瑕佽嚜鍔ㄧ敓鎴愪竴涓猰akefile,浠ヤ笅鏄楠わ細
絎竴姝ワ細
----------
鍦?root/project/main鐩綍涓嬪垱寤轟竴涓枃浠秏ain.c,鍏跺唴瀹瑰涓嬶細
------------------------------------------------
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello, Auto Makefile!\n");
return 0;
}
------------------------------------------------
姝ゆ椂鐘舵佸涓嬶細
[root@localhost main]# pwd
/root/project/main
[root@localhost main]# ls
main.c
[root@localhost main]#
絎簩姝ワ細
----------
榪愯 autoscan , 鑷姩鍒涘緩涓や釜鏂囦歡錛?autoscan.log configure.scan
姝ゆ椂鐘舵佸涓嬶細
[root@localhost main]# autoscan
[root@localhost main]# ls
autoscan.log configure.scan main.c
[root@localhost main]#
絎笁姝ワ細
----------
淇敼configure.scan鐨勬枃浠跺悕涓篶onfigure.in
鏌ョ湅configure.in鐨勫唴瀹癸細
------------------------------------------------
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
------------------------------------------------
瑙h浠ヤ笂鐨勬枃浠訛細
------------------------------------------------
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
# AC_PREREQ:
# 紜繚浣跨敤鐨勬槸瓚沖鏂扮殑Autoconf鐗堟湰銆傚鏋滅敤浜庡垱寤篶onfigure鐨凙utoconf鐨勭増
# 鏈瘮version 瑕佹棭錛屽氨鍦ㄦ爣鍑嗛敊璇緭鍑烘墦鍗頒竴鏉¢敊璇秷鎭茍涓嶄細鍒涘緩configure銆?/p>
AC_PREREQ(2.61)
#
# 鍒濆鍖?瀹氫箟杞歡鐨勫熀鏈俊鎭?鍖呮嫭璁劇疆鍖呯殑鍏ㄧО,鐗堟湰鍙蜂互鍙婃姤鍛夿UG鏃墮渶瑕佺敤鐨勯偖綆卞湴鍧
#
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
#
# 鐢ㄦ潵渚︽祴鎵鎸囧畾鐨勬簮鐮佹枃浠舵槸鍚﹀瓨鍦紝鏉ョ‘瀹氭簮鐮佺洰褰曠殑鏈夋晥鎬?/p>
#
AC_CONFIG_SRCDIR([main.c])
#
# 鐢ㄤ簬鐢熸垚config.h鏂囦歡錛屼互渚縜utoheader浣跨敤
#
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
#
# 鍒涘緩杈撳嚭鏂囦歡銆傚湪`configure.in'鐨勬湯灝捐皟鐢ㄦ湰瀹忎竴嬈°?/p>
#
AC_OUTPUT
------------------------------------------------
淇敼鍔ㄤ綔:
1.淇敼AC_INIT閲岄潰鐨勫弬鏁? AC_INIT(main,1.0, pgpxc@163.com)
2.娣誨姞瀹廇M_INIT_AUTOMAKE, 瀹冩槸automake鎵蹇呭鐨勫畯錛屼篃鍚屽墠闈竴鏍鳳紝PACKAGE鏄墍瑕佷駭鐢熻蔣浠跺浠剁殑鍚嶇О錛孷ERSION鏄増鏈紪鍙楓?/p>
3.鍦ˋC_OUTPUT鍚庢坊鍔犺緭鍑烘枃浠禡akefile
淇敼鍚庣殑緇撴灉:
------------------------------------------------
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(main, 1.0, pgpxc@163.com)
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(main,1.0)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
------------------------------------------------
絎洓姝?
榪愯 aclocal, 鐢熸垚涓涓?#8220;aclocal.m4”鏂囦歡鍜屼竴涓紦鍐叉枃浠跺すautom4te.cache錛岃鏂囦歡涓昏澶勭悊鏈湴鐨勫畯瀹氫箟銆?/p>
姝ゆ椂鐨勭姸鎬佹槸錛?/p>
[root@localhost main]# aclocal
[root@localhost main]# ls
aclocal.m4 autom4te.cache autoscan.log configure.in configure.in~ main.c
[root@localhost main]#
絎簲姝ワ細
榪愯 autoconf, 鐩殑鏄敓鎴?configure
姝ゆ椂鐨勭姸鎬佹槸錛?/p>
[root@localhost main]# autoconf
[root@localhost main]# ls
aclocal.m4 autoscan.log configure.in main.c
autom4te.cache configure configure.in~
[root@localhost main]#
絎叚姝ワ細
榪愯 autoheader錛屽畠璐熻矗鐢熸垚config.h.in鏂囦歡銆傝宸ュ叿閫氬父浼氫粠“acconfig.h”鏂囦歡涓鍒剁敤鎴烽檮鍔犵殑絎﹀彿瀹氫箟錛屽洜姝ゆ澶勬病鏈夐檮鍔犵鍙峰畾涔夛紝鎵浠ヤ笉闇瑕佸垱寤?#8220;acconfig.h”鏂囦歡銆?/p>
姝ゆ椂鐨勭姸鎬佹槸錛?/p>
[root@localhost main]# autoheader
[root@localhost main]# ls
aclocal.m4 autoscan.log configure configure.in~
autom4te.cache config.h.in configure.in main.c
[root@localhost main]#
絎竷姝ワ細
涓嬮潰鍗沖皢榪愯 automake, 浣嗗湪姝や箣鍓嶅簲璇ュ仛涓涓嬪噯澶囧伐浣?
棣栧厛
鍒涘緩涓涓?nbsp;Makefile.am.榪欎竴姝ユ槸鍒涘緩Makefile寰堥噸瑕佺殑涓姝ワ紝automake瑕佺敤鐨勮剼鏈厤緗枃浠舵槸Makefile.am錛岀敤鎴烽渶瑕佽嚜宸卞垱寤虹浉搴旂殑鏂囦歡銆備箣鍚庯紝automake宸ュ叿杞崲鎴怣akefile.in銆?/p>
榪欎釜Makefile.am鐨勫唴瀹瑰涓嬶細
------------------------------------------------
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main
main_SOURCES=main.c
------------------------------------------------
涓嬮潰瀵硅鑴氭湰鏂囦歡鐨勫搴旈」榪涜瑙i噴銆?/p>
鍏朵腑鐨凙UTOMAKE_OPTIONS涓鴻緗產utomake鐨勯夐」銆傜敱浜嶨NU錛堝湪絎?绔犱腑宸茬粡鏈夋墍浠嬬粛錛夊鑷繁鍙戝竷鐨勮蔣浠舵湁涓ユ牸鐨勮鑼冿紝姣斿蹇呴』闄?甯﹁鍙瘉澹版槑鏂囦歡COPYING絳夛紝鍚﹀垯automake鎵ц鏃朵細鎶ラ敊銆俛utomake鎻愪緵浜嗕笁縐嶈蔣浠剁瓑綰э細foreign銆乬nu鍜実nits錛岃鐢?鎴烽夋嫨閲囩敤錛岄粯璁ょ瓑綰т負gnu銆傚湪鏈緥浣跨敤foreign絳夌駭錛屽畠鍙嫻嬪繀欏葷殑鏂囦歡銆?/p>
bin_PROGRAMS瀹氫箟瑕佷駭鐢熺殑鎵ц鏂囦歡鍚嶃傚鏋滆浜х敓澶氫釜鎵ц鏂囦歡錛屾瘡涓枃浠跺悕鐢ㄧ┖鏍奸殧寮銆?/p>
main_SOURCES瀹氫箟“main”榪欎釜鎵ц紼嬪簭鎵闇瑕佺殑鍘熷鏂囦歡銆傚鏋?#8221;main”榪欎釜紼嬪簭鏄敱澶氫釜鍘熷鏂囦歡鎵浜х敓鐨勶紝鍒欏繀欏繪妸瀹冩墍鐢ㄥ埌鐨勬墍鏈夊師 濮嬫枃浠墮兘鍒楀嚭鏉ワ紝騫剁敤絀烘牸闅斿紑銆備緥濡傦細鑻ョ洰鏍囦綋“main”闇瑕?#8220;main.c”銆?#8220;sunq.c”銆?#8220;main.h”涓変釜渚濊禆鏂囦歡錛屽垯瀹氫箟 main_SOURCES=main.c sunq.c main.h銆傝娉ㄦ剰鐨勬槸錛屽鏋滆瀹氫箟澶氫釜鎵ц鏂囦歡錛屽垯瀵規瘡涓墽琛岀▼搴忛兘瑕佸畾涔夌浉搴旂殑file_SOURCES銆?/p>
鍏舵
浣跨敤automake瀵瑰叾鐢熸垚“configure.in”鏂囦歡錛屽湪榪欓噷浣跨敤閫夐」“—adding-missing”鍙互璁゛utomake鑷姩娣誨姞鏈変竴浜涘繀闇鐨勮剼鏈枃浠躲?/p>
榪愯鍚庣殑鐘舵佹槸錛?/p>
------------------------------------------------
[root@localhost main]# automake --add-missing
configure.in:8: installing `./missing'
configure.in:8: installing `./install-sh'
Makefile.am: installing `./depcomp'
[root@localhost main]# ls
aclocal.m4 config.h.in configure.in~ main.c Makefile.in
autom4te.cache configure depcomp Makefile.am missing
autoscan.log configure.in install-sh Makefile.am~
[root@localhost main]#
------------------------------------------------
絎叓姝?/p>
榪愯configure錛屽湪榪欎竴姝ヤ腑錛岄氳繃榪愯鑷姩閰嶇疆璁劇疆鏂囦歡configure錛屾妸Makefile.in鍙樻垚浜嗘渶緇堢殑Makefile銆?/p>
榪愯鐨勭粨鏋滃涓嬶細
------------------------------------------------
[root@localhost main]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
[root@localhost main]# ls
aclocal.m4 config.h.in configure.in main.c Makefile.in
autom4te.cache config.log configure.in~ Makefile missing
autoscan.log config.status depcomp Makefile.am stamp-h1
config.h configure install-sh Makefile.am~
[root@localhost main]#
------------------------------------------------
絎節姝?/p>
榪愯 make錛屽閰嶇疆鏂囦歡Makefile榪涜嫻嬭瘯涓涓?/p>
姝ゆ椂鐨勭姸鎬佸涓?
------------------------------------------------
[root@localhost main]# make
cd . && /bin/sh /root/project/main/missing --run aclocal-1.10
cd . && /bin/sh /root/project/main/missing --run automake-1.10 --foreign
cd . && /bin/sh /root/project/main/missing --run autoconf
/bin/sh ./config.status --recheck
running CONFIG_SHELL=/bin/sh /bin/sh ./configure --no-create --no-recursion
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
/bin/sh ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
cd . && /bin/sh /root/project/main/missing --run autoheader
rm -f stamp-h1
touch config.h.in
make all-am
make[1]: Entering directory `/root/project/main'
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o main main.o
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make[1]: Leaving directory `/root/project/main'
[root@localhost main]# ls
aclocal.m4 autoscan.log config.h.in config.status configure.in depcomp main main.o Makefile.am Makefile.in stamp-h1
autom4te.cache config.h config.log configure configure.in~ install-sh main.c Makefile Makefile.am~ missing
[root@localhost main]#
------------------------------------------------
絎崄姝?/p>
榪愯鐢熸垚鐨勬枃浠?main錛?/p>
------------------------------------------------
[root@localhost main]# ./main
Hello, Auto Makefile!
[root@localhost main]#
------------------------------------------------
鎴戠敤鐨勬槸ubuntu
浠ヤ笂灝辨槸鍏ㄦ枃浜?浣嗘湁涓澶勮鏀?鐢╝clocal
鍏ㄦ姤鏈変竴涓猰4鏂囦歡鏈夐敊.鎵懼埌鎶ラ敊鐨勯偅涓琛?鎶婂彉閲忓姞涓腑鎷彿灝卞彲浠ヤ簡
xmlns:fx=”http://ns.adobe.com/mxml/2009″
xmlns:mx=”library://ns.adobe.com/flex/halo”
xmlns:s=”library://ns.adobe.com/flex/spark”
1銆亁mlns:fx=”http://ns.adobe.com/mxml/2009″
fx鍛藉悕絀洪棿涓嬪寘鍚獳ctionScript欏剁駭鍏冪礌鍜屽唴寤哄埌MXML緙栬瘧鍣ㄩ噷鐨勬爣絳俱?/p>
鍓嶈匒ctionScript欏剁駭鍏冪礌灝辨槸鎸?Object銆丯umber銆丅oolean浠ュ強Array瀵硅薄絳夌瓑錛屽湪銆夾dobe Flex 4 Beta Language Reference銆嬬殑欏剁駭鍖咃紙Top Level錛夐噷鍙互鏌ョ湅瀹屾暣鐨勯《綰у厓绱犮傚悗鑰呭唴寤哄埌MXML緙栬瘧鍣ㄩ噷鐨勬爣絳懼寘鎷?lt;fx:Script>銆?lt;fx:Declarations>鍜?lt;fx:Style>絳夌瓑錛屽湪銆夾dobe Flex 4 Beta Language Reference銆嬮檮褰曪紙Appendixes錛夐噷鐨?#8220;MXML Only Tags”鍙互鏌ョ湅瀹屾暣鐨勭紪璇戝櫒鍏冪礌銆傚煎緱娉ㄦ剰鐨勬槸錛岃繖涓懡鍚嶇┖闂村茍涓嶅寘鍚?Halo 鍜?Spark 緇勪歡錛圚alo鏄互鍓嶇増鏈殑緇勪歡搴擄紝鑰孲park鏄疐lex 4鏂板嚭鐨勭粍浠跺簱錛夈傚湪Flash Builder瀹夎鐩綍涓嬪彲浠ユ壘鍒?#8220;mxml-2009-manifest.xml”鏂囦歡錛堜緥濡傛垜鐨勭數鑴戞槸C:\Program Files\Adobe\Flash Builder Beta\sdks\4.0.0\frameworks\mxml-2009-manifest.xml錛夛紝榪欎釜xml鏂囦歡鎻忚堪浜嗗畬鏁寸殑 ActionScript欏剁駭綾匯備笉榪囦綘鍙互娉ㄦ剰鍒幫紝瀹冨茍娌℃湁鍖呭惈MXML緙栬瘧鍣ㄦ爣絳撅紝閭f槸鍥犱負榪欎簺鏍囩鏄唴寤哄埌MXML緙栬瘧鍣ㄣ?/p>
2銆亁mlns:mx=”library://ns.adobe.com/flex/halo”
mx鍛藉悕絀洪棿鍖呭惈鐫鏀懼湪 mx.* 鍖呴噷閭d簺緇勪歡錛孎lex鍥捐〃銆丗lex鏁版嵁鍙鍖栫粍浠剁瓑絳夈傚Flex 3寰堢啛鎮夌殑璇濓紝mx鍖呴噷鐨勭粍浠朵綘涔熶笉闄岀敓浜嗐傚湪Flex 4 SDK鐨勫畨瑁呯洰褰曚笅鍙互鎵懼埌“halo-manifest.xml”鏂囦歡錛堜緥濡傛垜鐨勭數鑴戞槸C:\Program Files\Adobe\Flash Builder Beta\sdks\4.0.0\frameworks\halo-manifest.xml錛夛紝榪欎釜XML鏂囦歡鍒楀嚭浜嗘墍鏈夌粍浠朵簡銆?/p>
3銆亁mlns:s=”library://ns.adobe.com/flex/spark”
s鍛藉悕絀洪棿鍙湡鏄柊椴滀簨浜嗭紝spark.* 鍖呴噷鐨勭粍浠墮兘鍦ㄨ繖涓懡鍚嶇┖闂撮噷錛屼笉鍙猻park鍖咃紝flashx.*鍖呯殑text framework綾諱篃鍦ㄨ繖涓懡鍚嶇┖闂撮噷銆傝繖涓懡鍚嶇┖闂村寘鍚笉灝慠PC綾伙紝渚嬪 WebService銆丠TTPService鍜孯emoteObject緇勪歡錛岃繖浜涚粍浠跺悓鏃朵篃鍦╩x鍛藉悕絀洪棿涓嬶紝涔熷氨鏄錛屽垱寤鴻繖浜涚粍浠舵椂錛屼綘涓嶄絾鍙互浣跨敤“S:”鍓嶇紑錛屼篃鍙互浣跨敤“mx:”鍓嶇紑銆傚叾瀹炰笉鍙繖浜汻PC緇勪歡鍏辯敤涓や釜鍛藉悕絀洪棿錛屽儚graphics銆乪ffect鍜宻tate綾諱篃鏄叡鐢?s 鍜?mx 鍛藉悕絀洪棿鐨勩傚湪Flex 4 SDK瀹夎鐩綍涓嬫墦寮spark-manifest.xml鏂囦歡鏉ョ湅鐪嬪畬鏁寸殑spark緇勪歡鍚с?/p>
鐢ㄤ簡涓騫村Flex錛屾劅瑙﹀澶氥傚伓灝旀湁鍚岃鐨勬湅鍙嬮棶鎴戝暐鏄疐lex錛岃瀹炶瘽錛屼竴鏃跺崐浼氬効鎴戣繕鐪熻涓嶆竻妤氥傚挨鍏舵槸瀵逛簬涓涓粠鏈帴瑙﹁繃Flex鐨勬湅鍙嬶紝鎯寵鐢辨祬鍏ユ繁鍦板彧鐢ㄥ槾宸翠笉鐢ㄧ數鑴戠粰浠栬鏄庣櫧錛岃繖紜疄闅句負涓涓暣澶╁彧璺熸満鍣ㄦ墦浜ら亾鐨勭▼搴忓憳浜嗐傚悗鏉ユ垜鎯充簡涓涓姙娉曪紝鎴戣浣犵煡閬撳紑蹇冨啘鍦哄惂錛岄偅灝辨槸鎷縁lex鍋氱殑銆傝繖涓嬪瓙寰堝浜烘湁鍏磋叮浜嗭紝鍛靛懙錛屽鏋滀綘涔熸湁鍏磋叮錛岃緇х畫寰涓嬬湅銆傚け璦鏈療涔嬪錛屾榪庢媿鐮栥?/p>
涓鑸潵璇達紝涓欏規妧鏈殑浜х敓閮芥槸涓轟簡瑙e喅涓氱晫鐨勯噸澶ч毦棰樿屽嚭鐜扮殑銆傞偅涔堣鍒癋lex鎴戜滑灝變笉寰椾笉鍏堣涓涓婻IA銆俁IA榪欎釜姒傚康鍏跺疄鏃╁氨鍑虹幇浜嗭紝鎴戞渶鍒濇槸07騫村湪銆婄▼搴忓憳銆嬫潅蹇椾笂鍏充簬Ajax鎶鏈殑浠嬬粛鏃剁湅鍒扮殑銆傚埌浜?8騫達紝浼撮殢鐫緗戠粶瑙嗛鐨勯閫熷彂灞曪紝RIA搴旂敤宸茬粡鎼炲緱鏈夊0鏈夎壊鐑伀鏈濆ぉ浜嗭紝鍏跺疄緲昏瘧榪囨潵灝辨槸涓瘜瀹㈡埛绔紙Rich Internet Application錛夛紝鐩歌緝浜嶣S鐨勭槮瀹㈡埛绔紝涔熷彲浠ョО涔嬩負鑳栧鎴風銆傚綋鐒跺鏋滀綘宸茬粡琚繖浜涘悕璇嶆蹇電啅寰楃劍澶寸儌棰濓紝璇瘋繛璺沖洓孌碉紙灝忛粦濂藉績鎻愮ず錛屾湰閮ㄥ垎浠呬綑鍥涙銆傘傘傦級銆?/p>
RIA綆鍗曠殑璇達紝灝辨槸CS+BS鐨勫紑鍙戦儴緗叉ā寮忋侰S鍜孊S澶у閮藉緢鐔熸倝錛孋S鐨勫叏鎷兼槸Client/Server錛屽畠鐨勪紭鐐瑰湪浜庡熷姪灞鍩熺綉鐨勪俊鎭畨鍏ㄥ拰甯﹀浼樺娍錛屽厖鍒嗗埄鐢ㄥ鎴鋒満鍣ㄧ殑榪愮畻鑳藉姏浠庤岄檷浣庢湇鍔″櫒鍘嬪姏錛岀己鐐瑰氨鏄畨瑁呴儴緗叉洿鏂伴夯鐑︼紝姣斿鑰佹澘璁╂垜璺戝埌涓鍗冨叕閲屽鐨勫鎴烽偅瀹夎涓鍗冨彴鏈哄櫒鐨勫鎴風錛岃繃鍑犲ぉ鎴戝洖鏉ヤ簡錛岃佹澘璇撮偅杈規湁鍑犲彴鏈哄櫒榪愯鏈夐棶棰橈紝浣犲幓緇存姢涓涓媬錛佽繃鍑犱釜鏈堬紝鑰佹澘璇翠綘鍘繪妸閭d竴鍗冨彴鏈哄櫒鍏ㄩ儴鍗囩駭涓閬嶏紝浠栦滑鑷繁涓嶄細瑁呫傘傘傚懙鍛碉紝榪欎簺鐥涜嫤鎴戝綋鐒朵笉鏇劇粡鍘嗭紝鎴戞潨鎾扮殑銆?/p>
閭d箞鍦?998騫達紝浜掕仈緗戦璧蜂簯娑岀殑鏃跺欙紝BS錛孊rowser/Server錛岄㈡椂鑰岀敓銆侭S鍏呭垎鍒╃敤浜掕仈緗戠殑浼樺娍錛岃В鍐充簡CS瀹夎閮ㄧ講鏇存柊鐨勪竴澶ч毦棰樸傞氳繃鎶婁笟鍔¢昏緫澶勭悊鏀懼湪鏈嶅姟鍣ㄧ錛岀劧鍚庤В鏋愪負HTML錛屽埄鐢℉TTP鍗忚浼犺緭鍒板鎴風殑嫻忚鍣ㄤ笂灝變竾浜嬪ぇ鍚夈傜湅璧鋒潵寰堢編錛屽叾瀹炲共榪囧氨鐭ラ亾涔熷緢鐥涜嫤銆傚摢鍎跨棝鍛紝鐥涚殑褰撶劧鏄垜浠繖浜涘紑鍙戣呫傚畨瑁呴儴緗叉洿鏂板掓槸鐪佷簨鍎夸簡錛岃涓狪E錛岀粰涓綉鍧灝辮兘璁╁鎴風櫥褰曚簡銆備絾鏄紝鍩轟簬HTML+JavaScript鐨勬妧鏈浜哄緢宕╂簝銆侸avaScript鎴戝ソ涔呬笉鐢ㄤ簡錛屽湪浠ュ墠姣曚笟瀹炰範鐨勬椂鍊欙紝鎰熻寮鍙戝拰璋冭瘯閮戒笉鏂逛究錛岃屼笖榪橀潰涓寸潃涓嶅悓嫻忚鍣ㄤ笉鍏煎鐨勫櫓姊︼紙鎹鐜板湪涓婅堪闂闅忕潃Ajax鐨勯琛屾湁鎵鏀瑰杽錛屾垜涓嶅お浜嗚В錛夈傚彟澶栵紝BS榪樻湁涓浜涙綔鍦ㄧ殑緙虹偣銆傛瘮濡傦紝瀹㈡埛绔綋楠岀畝鍗曪紝涓嶆槗寮鍙戜赴瀵岀殑鏁堟灉鏉ュ睍紺烘暟鎹紙榪欏拰褰撴椂鐨勭綉緇滃甫瀹戒篃鏈夊叧緋伙級錛涘繀欏昏仈緗戞墠鑳借繍琛岋紝淇℃伅瀹夊叏鏃犳硶淇濋殰錛涘簲鐢ㄧ▼搴忛渶瑕侀氳繃鍏朵粬鎶鏈緟鍔╂墠鑳芥搷浣滃鎴風璧勬簮錛涙湇鍔″櫒璐熻澆榪囬珮鑰屽鎴鋒満榪愮畻鑳藉姏鏈厖鍒嗕嬌鐢ㄧ瓑銆?/p>
緇煎悎鏉ヨ錛孊S浠嶇劧鏄竴涓笉閿欑殑瑙e喅鏂規錛屽畠鐨刉eb搴旂敤紼嬪簭鍜孋S鐨勬闈㈠簲鐢ㄧ▼搴忔浘涓搴︿簩鍒嗗ぉ涓嬶紝鍚勯椋庨獨鏁板崄騫淬備粠瑙h﹁搴︽潵鐪嬶紝CS浠ユ暟鎹簱鐨勬柟寮忔妸鏁版嵁浠庣▼搴忎腑鍒嗙錛孊S浠ユ祻瑙堝櫒欏甸潰鐨勬柟寮忔妸鐣岄潰鍜岄昏緫鍐嶆鍒嗙錛岀劧鑰岀浜屾鍒嗙鏄笉褰誨簳鐨勩傝〃闈笂鍙槸浠g爜緇撴瀯鐨勫垎紱伙紝浠庡疄璐ㄤ笂鐪嬭〃鐜板眰浠嶇劧鏄昏緫灞傜殑闄勫焊錛屽墠鍙癠I瀹屽叏鍜屽悗鍙板疄鐜版妧鏈粦姝伙紙鎶婂凡鏈夐」鐩悗鍙頒粠C#鎹㈡垚JAVA鏄笉鍙兘鐨勩傘傘傦級涓轟簡瑙e喅榪欎釜闂錛孯IA鍑虹幇浜嗭紙欏轟究鎼炲畾浜嗕竴浜涘叾浠栭棶棰橈紝姣斿欏甸潰寮傛鍒鋒柊錛屽墠鍙癠I涓嶅涓板瘜絳夌瓑錛夛紝RIA鍩烘湰瀹炵幇浜嗕笉渚濊禆浜庣壒瀹氬悗鍙版妧鏈紝鑳戒笌澶氱鏈嶅姟绔惌閰嶄嬌鐢ㄣ?/p>
鍦?002騫達紝MacroMedia鍏徃錛堢畝縐癕M錛?5騫磋Adobe鏀惰喘錛夐鍏堝湪Flash Player6涓紩鍏ヤ簡RIA姒傚康銆?004騫達紝MM姝e紡鍙戝竷Flex1.0錛堟睏錛岀粓浜庤鍒癋lex浜嗭級錛岄殢鐫Ajax鐨勭伀鐖嗭紝RIA寮濮嬪彈鍒板箍娉涘叧娉ㄣ俁IA涓昏鏈変袱涓柟闈㈢殑鍚箟錛屼竴鏄敤鎴風晫闈㈢殑涓板瘜鍗沖瘜瀹㈡埛绔紝浜屾槸鏁版嵁妯″瀷鐨勬櫤鑳斤紝鏈嶅姟鍣ㄥ凡緇忓彉鎴愪簡鏀寔瀹㈡埛绔甯歌繍琛岀殑鏁版嵁鏈嶅姟錛屽茍鎻愪緵浜嗗紓姝ユ暟鎹紶杈撳拰鑴辨満緙撳瓨鏈哄埗絳夊鏉傜殑鏁版嵁澶勭悊鑳藉姏銆傚墠闈㈡彁鍒幫紝RIA鏈川涓婂氨鏄疌S+BS錛屽畠鎯抽泦澶ф垚錛屾兂鎼炴葷粨錛屾兂緇堢粨CS鍜孊S浜屽垎澶╀笅鐨勫眬闈€傝嫻呮樉鐐瑰氨鏄紝濡傛灉浠ュ墠鐨凜S紼嬪簭鐜板湪鑳藉湪緗戠粶涓婅繍琛岋紝騫朵笖淇濇寔浜嗗師鏉ョ殑鍔熻兘鍜岀壒寰侊紝閭d箞榪欏氨鏄竴涓猂IA銆傚叧浜嶳IA鐨勮緇嗕粙緇岹OOGLE涓婁竴鎼滀竴澶ф妸錛屽湪姝ゅ氨涓嶇戶緇綔璇︾粏灞曞紑銆傚洖鍒板綋涓嬶紝RIA鍚勭鎶鏈竴鐣嫾鏉錛岀幇鍦ㄥ箍涓轟漢鐭ョ殑鍙墿涓嬪洓涓狽B灝忎紮錛欰jax銆丗lex銆丼ilverLight銆丣avaFx銆傚湪鏈枃絎簩閮ㄥ垎涓紝鎴戝皢綆瑕佷粙緇嶄竴涓婩lex錛堣矊浼艱繘搴︽湁鐐瑰効鎱紝澶氳阿鏀寔銆傘傘傦級
Flex鏄拫鍥炰簨涔嬩簩 鍓嶄笘浠婄敓
鍏堣涓涓婩lash Player錛堢畝縐癋P錛夈傜粡甯鎬笂緗戠殑鏈嬪弸涓瀹氶亣鍒拌繃Flash Player鐗堟湰鍗囩駭鐨勬彁紺哄惂錛岃繖涓滆タ鍏跺疄灝辨槸嫻忚鍣ㄦ彃浠訛紝鎹宸茬粡鏈変簡98%鐨勫畨瑁呮櫘鍙婄巼錛屾病鍔炴硶錛岃皝璁╁挶浠繖涔堢埍鐪嬭棰戝憿錛團P鍏蜂綋浠嬬粛璇瘋http://baike.baidu.com/view/1585492.htm錛夈侳lex鐢熸垚鐨勯〉闈富瑕佹槸閫氳繃Html鍖呰涓涓嬬敓鎴愮殑swf鏂囦歡錛屽拰Flash鐢熸垚鐨剆wf涓鏍鳳紝瀹冧篃闈燜P鎵嶈兘瀹岀編榪愯錛岃繖鏈夌偣綾諱技JVM铏氭嫙鏈哄拰.NET FRAMEWORK錛團P閲屽唴宓屼簡AVM铏氭嫙鏈猴級銆侳P鍙堝垎璋冭瘯鐗堝拰浜у搧鐗堬紝鎬諱綋鏉ヨ錛屽挶浠彧綆$敤FP鎻愪緵鐨凙PI錛屼互鍙婂強鏃跺叧娉ㄦ渶鏂扮増鏈殑鍔熻兘錛屽叾浣欎笉浼氳繃澶氭帴瑙︼紙鎴戝FP10鍏充簬3D鏂歸潰鐨勬敮鎸佸緢鎰熷叴瓚o紝涓嶈繃璨屼技鍏舵敮鎸佹晥鏋滀笉澶悊鎯籌級銆?/p>
鍐嶈涓涓婩lash鐨勫巻鍙層傚湪1996騫?灝忚蔣浠跺叕鍙窮utureWave Software涓轟簡緇橬etscape寮鍙戜竴涓叏鏂扮殑緗戦〉嫻忚鎻掍歡錛屽垱寤轟簡鍚嶄負Future Splash Animator鐨勫姩鎬佸皬紼嬪簭錛岃浜у搧鍩轟簬Java錛屾槸鐢變竴涓О涓篠martSketch鐨勪駭鍝佹紨鍖栬屾潵錛岃繖灝辨槸Flash鐨勮佺浜嗐傚叿鏈夎鍒烘剰鍛崇殑鏄紝榪欏FutureWave鐨勫叕鍙告湰鏉ユ槸鎵撶畻鎶婅繖欏規妧鏈崠緇橝dobe鐨勶紝浣嗗湪閭d釜鏃跺橝dobe鏍規湰涓嶇潿瀹冦傝孧acromedia錛堢畝縐癕M錛夊嵈寰堟湁鍏磋叮錛屽氨榪欐牱鍦?996騫?1鏈?MM鍦ㄦ嫢鏈変簡FutureWave榪欏鍏徃鐨勬妧鏈悗錛屾妸FutureSplash閲嶆柊鍛藉悕涓篎lash Player 1.0銆傚湪闅忓悗鐨勮澶氬勾闂達紝Flash琚墦鍖呬負Studio濂椾歡鐨勪竴閮ㄥ垎錛屽茍涓庡叾浠朣tudio浜у搧錛堝Dreamweaver鍜孎ireworks錛変竴璧峰彂甯冿紝涓栦漢縐扮綉欏典笁鍓戝銆傘傘備笁鍓戝妯鏃犳晫錛屽埌浜?5騫?鏈?8鏃ヨ繖澶╋紝ADOBE瀹炲湪鐪嬩笉涓嬪幓浜嗭紝闃旂話鍑烘墜錛屽張浠?4浜跨編鍏冨ぉ浠鋒敹璐璏M銆傘傘侫DOBE澶у彅浼拌寰堝悗鎮斿綋騫存病鏀惰喘Future Splash錛屾悶鍒扮幇鍦紝琚玀M緇欏仛澶т簡錛團lash鍏蜂綋鍘嗗彶浠嬬粛鍙傝http://flash.9ria.com/viewthread.php?tid=13194鍜?a >http://space.flash8.net/space/?625743/viewspace-350122錛?/p>
濡傚悓浠婂勾4鏈圤racle鏀惰喘Sun涓鏍鳳紝MM瀚佸叆ADOBE璞棬錛屽湪褰撴椂鐨勪笟鐣屼篃鏄竴鐗囧摋鐒剁偢闆楓傝澶歁M鐨勫繝瀹炵矇涓濊寰楋紝閭d笁鍓戝灝辨槸琚獳DOBE澶у彅鎷涘畨浜嗗晩錛屼緷鎹叾鏀惰喘浜у搧鐨勪竴璐尌鐞愭伓琛岋紝榪欏嚑浣嶅墤渚犱及璁″緢蹇氨浼氳涓嶅0涓嶅搷鍦扮粰鏁存帀浜嗭紙褰撴椂Flex榪樻槸瑗佽錛屽ぇ瀹墮兘娌℃敞鎰忓埌銆傘傘傦級Fireworks鏄疨hotoShop鐨勮佸澶翠簡錛岃偗瀹氭槸鏂╃珛鍐籌紱Dreamweaver瑕佷笉灝辨槸鏀硅鍙樿韓錛岃涓嶅氨鏄悇縐嶇悊鐢辯洿鎺ョ紦姝伙紱Flash鏃ュ瓙浼氬ソ榪囦簺錛屼絾鍏朵竴璐殑MM椋庢牸鏄惁鑳藉歡緇篃寰堥毦淇濊瘉銆?/p>
鐒惰孉DOBE榪欐鍑轟箮鎰忔枡鐨勫杽鑹紝涓夊墤瀹㈡棤涓閬楀純錛岀浉鍙嶈繕蹇嶇棝鎶婅嚜宸辨帹琛屽騫寸殑SVG姝葷紦錛堜釜浜轟篃寰堝枩嬈VG錛屾棤濂堝拰FLASH鍐茬獊錛屽嚭浜庡晢涓氱瓥鐣ワ紝榪欏瀛愯鐗虹壊浜嗭級銆傚湪鏈鏂扮殑CS4錛圕reative Suite 4錛変駭鍝佺郴鍒椾腑錛屼笁鍓戝渚濈劧媧誨姏鍥涘皠鍦頒笌鍏朵粬鎴愬憳宸ュ叿浠拰璋愬榪涖傞偅涔堜簨闅旀敹璐簨浠跺洓騫村涔嬪悗錛屾垜浠凡緇忔笎娓愭帴鍙椾簡MM浜у搧鍓嶉潰寮鴻鍔犱笂鐨凙DOBE鏍囩銆傚彲浠ヨ錛孉DOBE鍏呭垎鍚哥撼鏁村悎浜哅M鐨勭簿紲炲拰椋庢牸錛屾棤璁烘槸FP榪樻槸涓夊墤瀹紝ADOBE涓鐩撮兘鍦ㄥ姫鍔涘湴鍋氬緱鏇村ソ鏇村拰璋愩傦紙鏈漢鐜板湪宸茬粡鏄疉DOBE FANS浜嗭紝鍝堝搱錛屼笉榪囪繕鏄尯鎬蹇礔lash MX2004 鍜孌reamweaver2004閭d釜鏃朵唬鐨勶紝灝界褰撴椂涔熸病闂嚭鍟ヤ笢瑗挎潵銆傘傘傦級
璇翠簡榪欎箞澶氬叧浜嶧lash鐨勪簨鎯咃紝鍏跺疄鏄洜涓篎lash姣擣lex鏇村嚭鍚嶏紝ADOBE涔熷療瑙夊埌榪欎竴鐐癸紝鎵浠ュ湪棰勫鎺ㄥ嚭FLEX4鏃訛紝鍙堝皢鍏舵洿鍚嶄負Flash錛屽彧鏄疭DK浠嶇劧娌跨敤FLEX鐨勫悕鍙楓侳LEX鍜孎LASH騫舵病鏈夋湰璐ㄥ尯鍒紝瀹冧滑鏈緇堥兘鏄漿涓篈ctionScript婧愭枃浠訛紝鐒跺悗琚紪璇戜負浜岃繘鍒剁殑swf鏂囦歡錛堝氨鍜孞AVA鏂囦歡琚紪璇戞垚class涓鏍鳳級錛屽啀浜ょ敱FP錛團P灝卞儚JVM铏氭嫙鏈轟竴鏍鳳級鏉ユ墽琛屻備笉鍚岀殑鏄紝FLASH鏇村亸鍚戜簬璁捐浜哄憳錛屽畠鏈夋椂闂磋醬鍜屽撫鐨勬蹇碉紝鑳芥洿濂藉湴瀹炵幇鍔ㄧ敾銆佺壒鏁堛佺煭鐗囩瓑緹庡伐鏁堟灉銆侳lex鏄潰鍚戝紑鍙戣呯殑錛岄殣钘忎簡鏃墮棿杞寸殑姒傚康錛堝彧鏈変袱甯э級錛屾洿涓撴敞浜庤В鍐充紒涓氬簲鐢ㄧ殑琛ㄧ幇灞傛柟妗堬紝鎻愪緵浜嗗ぇ閲忕殑閫氱敤緇勪歡鐢ㄤ簬鏋勫緩鍓嶇欏甸潰銆侀氳繃鏁版嵁鏈嶅姟鎶鏈兘鏇村ソ鐨勫垎紱葷晫闈㈠拰閫昏緫涓氬姟灞傘?/p>
浠?4騫?鏈圡M鎵嬩腑鐨凢lex1.0錛屽埌05騫?0鏈圓DOBE鎵嬩腑鐨凢lex2.0錛屽啀鍒?7騫?鏈堜即闅忕潃寮哄ぇ鐨勯潰鍚戝璞¤璦ActionScript3鍑虹幇鐨凢lex3.0,鍐嶅埌鏄庡勾鍒濆彂甯冪殑寮哄姏Flex4.0銆傚熺潃RIA鐨勬槬椋庯紝Flex鍦ㄤ笉鏂蛋鍚戞垚鐔熺殑鍚屾椂錛屼篃琚洿澶氱殑涓氱晫寮鍙戣呭拰浼佷笟鐢ㄦ埛鎵鍏蟲敞鎺ュ彈銆傚鏋滅湅鍒拌繖閲屼綘寰堟劅鍏磋叮錛屾帹鑽愬湪GOOGLE涓婃悳绱竴鎶婏紝鐜板湪涓嶆槸08騫翠簡錛岀綉涓婂凡緇忔秾鐜板嚭澶ч噺鐨勭畝鏄撴暀紼嬩緵鎴戜滑鍙傝冨涔犮傚綋鐒跺鏋滀綘鏈変簺闂查挶錛屾垨鏄兂緋葷粺鍦板涔犱竴涓嬶紝涔熷彲浠ヤ拱鍑犳湰涔︺傦紙鏈夋椂闂存垜浼氭暣鐞嗕簺緗戠珯鍗氬鍜屼功綾嶆帹鑽愮殑錛?/p>
鍦ㄦ湰鏂囩涓夐儴鍒嗕腑錛屾垜灝嗙粨鍚堥」鐩粡楠岃皥涓涓婩lex鐨勪紭緙虹偣鍜屼嬌鐢ㄥ績寰椼傛病鐢ㄨ繃Flex鐨勫彲鑳芥棤娉曞叡楦e惂錛岄偅灝辯洿鎺ヨ煩榪囦笉鐪嬩簡錛屽懙鍛?/p>
Flex鏄拫鍥炰簨涔嬩笁銆璋佺敤璋佺煡閬?/strong>
涓欏規妧鏈紝浠庢蹇墊彁鍑哄埌鎶鏈爺鍙戝埌鍟嗕笟鍙戝竷錛屽啀鍒板疄闄呭簲鐢紝鏈緇堝皢浜у搧鍛堢幇鍦ㄧ敤鎴烽潰鍓嶏紝榪欐槸涓涓極闀胯屽鏉傜殑榪囩▼銆傚湪榪欏綋涓紝寰堝鏈夊垱鎰忔湁鐢熷懡鍔涚殑鎶鏈洜涓哄悇縐嶅師鍥犲皬灝忛仐鎲懼湴涓嶅垢澶姌浜嗐侳lex鑳借蛋鍒頒粖澶╃‘瀹炰笉鏄擄紝涓嬮潰璁╂垜浠粠涓嶅悓鐨勮搴︽潵鐪嬩竴涓嬪畠鏄浣曡繃鍏蟲柀灝嗭紝璧㈠緱浼楀闈掔潗鐨勩?/p>
鎶鏈搴︼細
錛堬紤錛夊叿澶囦簡RIA鏃朵唬瀵屽鎴風鐨勪紭鐐癸紙C/S+B/S錛?/p>
錛堬紥錛夋敮鎸佸縐嶆湇鍔″櫒璇█錛圝AVA銆?NET銆丳HP錛夊強涓繪祦妗嗘灦錛圫pring銆丠ibernate錛?/p>
錛堬紦錛変笌Java緇撳悎鍚庣浉褰撳己澶э紝鑳藉厖鍒嗗埄鐢↗ava鐨勮祫婧愯儗鏅?/p>
錛堬紨錛夋嫢鏈変赴瀵岀殑緇勪歡鍜岀涓夋柟緇勪歡錛屽浼佷笟綰х殑鏁版嵁姹囨誨拰涓氬姟嫻佺▼灞曠幇鍔涜緝寮烘倣
錛堬紩錛夊熷姪寮婧愮殑鍔涢噺錛屾嫢鏈変紬澶氭皯闂寸粍緇囧拰鐗涗漢鏀寔
錛堬紪錛堿dobe鍏徃錛堣繕鏈塎M澶氬勾縐瘡錛夌殑寮哄ぇ鑳屾櫙
錛堬紬錛夋簮浜嶧lash鐨勫ぉ鐢熶附璐紝杞繪澗浣跨敤澶氬獟浣撹祫婧愶紝鍔ㄦ佷氦浜掓у己
錛堬紭錛夊熷姪FlashPlayer鐨勫畨瑁呮櫘鍙婂害錛岃交鏉懼疄鐜拌法嫻忚鍣ㄨ法騫沖彴
錛堬紮錛夎壇濂界殑鏋舵瀯璁捐鍜屽埗浣滅簿鑹殑鏂囨。紺轟緥錛堟槑騫碏LEX錛斿悓姝ユ帹鍑轟腑鏂囩増錛?/p>
錛堬紤錛愶級鍊熷姪浜庢彃浠朵赴瀵岀殑Eclipse寮鍙戝鉤鍙板茍鎷ユ湁鐙珛鐨処DE
錛堬紤錛戯級妗嗘灦璁捐閲嶇敤鎬ч珮錛屾湁鍒╀簬妯″潡鍖栬璁?/p>
錛堬紤錛掞級榪戝嚑騫村彂灞曟佸娍鑹ソ錛岃幏寰椾簡騫挎硾璁ゅ彲錛屼駭鍝佸拰鎶鏈篃瓚婂彂鎴愮啛
寮鍙戣呰搴︼細
錛堬紤錛夊紑婧愶紝閫忔槑錛堝浗浜烘病鏈変笉鍠滄寮婧愮殑錛屽搱鍝堬級
錛堬紥錛夊熀浜嶦clipse寮鍙戝鉤鍙幫紝鏄撲笂鎵嬶紝涓旀彃浠朵赴瀵岋紙宸ㄤ漢鐨勮偐鑶鍟妦錛?/p>
錛堬紦錛夊熀浜嶦clipse騫沖彴錛屽紑鍙戣皟璇曟柟渚?FB4涓殑鏉′歡鏂偣錛?/p>
錛堬紨錛堿ctionScript璇█涓嶫ava鐨勮瀺鍚堝害鍜岀浉浼煎害杈冮珮錛屾槗瀛︽槗鐢?/p>
錛堬紩錛塎XML鏍囩涓嶺ML鐩鎬技錛岄昏緫娓呮櫚鍙鎬у己
錛堬紪錛夋灦鏋勮璁¤壇濂斤紝鑰﹀悎搴︿綆錛屾湁鍒╀簬緇勪歡閲嶇敤
錛堬紬錛夋棤闇閽堝涓嶅悓嫻忚鍣ㄧ紪鍐欎唬鐮侊紝鎽嗚劚緙栧啓鍜岃皟璇曠殑鍣╂ⅵ錛堥拡瀵笿S璇寸殑錛?/p>
錛堬紭錛夌被浼糣B鐨勫彲瑙嗗寲鎷栨嫿緇勪歡錛屽揩閫熷垱寤虹晫闈?/p>
錛堬紮錛夋柟渚垮畾鍒跺強浣跨敤絎笁鏂圭殑鐨偆鍜屾牱寮忥紝鏃犻渶緹庡伐涔熸湁濂芥晥鏋?/p>
錛堬紤錛愶級鏀寔澶氬獟浣撹祫婧愶紝杞繪槗寮鍙戝姩鎬佷氦浜掓у己鐨勭晫闈?/p>
錛堬紤錛戯級浼楀鐨凴PC緇勪歡淇濋殰瀵瑰悗鍙版暟鎹闂殑瀹夊叏鎬у拰鏁堢巼
錛堬紤錛掞級鏂囨。紺轟緥涓板瘜錛岄氳繃緗戠粶鍙互鑾峰彇澶ч噺鐨勫涔犺祫婧?/p>
錛堬紤錛擄級榪戜袱騫村彂灞曟佸娍鑹ソ錛屽墠鏅厜鏄?/p>
浼佷笟瑙掑害錛?/p>
錛堬紤錛夊紑婧愶紝鍏嶈垂錛堝叾瀹炲緢澶氭椂鍊欒繕鏄洿鎺ョ敤鐮磋В鐨勩傘傘傦級
錛堬紥錛夊叿澶囦簡RIA鏃朵唬瀵屽鎴風鐨勪紭鐐癸紙C/S+B/S錛夛紙娼祦鍟妦錛侊級
錛堬紦錛夐」鐩拰緇勪歡鐨勯噸鐢ㄦч珮錛屾槗浜庤祫婧愮Н绱拰蹇熸瀯寤?/p>
錛堬紨錛塅lex鎻愪緵浜嗕笌鍏朵粬璇█鐨勭粨鍚堬紝鑳藉箍娉涘埄鐢ㄥ凡鏈夌殑璧勬簮
錛堬紩錛夌晫闈㈠崕涓斤紝瀹㈡埛璁ゅ彲搴﹂珮
錛堬紪錛夊涔犳洸綰夸竴鑸紝鍩硅鎴愭湰浣?/p>
鐢ㄦ埛瑙掑害錛?/p>
錛堬紤錛夐儴緗插拰鏇存柊鏂逛究
錛堬紥錛夌晫闈㈡紓浜紝浜や簰鎬у己
錛堬紦錛夊畨鍏?/p>
璇翠簡榪欎箞澶氬ソ璇濓紝鍐嶆潵緇煎悎璇翠竴涓嬬己鐐廣傞壌浜庢垜鐫榪蜂簬Flex鐨勫厜鐜晥搴旓紝娌℃湁鐪嬪埌鐨勭己鐐硅繕璇瘋浣嶅澶氭彁鍑恒?/p>
緙虹偣錛?/p>
錛堬紤錛変笉鎿呴暱澶勭悊澶嶆潅鐨勪笟鍔℃祦紼嬶紝涓昏榪樻槸閫傚悎灞曠幇錛團lex涓嶆槸涓囪兘鐨勶級
錛堬紥錛夌戶鎵夸簡Flash鐨勮澶氫紭鐐癸紝鍗村敮鐙涪鎺変簡Flash鐨勫皬宸ц交鐩堬紙鍑忚偉鏄案鎭掔殑璇濋錛?/p>
錛堬紦錛夌洰鍓嶅皻娌℃湁姣旇緝濂界殑鍑忚偉絳栫暐錛屽甫瀹借緝濂芥椂榪欎笉鏄棶棰橈紙涓嶆槸涓鑸殑鍗°傘傘傦級
錛堬紨錛夊鏈嶅姟鍣ㄥ拰瀹㈡埛绔殑紜歡璁懼閮芥湁涓瀹氳姹傦紙CPU鍜屽唴瀛樺崰鐢ㄥ緢鐢熺寷銆傘傘傦級
錛堬紩錛夎繍琛屾湡鍐呭瓨娉勯湶鐘跺喌涓ラ噸錛屽敖綆″彲浠ラ氳繃涓瀹氭墜孌墊敼鍠勶紙榪欎釜寰堝穿婧冿級
錛堬紪錛夊涓浜涜緝涓撲笟鐨勯鍩熸秹鍙婅緝灝戯紝闇瑕佺涓夋柟緇勪歡鏀寔錛堟瘮濡傚湴璐ㄦ柟闈㈢殑錛?/p>
錛堬紬錛堿dobe鍏徃瀵逛腑鍥藉垎閮ㄧ殑鏀寔涓嶅錛堟劅瑙夊璁插拰鏂囨。閮藉仛寰椾笉澶燂級
錛堬紭錛夋悳绱㈠紩鎿庡swf鏂囦歡鐨勬敮鎸佷笉澶燂紙Adobe涓鐩村湪鍔姏錛?/p>
錛堬紮錛変笌浠ュ線嫻忚涔犳儻涓嶅悓錛屾瘮濡傚彸閿灞忚斀錛屽浘鐗囨棤娉曚繚瀛橈紙鍙互鏀瑰杽錛?/p>
閴翠簬Flex鐢熸垚鐨剆wf鏂囦歡澶偉鏄叾涓昏緙虹偣錛堝姞杞芥參錛岃繍琛屾參錛屽唴瀛樺崰鐢ㄥ錛夛紝鎴戝氨涓昏浠庡噺鑲ュ拰浼樺寲鐨勮搴︽潵璇翠竴涓嬩嬌鐢ㄥ績寰椼?/p>
浣跨敤蹇冨緱錛?/p>
錛堬紤錛塅lex鍙槸鍓嶅彴灞曠幇錛岄渶瑕佹惌閰嶅己澶х殑鍚庡彴錛堟敞鎰忓墠鍚庡彴鐨勫潎琛″拰浼樺寲錛?/p>
錛堬紥錛夎冭檻寮傛鍔犺澆錛堟瘮濡傚垎姝ュ姞杞藉閮ㄨ祫婧愶級
錛堬紦錛夌晫闈㈡帹鑽愪嬌鐢ㄧ浉瀵瑰竷灞錛屽悎鐞嗙粍鍚堬紝閬垮厤澶氫綑宓屽
錛堬紨錛夌晫闈㈠姞杞藉浘鐗囨帹鑽愪嬌鐢ㄥ閮ㄥ姞杞芥柟寮忥紝灝藉彲鑳藉浣跨敤鐭㈤噺鍥懼艦
錛堬紩錛夎鑼僀SS鏍峰紡琛紝灝ゅ叾娉ㄦ剰浣跨敤鐨勫閮ㄥ瓧浣撳ぇ灝?/p>
錛堬紪錛変嬌鐢ㄩ澶栫殑鐨偆鍜岀壒鏁堟椂闇瑕佺患鍚堣冭檻鐢熸垚鐨勬枃浠跺ぇ灝忓拰鎵ц鏁堢巼
錛堬紬錛夐傚綋鍦拌冭檻寤舵椂鍔犺澆絳栫暐錛屼富鐣岄潰鍙樉紺哄繀瑕佺殑鍐呭
錛堬紭錛夎鑼冪紪鐮侊紝鎻愰珮鎵ц鏁堢巼錛岄伩鍏嶅唴瀛樻硠闇?/p>
錛堬紮錛変嬌鐢≧SL鍜孧odule鍜屽叾浠栨湁鏁堟柟寮忓姫鍔涘噺鑲?/p>
錛堬紤錛愶級灝藉彲鑳介噸鍐欎竴浜涚戶鎵垮簳灞傜被鐨勭粍浠訛紝鎵ц鏁堢巼鏇村ソ
錛堬紤錛戯級鎱庨噸浣跨敤閲嶉噺綰х粍浠訛紙姣斿DataGrid錛孉dvancedDataGrid錛?/p>
鍘熸枃鏉ヨ嚜錛氶洦鏋妧鏈暀紼嬬綉 http://www.fengfly.com
鍋氱綉緇滄ā鍧楃殑鏃跺欑粡甯鎬細閬囧埌鏈夊叧緗戝潃鐨勫鐞?涓鑸ぇ鑷寸殑鎯呭艦鏄?縐?
1.寰楀埌鐨勬槸鍩熷悕,濡?www.3322.org
2.寰楀埌鐨勬槸瀹為檯鐨処P鍦板潃,濡?61.160.235.203
3.寰楀埌鐨勬槸緇忚繃inet_addr澶勭悊榪囩殑IP,涓簎nsigned long(DWORD)
涓.閭d箞濡傛灉鏄粰鍑虹偣鍒嗗埗鐨処P瑕佽漿涓篋WORD鍨嬫槸濡備綍杞寲鍛?榪欎釜鍏跺疄鏈綆鍗?鏈変笓闂ㄧ殑鍑芥暟涓撻棬澶勭悊姝や簨
unsigned long dwIP = inet_addr("222.212.12.77"); printf("IP(%s)->DWORD(%lu)\n"); //output IP(222.212.12.77)->DWORD(1292686558)
浜?絎竴縐嶆儏鍐電殑閫嗚漿鍖?/p>
#include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> int main(int argc, char *argv[]) { struct in_addr net; char tmp[16] = {0}; if(argc != 3) { printf("You MUST enter 3 varibal.No.1:func name No.2:case.No.3:ip(string or DWORD)\n"); return 0; } if(strcmp("1", argv[1]) == 0) { char* ip_string; ip_string = argv[2]; unsigned long dword = inet_addr(ip_string); printf("IP(%s)-->DWORD(%lu)\n", ip_string, dword); } else if(strcmp("2", argv[1]) == 0) { net.s_addr = (unsigned long)atol(argv[2]); strcpy(tmp, inet_ntoa(net)); printf("DWORD(%s)-->IP(%s)\n",argv[2], tmp); } return 0; }
榪欓噷緇欏嚭涓涓偣鍒嗗埗IP鍜孌WORD鐩鎬簰杞寲鐨勭▼搴?/pre>涓?濡傛灉緇欏嚭鐨勬槸鍩熷悕鑰屾兂寰楀埌鐐瑰垎鍒剁殑IP鍛?榪欓噷緇欏嚭涓涓帴鍙?鏀寔杈撳叆鐨勭被鍨嬫槸鐐瑰垎鍒跺拰鍩熷悕2涓被鍨?榪斿洖鐨勬槸DWORD鍨嬬殑IP鏈変竴鐐硅澹版槑鐨勬槸gethostbyname榪欎釜鍑芥暟蹇呴』鍦ㄧ綉緇滆繛閫氱殑鎯呭喌涓嬫墠鑳芥紜畬鎴愬煙鍚嶇殑瑙f瀽,浣犳兂,榪炰釜緗戦兘涓嶉?瀹冩庝箞瑙f瀽?#include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> #define DWORD unsigned long DWORD platform_domain2ip(const char *szDomain, char *szDotNumIP) { char szAddr[32] = {0}; struct hostent *pHost; printf("input domain name(%s)\n", szDomain); if((pHost = gethostbyname(szDomain)) == NULL) { printf("can not parse domain\n"); return -1; } printf("HostName :%s\n",pHost->h_name); strcpy(szAddr, inet_ntoa(*((struct in_addr *)pHost->h_addr))); printf("IP Address :%s\n", szAddr); strcpy(szDotNumIP, szAddr); return inet_addr(szAddr); } int main(int argc, char *argv[]) { DWORD dwip; char *ip = malloc(32); //dwip = platform_domain2ip("www.3322.org", ip); dwip = platform_domain2ip("61.160.235.203", ip); printf("ip 1 (%s) 2 dw(%lu)\n", ip, dwip); return 0; }//鍙互灝唌ain鐨勬敞鍐屽垎鍒墦寮鏉ュ垽鏂笅緇撴灉鏄惁姝g‘,榪欓噷緇欏嚭榪愯鐨勭粨鏋?鏈夊浘鏈夌湡鐩?/pre>緙栬瘧鐨勫懡浠ゅ啀璇翠笅鍚?鎬曟湁浜轟笉鐭ラ亾gcc gethost.c –Wall –o gethost//鍦╨inux涓?/pre>arm-hismall-linux-gcc gethost.c –Wall –o gethost//宓屽叆寮忕幆澧冧笅姝ゆ帴鍙e凡緇忓湪鎴戠殑宸ョ▼涓嬌鐢?鍦ㄥ鉤鍙癐P鐨勮В鏋愬拰3322鐨勮В鏋愪腑寰楀埌浜嗗簲鐢?鎵浠ユ槸紼沖畾鍙鐨?榪?涓璉P鐨勮漿鍖栭兘浜嗚В浜嗙殑璇?閭d箞緗戠粶緙栫▼涓嶅氨鎵櫎浜嗕竴涓ぇ鐭沖ご鍚?鍛靛懙,澶у鍔熻兘榪涙緗戜笂姣旇緝嫻佽鐨刧ethostbyname鐨勪緥瀛愬涓?鍙楀埌浜嗗惎鍙?/pre>#include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <string.h> int main(int argc, char **argv) { char *ptr,**pptr; struct hostent *hptr; char str[32]; /* 鍙栧緱鍛戒護鍚庣涓涓弬鏁幫紝鍗寵瑙f瀽鐨勫煙鍚嶆垨涓繪満鍚?*/ ptr = argv[1]; /* 璋冪敤gethostbyname()銆傝皟鐢ㄧ粨鏋滈兘瀛樺湪hptr涓?*/ if((hptr = gethostbyname(ptr)) == NULL) { printf("gethostbyname error for host:%s\n", ptr); return 1; /* 濡傛灉璋冪敤gethostbyname鍙戠敓閿欒錛岃繑鍥? */ } printf("official hostname:%s\n",hptr->h_name); /* 涓繪満鍙兘鏈夊涓埆鍚嶏紝灝嗘墍鏈夊埆鍚嶅垎鍒墦鍑烘潵 */ for(pptr = hptr->h_aliases; *pptr != NULL; pptr++) printf(" alias:%s\n",*pptr); /* 鏍規嵁鍦板潃綾誨瀷錛屽皢鍦板潃鎵撳嚭鏉?*/ switch(hptr->h_addrtype) { case AF_INET: case AF_INET6: pptr=hptr->h_addr_list; /* 灝嗗垰鎵嶅緱鍒扮殑鎵鏈夊湴鍧閮芥墦鍑烘潵銆傚叾涓皟鐢ㄤ簡inet_ntop()鍑芥暟*/ for(;*pptr!=NULL;pptr++) printf(" address:%s\n", inet_ntop(hptr->h_addrtype,*pptr, str, sizeof(str))); break; default: printf("unknown address type\n"); break; } return 0; }
瀛︿範Unix甯哥敤鐨勫懡浠?ls,ll,cd,su,mkdir,cp,mv,rm -rf,Vim鎿嶄綔錛屽畨瑁匔Tags錛孴List鎻掍歡銆?/p>
瀛︿範MakeFile鏂囦歡銆?/p>
鐗瑰埆娉ㄦ剰褰撳墠紼嬪簭闇瑕佸摢浜?h鏂囦歡錛屽摢浜沴ib鏂囦歡銆傞渶瑕佺紪璇戞垚浠涔堟枃浠躲傛敞鎰忕紪璇戠殑璺緞灝卞ソ浜嗐?/p>
Svn鎿嶄綔銆備笂浼狅紝涓嬭澆錛屾洿鏂般?/p>
涓昏鏄痵vn co錛屼笅杞?/p>
svn add 娣誨姞鏂囦歡鎴栬呮枃浠跺す
|
|
svn info 鏌ョ湅淇℃伅
svn ci 鎻愪氦淇敼
svn up 涓嬭澆淇℃伅銆?/p>
SecureCRT錛宲utty銆?/p>
lcd 鍙樻洿鏈湴璺緞銆俻ut 涓婁紶錛実et 涓嬭澆銆?/p>
shell鑴氭湰錛宻ed錛宲ython
鐩墠鎴戝叕鍙稿紑鍙戠殑Nexus Engine鐨勫簳灞傚璞″簭鍒楀寲浣跨敤浜員inyXML鏉ヨ鍐橷ML鏂囦歡銆俆inyXML鏈変袱涓笉鐖界殑鍦版柟錛屼竴鏄畠鐨勬帴鍙d嬌鐢‵ILE*錛屽彟澶栦竴涓槸瀹冨 wchar_t涓嶈兘寰堝ソ鐨勬敮鎸併傚墠闃靛瓙鐪婤oost搴撶殑鏇存柊涓浜嗕竴涓狿ropertyTree錛屼粬鍦ㄥ鐞哫ML鏃剁敤鍒頒簡鍙﹀涓涓皬鐨勫簱 –RapidXML銆傛棦鐒墮棿鎺ョ殑鏄疊oost搴撶殑涓閮ㄥ垎錛屾墍浠ユ槸鍊煎緱涓璇曠殑銆備簬鏄壘鍒板叾瀹樻柟緗戠珯錛?a title=http://rapidxml.sourceforge.net/ target=_blank>http://rapidxml.sourceforge.net/錛夌爺絀朵簡涓鐣備竴鐪嬩箣涓嬶紝鐢氭槸婊℃剰錛屼篃鎺ㄨ崘緇欏ぇ瀹剁湅鐪嬶紒
棣栧厛灝辨槸閫熷害錛屾嵁瀹冭嚜宸卞縐版瘮TinyXML蹇?0鍒?0鍊嶏紝姣擷erces DOM蹇?0鍒?00鍊嶏紒璇︾粏鐨勬祴璇曟瘮杈冭瑙佸叾鐢ㄦ埛鎵嬪唽錛?a title=http://rapidxml.sourceforge.net/manual.html target=_blank>http://rapidxml.sourceforge.net/manual.html錛夌殑“4. Performance ”涓鑺傘?/p>
鍏舵瀹冪殑璁捐闈炲父鐨勭畝媧侊紝鍙緷璧栦簬鏍囧噯搴撲腑鐨勫嚑涓熀鏈殑綾匯傚畠鐨勮緭鍏ヨ緭鍑洪兘鏄瓧絎︿覆錛岃繖鏍峰緢濂斤紝涓涓簱灝卞簲璇ュ叧娉ㄨ嚜宸辨牳蹇冪殑鍐呭錛屽仛灝介噺灝戠殑浜嬫儏銆傚畠鐨凙PI鍏跺疄鍜孴inyXML鍊掓槸鏈夊嚑鍒嗙浉浼鹼紝鐢ㄨ繃TinyXML鐨勪漢搴旇寰堝鏄撲笂鎵嬶細
TinyXML涓昏鎺ュ彛綾? RapidXML鐨勪富瑕佹帴鍙g被
| TinyXML涓昏鎺ュ彛綾?/strong> | RapidXML鐨勪富瑕佹帴鍙g被 |
| class TiXmlDocument | template<class Ch = char> class xml_document |
| class TiXmlNode | template<class Ch = char> class xml_node |
| class TiXmlAttribute | template<class Ch = char> class xml_attribute |
涓嬮潰榪樻槸鐪嬩竴涓叿浣撶殑渚嬪瓙鏉ヤ綋楠屼竴涓嬶紝涓嬮潰鏄疶inyXML瀹樻柟鏁欑▼涓垱寤篨ML鏂囨。鐨勪竴孌典唬鐮侊細
void build_simple_doc( )
{
// Make xml: <?xml ..><Hello>World</Hello>
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration( “1.0″, “”, “” );
TiXmlElement * element = new TiXmlElement( “Hello” );
TiXmlText * text = new TiXmlText( “World” );
element->LinkEndChild( text );
doc.LinkEndChild( decl );
doc.LinkEndChild( element );
doc.SaveFile( “madeByHand.xml” );
}
涓嬮潰鏄嬌鐢≧apidXML瀹炵幇綾諱技鍔熻兘鐨勪唬鐮侊細
void build_simple_doc_by_rapidxml()
{
xml_document<> doc;
xml_node<>* decl = doc.allocate_node(node_declaration);
xml_attribute<>* decl_ver =
doc.allocate_attribute(“version”, “1.0″);
decl->append_attribute(decl_ver);
doc.append_node(decl);xml_node<>* node =
doc.allocate_node(node_element, “Hello”, “World”);
doc.append_node(node);string text;
rapidxml::print(std::back_inserter(text), doc, 0);// write text to file by yourself
}
涓嬮潰鏄嬌鐢≧apidXML鍒嗘瀽XML鐨勬牱渚嬩唬鐮侊細
void parse_doc_by_rapidxml(char* xml_doc)
{
xml_document<> doc; // character type defaults to char
doc.parse<0>(xml_doc); // 0 means default parse flagsxml_node<> *node = doc.first_node(“Hello”);
string node_val = node->value();
}
鍓嶄袱澶╂湁鏈嬪弸闂紝鎴戠殑SlimXml鏈夋病鏈夊拰RapidXml瀵規瘮榪囨晥鐜囷紵鎴戞槸絎竴嬈″惉璇磋繖涓簱錛屾洿涓嶇敤璇村姣旀晥鐜囦簡錛屼簬鏄笂浠栦滑緗戠珯鐪嬩簡涓嬨?/p>
濂藉浼欙紝灞呯劧鍙風О姣?a target=_blank>TinyXml蹇?0锝?0鍊嶏紝鑰屼笖鏄?a >Boost.PropertyTree鐨勯粯璁ml瑙f瀽鍣ㄣ?/p>
浜庢槸鏈夌偣濂藉錛屽洜涓轟互鍓嶄篃娌℃湁鐗瑰埆鍏沖績榪嘢limXml鐨勬晥鐜囥?/p>
浜庢槸鍒嗗埆涓嬭澆浜員inyXml-2.6.1鍜孯apidXml-1.13錛岃繀閫熺敤vc8寤虹珛浜嗕袱涓祴璇曞伐紼嬶紝鍦ㄧ郴緇熶腑鎼?#8221;*.xml”錛屾壘鍒頒簡涓涓瘮杈冨悎閫傜殑嫻嬭瘯鏂囦歡銆傚畠瓚沖澶э紙1.5M錛夛紝utf-8緙栫爜騫朵笖鍖呭惈涓?鑻辨枃錛屾湁涓瀹氬眰嬈℃繁搴︼紝澶х害3.3涓囪銆傛祴璇曟枃浠跺彲浠?a target=_blank>浠庤繖閲屼笅杞?/span>
嫻嬭瘯瀵硅薄鏄笁涓簱浠庡唴瀛樺瓧絎︿覆瑙f瀽xml鐨勫嚱鏁幫紝榪欐牱鑳芥帓闄や粠紜洏涓婅鏂囦歡榪欑涓嶇ǔ瀹氬洜绱犵殑騫叉壈錛岃屼笖RapidXml璨屼技鍙敮鎸佷粠鍐呭瓨閲岃В鏋?/p>
瑕佽鏄庣殑鏄紝RapidXml鐨勮繖涓猵arse鏄竴涓ā鏉垮嚱鏁幫紝蹇呴』緇欎竴涓猣lag鐨勫弬鏁幫紝鎴戞祴璇曠殑鏃跺欑粰鐨勬槸榛樿鐨?
嫻嬭瘯緇撴灉錛岃В鏋愯繖涓?.3涓囪錛?.5M澶у皬鐨剎ml錛屼笁涓簱鍒嗗埆鑺變簡
緇撹鏄紝RapidXml鏋滅劧寰堝己鎮嶏紝灞呯劧姣旀垜鐨凷limXml蹇?鍊嶅銆備絾鏄茍娌℃湁濡備綔鑰呮墍璇存瘮TinyXml蹇?0~60鍊嶏紝鍙湁涓嶅埌15鍊嶃傛嵁璇村姣旂敤鐨勬槸涓涓害50k澶у皬鐨剎ml鏂囦歡錛屽彲鎯滃茍娌℃湁鎻愪緵涓嬭澆錛屼笉鐒跺彲浠ラ獙璇佷竴涓嬨?/p>
姣旇緝嬈f叞鐨勬槸錛屽湪鎴戝茍娌℃湁寰堝叧娉ㄦ晥鐜囩殑鎯呭喌涓嬶紝SlimXml浠嶇劧姣擳inyXml蹇?.5鍊嶃係limXml璧扮殑鏄畝鍗曞皬宸ц礬綰匡紝婧愪唬鐮佸彧鏈?2k錛岃孴inyXml鍜孯apidXml鐨勬簮鐮佸垎鍒槸147k鍜?41k錛屾湁榪欐牱鐨勬晥鐜囧彲浠ユ弧鎰忎簡銆傚湪鎴戞湁寰堝絀洪棽浠ュ墠錛屼及璁℃垜涔熶笉浼氬啀鍘諱紭鍖栧畠錛屽洜涓鴻繖涓簱涓昏榪樻槸閽堝鍑犲崄涓婄櫨琛岀殑灝忔枃浠訛紝瑙f瀽鐗瑰埆澶х殑xml涓嶅湪鎴戣冭檻鐨勮寖鍥翠箣鍐呫?/p>
浠ヤ笅鏄疪apidXml鎻愪緵鐨勫父瑙亁ml搴撴晥鐜囧鐓ц〃錛屽叾涓繕寰堢墰榧誨湴鎻愪緵浜嗗拰strlen()鍑芥暟鐨勬晥鐜囧姣?/p>
鎴戜及璁apidXml閫熷害蹇殑涓昏鍘熷洜鏄memory pool鐨勪嬌鐢紝姣曠珶鍦ㄨВ鏋愯繃紼嬩腑闇瑕佸垱寤哄ぇ閲忕殑string錛屽彲浠ユ兂璞$敤memory pool鍜岀洿鎺ヨ蛋榛樿鐨刵ew寰堝鏄撲駭鐢熻秴榪囦竴涓暟閲忕駭鐨勬晥鐜囧樊寮傘?/p>
| 鎺у埗璇彞 | 鏍煎紡 | 紺轟緥 |
| If | if 鏉′歡 then ... elseif 鏉′歡 then ... else ... end |
if 1+1=2 then print("true")
elseif 1+2~=3 then print("true") else print("false") end |
| While | while 鏉′歡 do ... end |
while 1+1~=2 do print("true") end
|
| Repeat | repeat ... until 鏉′歡 |
repeat print("Hello") until 1+1~=2
|
| For | for 鍙橀噺=鍒濆? 緇堢偣鍊? 姝ヨ繘 do ... end |
for i = 1, 10, 2 do print(i) end
|
| For | for 鍙橀噺1, 鍙橀噺2, ... 鍙橀噺n in 琛ㄦ垨鏋氫婦鍑芥暟 do ... end |
for a,b in mylist do print(a, b) end
|
| 姣旇緝絎﹀彿 | < | > | <= | >= | == | ~= |
| 鍚箟 | 灝忎簬 | 澶т簬 | 灝忎簬鎴栫瓑浜?/td> | 澶т簬鎴栫瓑浜?/td> | 鐩哥瓑 | 涓嶇浉絳?/td> |
銆銆銆銆a={1,2}
銆銆銆銆b=a
銆銆銆銆print(a==b, a~=b) --杈撳嚭 true, false
銆銆銆銆a={1,2}
銆銆銆銆b={1,2}
銆銆銆銆print(a==b, a~=b) --杈撳嚭 false, true
銆銆銆銆 print(4 and 5) --杈撳嚭 5
銆銆銆銆 print(nil and 13) --杈撳嚭 nil
銆銆銆銆 print(false and 13) --杈撳嚭 false
銆銆銆銆 print(4 or 5) --杈撳嚭 4
銆銆銆銆 print(false or 5) --杈撳嚭 5
| or and < > <= >= ~= == .. (瀛楃涓茶繛鎺? + - * / % not #(lua5.1 鍙栭暱搴﹁繍綆?/span>) - (涓鍏冭繍綆? ^ |
| and | break | do | else | elseif | |
| end | false | for | function | if | |
| in | local | nil | not | or | |
| repeat | return | then | true | until | while |
| Nil | 絀哄鹼紝鎵鏈夋病鏈変嬌鐢ㄨ繃鐨勫彉閲忥紝閮芥槸nil銆俷il鏃㈡槸鍊鹼紝鍙堟槸綾誨瀷銆?/td> |
| Boolean | 甯冨皵鍊鹼紝鍙湁涓や釜鏈夋晥鍊鹼細true鍜宖alse |
| Number | 鏁板鹼紝鍦↙ua閲岋紝鏁板肩浉褰撲簬C璇█鐨刣ouble |
| String | 瀛楃涓詫紝濡傛灉浣犳効鎰忕殑璇濓紝瀛楃涓叉槸鍙互鍖呭惈"\0"瀛楃鐨勶紙榪欏拰C璇█鎬繪槸浠?\0"緇撳熬鏄笉涓鏍風殑錛?/td> |
| Table | 鍏崇郴琛ㄧ被鍨嬶紝榪欎釜綾誨瀷鍔熻兘姣旇緝寮哄ぇ錛岃鍙傝冨悗闈㈢殑鍐呭銆?/td> |
| Function | 鍑芥暟綾誨瀷錛屼笉瑕佹鐤戯紝鍑芥暟涔熸槸涓縐嶇被鍨嬶紝涔熷氨鏄錛屾墍鏈夌殑鍑芥暟錛屽畠鏈韓灝辨槸涓涓彉閲忋?/td> |
| Userdata | 鍡紝榪欎釜綾誨瀷涓撻棬鐢ㄦ潵鍜孡ua鐨勫涓繪墦浜ら亾鐨勩傚涓婚氬父鏄敤C鍜孋++鏉ョ紪鍐欑殑錛屽湪榪欑鎯呭喌涓嬶紝Userdata鍙互鏄涓葷殑浠繪剰鏁版嵁綾誨瀷錛屽父鐢ㄧ殑鏈塖truct鍜屾寚閽堛?/td> |
| Thread | 綰跨▼綾誨瀷錛屽湪Lua涓病鏈夌湡姝g殑綰跨▼銆侺ua涓彲浠ュ皢涓涓嚱鏁板垎鎴愬嚑閮ㄤ喚榪愯銆?/span>濡傛灉鎰熷叴瓚g殑璇濓紝鍙互鍘葷湅鐪婰ua鐨勬枃妗c?br>鐜板湪鍥炶繃澶存潵鐪嬬湅錛屽掕寰椾笉鏄嚎紼嬬被鍨嬨傚弽鑰岃薄鏄敤鏉ュ仛閬嶅巻鐨勶紝璞℃槸Iterator鍑芥暟銆?br>濡傦細 function range(n)
鍙儨鐨勬槸瑕佺戶緇繍琛岋紝闇瑕乧oroutine.resume鍑芥暟錛屾湁鐐歸浮鑲嬨傝鎸囨暀銆?br>local i = 0 while(i < n) do coroutine.yield( i ) i = i + 1 end end |
銆銆銆銆var1=nil -- 璇鋒敞鎰?nbsp;nil 涓瀹氳灝忓啓
銆銆銆銆theBoolean = true
a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]
a = [==[
alo
123"]==]
銆銆銆銆T1 = {} -- 瀹氫箟涓涓┖琛?/span>
銆銆銆銆T1[1]=10 -- 鐒跺悗鎴戜滑灝卞彲浠ヨ薄C璇█涓鏍鋒潵浣跨敤瀹冧簡銆?/span>
銆銆銆銆T1["John"]={Age=27, Gender="Male"}
銆銆銆銆榪欎竴鍙ョ浉褰撲簬錛?br>
銆銆銆銆T1["John"]={} -- 蹇呴』鍏堝畾涔夋垚涓涓〃錛岃繕璁板緱鏈畾涔夌殑鍙橀噺鏄痭il綾誨瀷鍚?/span>
銆銆銆銆T1["John"]["Age"]=27
銆銆銆銆T1["John"]["Gender"]="Male"
銆銆銆銆褰撹〃鐨勭儲寮曟槸瀛楃涓茬殑鏃跺欙紝鎴戜滑鍙互綆鍐欐垚錛?br>
銆銆銆銆T1.John={}
銆銆銆銆T1.John.Age=27
銆銆銆銆T1.John.Gender="Male"
銆銆銆銆鎴?br>
銆銆銆銆T1.John{Age=27, Gender="Male"}
銆銆銆銆T1=
銆銆銆銆{
銆銆銆銆銆銆10, -- 鐩稿綋浜?nbsp;[1] = 10
銆銆銆銆銆銆[100] = 40,
銆銆銆銆銆銆John= -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"John"] =
銆銆銆銆銆銆{
銆銆銆銆銆銆銆銆Age=27, -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"Age"] =27
銆銆銆銆銆銆銆銆Gender=Male -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"Gender"] =Male
銆銆銆銆銆銆},
銆銆銆銆銆銆20 -- 鐩稿綋浜?nbsp;[2] = 20
銆銆銆銆}
銆銆銆銆function add(a,b) -- add 鏄嚱鏁板悕瀛楋紝a鍜宐鏄弬鏁板悕瀛?/span>
銆銆銆銆 return a+b -- return 鐢ㄦ潵榪斿洖鍑芥暟鐨勮繍琛岀粨鏋?/span>
銆銆銆銆end
銆銆銆銆add = function (a,b) return a+b end
銆銆銆銆function sum (a,b,
)
銆銆銆銆function s()
銆銆銆銆銆銆return 1,2,3,4
銆銆銆銆end
銆銆銆銆a,b,c,d = s() -- 姝ゆ椂錛宎 = 1, b = 2, c = 3, d = 4
銆銆銆銆t =
銆銆銆銆{
銆銆銆銆 Age = 27
銆銆銆銆 add = function(self, n) self.Age = self.Age+n end
銆銆銆銆}
銆銆銆銆print(t.Age) -- 27
銆銆銆銆t.add(t, 10)
銆銆銆銆print(t.Age) -- 37
銆銆銆銆t:add(10) -- 鐩稿綋浜?nbsp;t.add(t,10)
棣栧腑鎵ц瀹樸怌EO銆?/strong>
緹庡浗浜哄湪20涓栫邯60騫翠唬榪涜鍏徃娌葷悊緇撴瀯鏀歸潻鍒涙柊鏃剁殑浜х墿銆佸畠鐨勫嚭鐜板湪鏌愮鎰忎箟涓婁唬琛ㄧ潃灝嗗師鏉ヨ懀浜嬩細鎵嬩腑涓浜涘喅絳栨潈榪囨浮鍒扮粡钀ュ眰鎵嬩腑銆丆EO姒傚康鏈鏃╁嚭鐜板湪涓浜涚綉緇滀紒涓氥傚湪閭i噷CEO寰寰鏄嚜灝佺殑銆佷篃寰堝皯鏈変漢鍘葷爺絀惰繖涓縐拌皳瀵逛紒涓氬埌搴曟剰鍛崇潃浠涔堛備絾鏄紝褰?#8220;CEO”鍦ㄤ腑鍥藉彨寰楄秺鏉ヨ秺鍝嶆椂鍊欍侀珮灞備漢鍛樼О璋撴敼鍙樹笉鏄竴浠跺皬浜嬨佽绔婥EO鑱屼綅涓嶄粎浠呮槸瀵規椂灝氳拷璧躲備簨瀹炰笂錛孋EO鍋氱殑浜嬫儏閲嶇偣鍦ㄤ簬“鎵ц”銆傚ぇ澶氭暟涓浗鍏徃寰寰CEO鍋氱殑浜嬫儏鎭版伆涓嶆槸“鎵ц”錛屾洿鍍忔槸“钁d簨闀?#8221;銆?/p>
棣栧腑璐㈡斂瀹樻垨璐㈠姟鎬葷洃銆怌FO銆?/strong>
鐜頒唬鍏徃涓渶閲嶈銆佹渶鏈変環鍊奸《灝栫鐞嗚亴浣嶄箣涓銆佹帉鎻$潃浼佷笟紲炵粡緋葷粺(璐㈠姟淇℃伅)鍜岃娑茬郴緇?鐜伴噾璧勬簮)鐏甸瓊浜虹墿銆傚仛涓鍚嶆垚鍔烠FO闇瑕佸叿澶囦赴瀵岄噾铻嶇悊璁虹煡璇嗗拰瀹炲姟緇忛獙銆傚叕鍙哥悊璐笌閲戣瀺甯傚満浜や簰銆侀」鐩及浠楓侀闄╃鐞嗐佷駭鍝佺爺鍙戙佹垬鐣ヨ鍒掋佷紒涓氭牳蹇冪珵浜夊姏璇嗗埆涓庡緩绔嬪強媧炴倝淇℃伅鎶鏈強鐢靛瓙鍟嗗姟瀵逛紒涓氬啿鍑葷瓑閮芥槸CFO鑱岃矗鑼冨洿鍐呬簨銆傚ぇ鍨嬪叕鍙歌繍浣滀腑CFO鏄┛鎻掑湪閲戣瀺甯傚満鎿嶄綔鍜屽叕鍙稿唴閮ㄨ儲鍔$鐞嗕箣闂磋鑹層傛媴褰揅FO浜烘墠澶у鏄嫢鏈夊騫村湪閲戣瀺甯傚満椹伴獘緇忛獙鐨勪漢銆傚湪緹庡浗浼樼鐨凜FO甯稿父鍦ㄥ崕灝旇鍋氳繃鎴愬姛鍩洪噾緇忕悊浜恒?/p>
棣栧腑钀ヨ繍瀹樸怌OO銆?/strong>
璐熻矗鍏徃鏃ュ父钀ヨ繍銆佽緟鍔〤EO宸ヤ綔銆備竴鑸潵璁睠OO璐熻矗鍏徃鑱岃兘綆$悊緇勭粐浣撶郴寤鴻銆佸茍浠h〃CEO澶勭悊浼佷笟鏃ュ父鑱岃兘浜嬪姟銆傚鍏徃鏈鏈夋昏鑱屽姟鍒機OO榪樿鎵挎媴鏁翠綋涓氬姟綆$悊鑱岃兘銆佷富綆′紒涓氳惀閿涓庣患鍚堜笟鍔℃嫇灞曘佽礋璐e緩绔嬪叕鍙告暣涓攢鍞瓥鐣ヤ笌鏀跨瓥銆佺粍緇囩敓浜х粡钀ャ佸崗鍔〤EO鍒跺畾鍏徃涓氬姟鍙戝睍璁″垝銆佸鍏徃緇忚惀緇╂晥榪涜鑰冩牳銆備篃鏈夋妸榪愯惀鎬葷洃縐板懠涓篊OO鐨勩?/p>
棣栧腑甯傚満瀹樸怌MO銆?/strong>
鎸囧競鍦烘葷洃
棣栧腑鎶鏈畼銆怌TO銆?/strong>
鎶鏈葷洃
閿鍞葷洃銆怌SO銆?/strong>
娓犻亾閿鍞葷洃
鍏叧鎬葷洃銆怌PO銆?/strong>
鏀垮簻浜嬪姟銆佸獟浣撱侀噸瑕佸叕鍙鎬笌浜虹墿鍏叡鍏崇郴錛屼富瑕佹槸鎼炲畾浜恒?/p>
棣栧腑淇℃伅瀹樸怌IO銆?/strong>
澶у鏁板叕鍙告妸榪欎釜鑱屼綅鍙樻垚浜嗙洴浜虹洴紲紝鏈夌偣璞℃槑鏈濇椂鍊欑殑“涓滃巶”錛屾墍浠ヨ涓浗鏄釜寰堢濂囩殑鍥藉銆?/p>
浜轟簨鎬葷洃 銆怌HO銆?/p>
棣栧腑鍝佺墝瀹樸怌BO銆?/p>
棣栧腑鏂囧寲瀹樸怌CO銆?/p>
棣栧腑鐭ヨ瘑瀹樸怌KO銆?/p>
棣栧腑璋堝垽瀹樸怌NO銆?/p>
璐ㄩ噺鎬葷洃銆怌QO銆?/p>
璇勪及鎬葷洃銆怌VO銆?/p>
涓撻棬璐熻矗瑙g瓟濯掍綋銆佸烘潈浜哄拰鐢ㄦ埛絳夋湁鍏抽棶棰樿闂?/p>
棣栧腑璐㈠姟瀹樺姪鐞嗕箣涓銆佷笓闂ㄩ拡瀵逛笉鍚屾姇璧勪漢鍒惰鐩稿簲BP銆?/p>
鍑¤秴榪嘪XXX鍏冧互涓婃敮鍑哄繀欏葷敱CC0鎵瑰噯銆?/p>
璐熻矗鍏徃鍩熷悕娉ㄥ唽銆佺綉绔欐竻鐩樻椂鍩熷悕鎷嶅崠銆佸煙鍚嶆硶寰嬬籂綰風瓑鐩稿叧闂銆?/p>
涓鑸敱鍥介檯CEO鑷敱鑱旂洘闅忔椂鏇存崲銆佸父璁劇煭鏈熻亴鑳藉矖浣嶃佺被浼艱凍鐞冩暀緇冦?/p>
瑙勫垝鍏徃瀹忎紵钃濆浘銆佷竴鑸槸5騫翠互鍚庣洰鏍囥?/p>
璋冭В鎶曡祫鑰呭拰緇忚惀鑰呬箣闂寸殑鍐茬獊銆佺‘淇濆叕鍙稿唴閮ㄧ煕鐩句笉瑕佹硠闇層?/p>
媯鏌ュ叕鍙稿唴閮ㄥ伐浣滅姸鍐點佺洃鐫e憳宸ュ伐浣滄佸害銆?/p>
瑙e喅鍐呴儴鍔寵祫綰犵悍銆佸寘鎷憳宸ュ闄嶈柂銆佽緸閫琛ュ伩絳夋墍寮曡搗闂銆?/p>
鏈綣佸繖鐨勫矖浣嶄箣涓銆佸綋涓浗鐢典俊緗戠粶榪炴帴涓柇鏃跺強鏃跺悜鍛樺伐閫氭姤銆?/p>
璐熻矗鍏徃琚帶渚墊潈鏃跺簲璇変互鍙婂悇縐嶅悎鍚屾枃鏈鏍搞備富瑕佹槸鐏漢鐨勬墦鎵嬨?/p>
淇濇寔鍜屽獟浣撲箣闂村弸濂藉叧[鏉ユ簮錛欸ameRes.com]緋諱負鍏徃闅忔椂鍙戝竷鏂伴椈鍋氬噯澶囷紝綾諱技棣栧腑浠h〃銆?/p>
鍚戝獟浣撴姭闇插叕鍙歌榛戙佽鍛樸佽鏀惰喘絳夐噸澶ф柊闂匯備竴鑸敱鍏徃甯傚満鎬葷洃鎷呬換錛岀被浼兼斂搴滈儴闂ㄦ柊闂誨彂璦浜猴紝涓昏鐢卞徃闀跨駭閮ㄩ棬棰嗗鎷呬換錛屽叕鍙稿0闊崇殑緇熶竴鍑哄彛銆?/p>
璐熻矗鍏徃鍐呴儴鍛樺伐Email銆両CQ銆丱ICQ絳夐氫俊鍐呭鐩戞帶銆?/p>
璐熻矗娉ㄥ唽鐢ㄦ埛鏁伴噺銆侀〉闈㈡祻瑙堛佽惀涓氭敹鍏ョ瓑鎸囨爣緙栭犮?/p>
璐熻矗涓庤鍛樻湁鍏充簨鍔°佺洿鎺ュ悜鑲′笢澶т細璐熻矗銆佸寘鎷懀浜嬮暱鍦ㄥ唴閮戒笉寰楀共棰勫伐浣溿?/p>
鐢卞凡緇忛浣嶅叕鍙鎬富瑕佸垱寤轟漢鎷呬換錛屽湪鏀垮簻鏈哄叧涓鑸О涓鴻皟鐮斿憳鎴栭【闂?/p>
浠ユ垬鐣ヨ仈鐩熷悕涔変笓闂ㄥ鎵炬湁鏀惰喘鑷繁鎰忓悜鐨勫叕鍙搞?/p>
棣栧腑璐㈠姟瀹樺彟涓閲嶈鍔╃悊銆?/p>
璐熻矗灝嗗皬浜嬫墿澶у寲銆侀氳繃鐐掍綔杈懼埌鎵╁ぇ鍏徃鍚嶅害鐩殑錛屽盡鐢ㄦ枃浜猴紝姣斿緇欓檲澶╂ˉ錛屽彶鐜夋煴緙栨晠浜嬶紝閫犵銆?/p>
錛堜腑鍥界壒鏈夛級涓鑸敱瀛﹀巻涓嶉珮涓旀病鏈変粈涔堢綉緇滅煡璇嗙殑騫磋交浜烘媴浠匯?/p>
鑽h獕縐板彿鎺堜簣鍦ㄥ叕鍙稿伐浣滄弧X騫村憳宸ワ紙閫氬父絀虹己錛夈?br>
寮鍙戞葷洃銆怌DO銆?/p>
棣栧腑鍙戣█浜恒怌AO銆?/strong>
棣栧腑鍟嗕笟璁″垝瀹樸怌BO銆?/strong>
棣栧腑鎴愭湰鎺у埗瀹樸怌CO銆?/strong>
棣栧腑鍩熷悕瀹樸怌DO銆?/strong>
棣栧腑浜ゆ崲瀹樸怌EO銆?/strong>
棣栧腑鏂歸拡鍒惰瀹樸怌GO銆?/strong>
棣栧腑鍗忚皟瀹樸怌HO銆?/strong>
棣栧腑媯鏌ュ畼銆怌IO銆?/strong>
棣栧腑鎵ф硶瀹樸怌JO銆?/strong>
緗戠粶榪炴帴涓撳憳銆怌KO銆?/strong>
棣栧腑寰嬪笀銆怌LO銆?/strong>
棣栧腑濯掍綋瀹樸怌MO銆?/strong>
棣栧腑鏂伴椈瀹樸怌NO銆?/strong>
棣栧腑闅愮瀹樸怌PO銆?/strong>
鏁伴噺鎸囨爣緙栭犱笓瀹躲怌QO銆?/strong>
棣栧腑瑁佸憳瀹樸怌RO銆?/strong>
棣栧腑鎴樼暐瀹樸怌SO銆?/strong>
棣栧腑鑱旂洘瀹樸怌UO銆?/strong>
鎶曡祫鑰呭叧緋匯怌VO銆?/strong>
棣栧腑緗戠粶鍐欐墜銆怌WO銆?/strong>
褰㈣薄浠h█浜恒怌XO銆?/strong>
鍏徃鍏冭併怌YO銆?/strong>
]]>
銆愮敤鎴鋒暟閲?-娉ㄥ唽鐢ㄦ埛銆?/font>涓嶅悓欏圭洰娉ㄥ唽鐢ㄦ埛璐ㄩ噺瀹屽叏涓嶅悓錛岃繍钀ュ晢緇欏嚭涓嶇湡瀹炴暟鎹紝閭f暟鎹皟鏌ユ姤鍛婄湡瀹炴у憿錛熸牴鏈病鏈夋槑鐧界敤鎴瘋川閲忕殑鎰忎箟銆?br> 2銆佷笉鍚屾父鎴忔瘡涓鉤鍧囧湪綰挎槸鐢變笉鍚屾暟閲忕敤鎴烽犲氨鐨勩備竴涓ソ娓告垙鍙互澶ч噺綺樹綇鐜╁闀挎椂闂磋垗涓嶅緱涓嬬嚎銆?/p>
3銆佸鏋滄椿璺冪敤鎴鋒瘡嬈′笂綰垮鉤鍧囧湪綰?灝忔椂錛岄偅涔堥渶瑕?涓椿璺冪敤鎴峰鍔?涓鉤鍧囧湪綰匡紝濡傛瘡嬈″彧璁╃敤鎴風帺娓告垙5鍒嗛挓灝辮蛋浜嗭紝鍝曟父鎴忛潪甯稿ソ鐢ㄦ埛姣忓ぉ閮戒笂鏉?鍒嗛挓錛岄偅涔堝繀欏繪湁60/5*24=288涓椿璺冪敤鎴鋒墠鑳借揪鍒?涓鉤鍧囧湪綰夸漢鏁般傝鏍規嵁鎯呭喌鍒ゆ柇鎺ㄥ箍媧昏穬鐢ㄦ埛瀹規槗錛岃繕鏄鍔犳父鎴忕矘鐫鏇村鏄撱?/p>
2銆佸緢澶氭劊澶撮潚鍚澶у笀瀹d紶鍏嶈垂妯″紡錛岃繛鍏嶈垂妯″紡鏁版嵁閮戒笉娓呮鎯呭喌涓嬪嚟鎰熻鍧氬畾璁や負鍏嶈垂妯″紡鏄疆嫻併佽秼鍔褲傞檲澶╂ˉ涓嶇湅浜у搧鏁版嵁錛岄亾鍏鋒敹璐瑰鍔犲埌鍙浛浠f敹璐規ā寮忥紝灝卞嚟鐏靛厜涓闂妸姣忓搴﹀嚑浜挎椂闂寸偣鍗$粰鎵斾簡錛熺湅鍒拌繖涓ゅ勾鏉ョ洓澶т粠鍏嶈垂妯″紡璧氬彇瓚呰繃鏀惰垂妯″紡榪樻槸鏈夌憰鐤電殑錛岃嚦灝戝湪綰夸漢鏁版病鏈夋寜鐩涘ぇ鎯寵薄鐨勫ぇ騫呭害澧炲姞銆?/p>
2銆佹敞鎰忎互涓婇儴鍒嗘暟鎹紝涓嶈杞繪槗鐩鎬俊騫垮憡鍟嗙瀻鍚癸紝鑷繁鎺屾彙鐨勬暟鎹墠鏄渶鐪熷疄涓嶄細嬈洪獥浣犵殑銆?/p>
3銆佺簿紜帉鎻″悇縐嶈惀閿鏂瑰紡鏁堟灉鏁版嵁錛岀浉淇′綘涓嶄細闅忎究涔辮姳閽憋紝鎷嶇潃鑴戠摐瀛愬氨涓婁竴浜涙т環姣斾笉鍚堥傜殑騫垮憡銆?/p>
2銆佽繎涓ゅ勾寰堢伀綰㈡搗鍜岃摑嫻鋒蹇點?br> 2銆佸緢澶氭父鎴忎漢閮藉垎鏋愩婃ⅵ騫昏タ娓搞嬩粠鎶鏈?span style="DISPLAY: none; FONT-SIZE: 0px">[鏉ユ簮錛欸ameRes.com]灞傞潰瀹屽叏娌℃湁浼樺娍浜у搧涓轟綍榛忕潃搴﹂偅涔堥珮錛屾祦澶辯巼閭d箞浣庛傛父鎴忓唴娑墊槸鏈閲嶈鐨勫洜绱狅紝榪欏叧緋誨埌娓告垙鐢熷懡鍛ㄦ湡銆傚鏋滅帺瀹舵妸鎵鏈夊唴瀹歸兘鍏ㄩ儴鐜╁埌闇瑕?涓湀錛岄偅涔?涓湀灝辨槸緗戠粶娓告垙姣忎釜鐢ㄦ埛鐢熷懡鍛ㄦ湡錛屽綋鐜╁鎰熻娌℃湁鍙帺鍐呭鏃朵粬鑷劧浼氱寮銆傛湁鐨勬父鎴忔槸鍙互璁╃帺瀹剁帺鍑犲勾榪樻湁鏂板唴瀹癸紝鏈夌殑娓告垙铏界劧濂戒絾鏄敓鍛藉懆鏈熺煭銆傜幇鍦ㄦ湁瓚婃潵瓚婂娓告垙瀛︿細鍒╃敤寰幆浠誨姟錛屾垨闅忓嵆鐢熸垚浠誨姟澧炲姞鐢熷懡鍛ㄦ湡 3銆佹湁浜涙暟鎹彲浠ュ憡璇夊摢浜涙敹璐規槸鐜╁鑳藉鎺ュ彈鐨勶紙灝界鏈変簺鏀惰垂鍐呭錛岀帺瀹跺彲鑳芥案榪滀細楠傦紝浣嗘瘡澶╅兘鏈夊ぇ閲忕敤鎴峰湪浠樿垂錛屾湁浜涙敹璐圭湅璧鋒潵娌′漢楠傦紝瀹為檯涓婃牴鏈病鏈変漢浣跨敤錛岄兘瑕侀氳繃榪愯惀鏁版嵁鍒嗘瀽錛夈?br> 5銆佹暟鎹緢娓呮鍛婅瘔浣犳父鎴忕粡嫻庝綋鍒舵槸鍚︾ǔ鍥猴紝娓告垙涓笉鏂鍔犵殑閲戦挶濂栧姳錛岄亾鍏烽攢鍞槸鍚﹂犳垚閫氳揣鑶ㄨ儉絳夋洿澶氱殑緇嗚妭闂銆?/p>
銆愬湪綰夸漢鏁般戙愭渶楂樺湪綰褲?/font>鏌愪釜鏃墮棿鑳借揪鍒扮殑鏈楂樺湪綰褲?br>
銆愭椿璺冧漢鏁般?/font>鍏鋒湁嬈洪獥鎬х殑鏁板瓧錛屽繀欏繪槸“姣忔棩媧昏穬鐢ㄦ埛”“姣忓懆媧昏穬鐢ㄦ埛”“姣忔湀媧昏穬鐢ㄦ埛”“姣忓媧昏穬鐢ㄦ埛”“鏈榪戝灝戝ぉ鍐呮椿璺冪敤鎴?#8221;絳夈傚湪榪欐鏃墮棿鍐呰繘鍏ユ父鎴忕殑浜恒?br>
銆愭瘡涓椿璺冪敤鎴峰鉤鍧囧湪綰挎椂闂淬?/font>涓婇潰璇翠簡媧昏穬鐢ㄦ埛鏁幫紝濡傛灉娌℃湁鏈暟鎹笂闈㈤偅涓篃娌℃湁鎰忎箟銆佹瘡涓敤鎴烽兘鍦ㄧ嚎2鍒嗛挓椹笂灝變笅綰匡紝媧昏穬鐢ㄦ埛浠峰兼槸澶氬皯鍛紵鑳藉拰涓婄嚎灝卞崄鍑犱釜灝忔椂鍦ㄧ嚎鐜╁絳夊間箞錛?/p>
銆愭父鎴忓鉤鍧囧湪綰夸漢鏁般?/font>
1銆?4灝忔椂鍐呭鉤鍧囧湪綰夸漢鏁幫紝鏁版嵁閲囨牱鏃墮棿瓚婂瘑闆嗚秺綺劇‘銆?/p>
銆愬鉤鍧囧湪綰褲佹繪敞鍐岀敤鎴楓佹椿璺冧漢鏁板強鏈楂樺湪綰挎瘮渚嬨?/font>
鏇劇粡鏈変笓瀹惰鏄痻xxx鏄?%錛寈xxx鏄?.7%絳夛紝浠栦滑鍙兘閽堝鏌愭鑳芥帴瑙﹀埌鐨勭綉娓告暟鎹屾潵錛屽鏋滀笉鐭ラ亾鏁版嵁鏄湪浠涔堟潯浠朵笅浜х敓鐨勶紝姣忔浜у搧閮戒笉涓鏍楓佹瘮渚嬮殢鐫涓嶅悓甯傚満銆佷笉鍚屼駭鍝併佷笉鍚屾笭閬撱佷笉鍚屾湇鍔′細瀵艱嚧綺劇‘鏁版嵁鍜屾瘮渚嬪畬鍏ㄤ笉涓鏍楓傚摢鎬曚竴妯′竴鏍蜂駭鍝侀兘鍙兘瀹屽叏涓嶄竴鏍鋒暟鎹紝鍒漢娉ㄥ唽100涓囩敤鎴瘋兘鏈?涓囧湪綰匡紝涓嶄唬琛ㄤ綘瀹d紶娉ㄥ唽100涓囦篃鏈?涓囥傚悇鏂歸潰緇嗚妭澶錛岃祫鏈寰堝皯鍏ㄩ潰鐪嬫垚鍔熷垱涓氳呮墍浠樺嚭鐨勫姫鍔涖?/p>
銆怉rpu鍊煎畾涔変箣浜夈?/font>
1銆佹湁浜鴻鏄瘡涓秷璐圭敤鎴風殑姣忔棩鑺辮垂銆?br>2銆佹湁浜鴻鏄瘡涓椿璺冪敤鎴風殑姣忔湀鑺辮垂銆?br>3銆佷笂甯傚叕鍙歌儲鎶ユ暟鎹畾涔夛細浜у搧姣涙敹鐩?騫矨PA/arpu錛岃涔堝鍔燗PA鏁伴噺錛岃涔堝鍔燗RPU銆傚浜庤繍钀ュ晢瑕佹牴鎹灝戝鉤鍧囧湪綰跨‘瀹氭湇鍔″櫒銆佸甫瀹姐佸鎴鋒湇鍔°侀渶瑕佸灝戞帹騫挎垚鏈墠鑳界瘡璁″鉤鍧囧湪綰跨瓑榪愯惀鎴愭湰銆?br>
銆愭敹璐規ā寮忓浐瀹氬箋?/font>
寰堝ソ綆楋細姣忓皬鏃?姣涳紙鎴栫偣鍗″畾浠鳳級*24灝忔椂*30澶?288鍏?鏈堬紝涓嬈劇櫨涓囧湪綰挎敹璐圭綉娓稿ぇ鑷存敹鍏ユ槸1000000*288錛屾瘡鏈?.88浜挎瘺鏀跺叆錛堟湁寰堝灝忔暟瀛楋紝濡傚厤璐逛嬌鐢ㄦ湡鐢ㄦ埛姣斾緥瀵艱嚧鐪熷疄鍊煎噺灝戙佸悇縐嶅洜绱犲鑷村厤璐規父鎴忕敤鎴鋒瘮渚嬪鑷寸湡瀹炴敹鍏ュ噺灝戙佺敤鎴瘋喘涔扮偣鍗″緢澶氫漢娌$敤瀹屽鑷寸湡瀹炴敹鍏ュ澶氾紝娓犻亾鍘嬩簡璐ф渶鍚庢病鏈夐瀵艱嚧鏀跺叆澧炲絳夛級銆?/p>
銆愬厤璐瑰埗鍔ㄦ乤rpu鍊箋?/font>
1銆佸ぇ澶氭暟緗戞父閮藉湪瀛︿範鍏嶈垂妯″紡錛屽埄鐢ㄦ敹璐歸亾鍏風瓑鐩堝埄錛宎rpu鍊煎ぇ灝忓叧緋誨埌鐢熷瓨鐨勯噸瑕佹寚鏍囥?/p>
銆愭敹璐瑰埗銆?/font>
鎺ㄥ箍1涓敹璐瑰埗娓告垙鍦ㄧ嚎鐢ㄦ埛榪滄瘮鎺ㄥ箍N涓厤璐規父鎴忓湪綰跨敤鎴鋒洿鍔犲洶闅撅紝鍏嶈垂妯″紡arpu鍊煎ぇ浜庢敹璐規ā寮忔椂錛岃嚜鐒跺厤璐規ā寮忚姣旀敹璐規ā寮忔洿濂姐?br>
銆愭帹騫挎垚鏈?/font>
1銆佹墦綆楄姳澶氬皯閽卞浼犳帹騫夸駭鍝併?br>2銆侀櫎浜嗚祫閲戣繕瑕佽冭檻浜哄姏鎴愭湰鍜屾椂闂存垚鏈?br>3銆佷粩緇嗚綆楁瘡涓湪綰跨敤鎴鋒帹騫挎垚鏈紝鑺卞灝戦挶鎵嶈兘澧炲姞1涓鉤鍧囧湪綰褲?br>4銆佸ぇ閮ㄥ垎鎯呭喌涓?涓鉤鍧囧湪綰縜rpu鍊間綆浜?涓鉤鍧囧湪綰挎帹騫挎垚鏈傚鑳芥壘鍒板粔浠鋒帹騫挎柟寮忓鍔犲湪綰匡紝璐圭敤浣庝簬鐢ㄦ埛arpu鍊鹼紝鍒姽璞刀绱ф帹騫垮惂銆?br>
銆愭帹騫挎晥鏋溿?/font>
1銆佷綔涓哄競鍦轟漢鍛樻槸鎺屾彙姣忕钀ラ攢鏂瑰紡鏁堟灉鏁版嵁銆傛湁澶氬皯浜鴻兘鐪嬪埌騫垮憡A錛屾湁澶氬皯鐩爣鐢ㄦ埛鐪嬪埌騫垮憡銆佸紩璧峰灝戠洰鏍囩敤鎴瘋浣忋佽澶氬皯鐩爣鐢ㄦ埛鎰熷叴瓚c佸灝戠敤鎴峰皾璇曘佸墿涓嬫槸浜у搧鏈韓鍜屽鎴鋒湇鍔$殑浜嬨傚涓競鍦烘潵璇存拻璋庝笉鏄己鐐廣佹棤娉曡鏇村鐢ㄦ埛鏉ュ皾璇曚駭鍝佹墠鏄け璐ャ?/p>
銆愬競鍦烘綔鍔涘垎綰с?/font>
涓嶈瀹氫箟涓涓仴涓嶅彲鍙婄殑甯傚満鐩爣錛屼緥濡傚叏涓栫晫鏈夊灝戜漢錛屾瘡涓漢閮介渶瑕佷綇鎴匡紝鑰屼綘鏄釜鏈夋埧鍦頒駭鎯蟲硶鐨勫勾杞諱漢錛屼綘鍛婅瘔鍒漢浣犵殑甯傚満鐩爣鏄灝戜嚎浜垮叏鐞冪敤鎴風殑鎴夸駭銆傝繖鏍風洰鏍囨槸娌℃湁鎰忎箟鐨勩傚彲鎵ц鐨勭洰鏍囨槸寰堥噸瑕佺殑錛屽彧瑕佹槸鍙墽琛屽摢鎬曞湪鏃佷漢鐪奸噷鐪嬭搗鏉ュ緢鐙傚錛屼篃娌℃湁浠涔堜笉鍙互銆?/p>
銆愯繍钀ョ綉緇滄父鎴忎竴瀹氳鐭ラ亾鍒嗙駭銆?/font>
1. 鍙互鐩存帴鎺ㄥ箍鍒扮殑閭d簺浜猴紵鎵嬫妸鎵嬶紝鎴栬呴氳繃浣犵殑涓漢濯掍綋錛堣█浼犺韓鏁欙級
2. 鑳藉湪浣犳墍鎷ユ湁棰勭畻鍐呮帶鍒跺摢浜涘獟浣擄紝鍋氬摢浜涗簨鎯咃紝鏈夊灝戠敤鎴蜂細鍥犱負鎬庢牱瀹d紶鍐呭鑰屽皾璇?br>3. 榪樻湁鍝簺璧勬簮錛屽摢浜涙湅鍙嬫敮鎸侊紝甯姪錛屽湪浣犳墍鎷ョ殑棰勭畻鍐呰兘甯綘鎵撳紑鍝簺甯傚満銆?br>4. 浜烘墠錛岃兘鍚︽壘鍒版瘮浣犳洿浼樼鐨勪漢鎵嶃佷笓瀹跺府鍔╀綘瀹d紶銆佹帹騫挎墿澶у競鍦?/p>
銆愮敤鎴風兢鍒嗙駭涓句緥銆?/font>
1銆侀潪甯稿叧娉ㄤ綘鐨勪駭鍝佺綉娓哥敤鎴鋒渶鍙兘鎴愪負浣犵殑鐢ㄦ埛
2銆佸浼犳帹騫垮茍寮曡搗浠栦滑娉ㄦ剰鐨勭綉緇滄父鎴忕敤鎴?br>3銆佸埌澶勫鎵炬柊娓告垙鐨勭綉緇滄父鎴忕敤鎴?br>4銆佸悓綾葷綉緇滄父鎴忕殑鐢ㄦ埛
5銆佸紓綾葷綉緇滄父鎴忕殑鐢ㄦ埛
銆愭墍鏈変漢銆?/font>浠ヤ笂鍒嗙駭涓嶄竴瀹氬噯紜紝涓嶄竴瀹氶傚悎浣狅紝瀵逛簬浣犲緢鍙兘姣忕駭闇瑕佹姇鍏ユ垚鏈笉涓鏍鳳紝娌℃湁鍙茬帀鏌變袱涓嚎灝變笉瑕佸紑濮嬫妸鐩爣鐢ㄦ埛瀹氫箟涓烘墍鏈変漢鑰屽幓鎵撳叏鍥藉箍鍛婏紝鍚﹀垯浼氬彂鐜版姇鍏ユ垚鏈竴瀹氭敹涓嶅洖鏉ャ?/p>
銆愮洰鏍囧競鍦哄畾涔夈?/font>
1銆佹瘡涓漢閮芥兂浜у搧鍗犻鏈澶ф渶澶氬競鍦猴紝鐢卞悇鏂歸潰鏉′歡鏈夐檺蹇呴』鎸夊甯傚満鍒嗙駭錛屽垎鏋愮洰鍓嶉樁孌佃兘瑕嗙洊鐩爣甯傚満銆?/p>
3銆佸噯紜畾浣嶅競鍦恒佺粏鍒嗗競鍦虹洰鐨勬槸闄嶄綆甯傚満鎺ㄥ箍鎴愭湰錛屽鍔犳帹騫挎湁鏁堢▼搴︺傚鏋滄湁瓚沖鐨勬帹騫挎垚鏈紝浣犺嚜鐒跺彲浠ュ鍋氭硾濯掍綋錛屽箍澶у鍔犵煡鍚嶅害錛屽浼犻潰銆?/p>
銆愭祦澶辯巼銆?/font>寰堝鏄撹閬楀繕鍗村紓甯擱噸瑕侊紝鍐沖畾娓告垙鐢熸閲嶈鏁版嵁錛屽競鍦烘帹騫垮ソ涓嶅鏄撴媺鐨勭帺瀹剁暀涓嶇暀寰椾綇銆?br>銆愬垵鏈熸祦澶辯巼銆?/font>灝濊瘯鐢ㄦ埛杞彉涓烘垚鐔熸椿璺冪敤鎴鳳紝鎵闇鑰楄垂鐨勬椂闂?br>銆愯嚜鐒舵祦澶辯巼銆?/font>鎴愮啛媧昏穬鐢ㄦ埛鑷劧嫻佸け鐜囷紝浜у搧濂藉潖錛屽唴娑典赴瀵屾渶澶х▼搴﹀喅瀹氱潃鑷劧嫻佸け鐜囬珮浣庛?/p>
1銆佷駭鍝佹湰韜湁寰堝闂灝嗕細甯︽潵闈炲父楂樿嚜鐒舵祦澶辯巼錛屼駭鍝佺殑鐢婚潰銆佹搷浣溿佸悇鏂歸潰緇嗚妭閮芥槸鍏崇郴鍒頒駭鍝佸搧璐ㄧ洿鎺ュ紑鍙戝洜绱犮?/p>
3銆佺綉娓稿紑鍙戣呬笉瑕佸啿鐫綆鍗曟柊姒傚康鍋氭父鎴忥紝涓嶆槸鍋氬櫛澶達紝鍋氭湁鍐呮兜鐨勫ソ娓告垙錛屽厖鍒嗗埄鐢ㄤ綘鐨勬妧鏈洟闃熷疄鐜版晥鏋滐紝鑰屼笉鏄洸鐩笓闂ㄦ悶鏁堟灉鎼炲櫛澶達紝璁╃敤鎴蜂箰鎰忕暀鍦ㄦ父鎴忛噷闈€?/p>
銆愬鎴鋒湇鍔°?/font>寰堥噸瑕佷綔鐢ㄦ槸鍑忓皯嫻佸け鐜囷紝娌℃湁瀹㈡埛鏈嶅姟娓告垙灝嗕笉鍙伩鍏嶆墿澶ф祦澶辯巼錛屾祦澶辯巼澶х浠欎篃娌″緱鏁戙傜洓澶х涓絎旀敹鍏ョ敤鏉ュ緩绔嬪鎴鋒湇鍔′腑蹇冧負浜嗕粈涔堬紵鍟嗕笟鏁版嵁涓婅灝辨槸闄嶄綆嫻佸け鐜囥?/p>
銆愮嚎涓婃椿鍔ㄣ?/font>閫氳繃媧誨姩錛堝彲鑳芥槸鏂頒換鍔°佺瓥鍒掓椿鍔ㄣ佸鏈嶆墽琛屾椿鍔級涓存椂鎬у鍔犳媺楂樺湪綰匡紝鍑忕紦鎴栭樆姝㈢煭鏃墮棿鍐呯帺瀹舵祦澶便?/p>
銆愮敤鎴瘋嚜鐒跺闀跨巼銆?/font>鍦ㄦ帹騫夸笅澧炲姞1涓鉤鍧囧湪綰挎垚鏈綆浜庛愮敤鎴穉rpu鍊箋?銆愬鉤鍧囨瘡涓敤鎴風敓鍛藉懆鏈熴戙傚彲浠ヤ笉鏂寔緇鍔犵敤鎴鋒儏鍐典笅銆佹柊榪涘叆鐜╁澶т簬浜у搧嫻佸け鐜囧氨榪涘叆婊氶洩鐞冩晥搴斾簡銆傚ぇ澶氭暟浜у搧涓鍋滄澶ц妯℃帹騫挎垚鏈姇鍏ユ祦澶辯巼閮借繙澶т簬澧為暱鐜囥傚緢澶氶」鐩湪鍒濇湡鐐掍綔鍚庡緢蹇敤鎴鋒暟閲忛檰緇祦澶憋紝鏈鍚庝笉寰椾笉鍊掗棴鐨勫師鍥犮?/p>
銆愭敹鍏ユ綔鍔涘箋?/font>鍜宎rpu鍊肩煕鐩劇殑鍊鹼紝arpu鍊艱秺浣庤瘉鏄庢綔鍔涜秺澶э紝arpu鍊艱秺楂樺弽鑰岃鏄庣浉鍚岀敤鎴鋒暟閲忎笅鏀跺叆澧為暱娼滃姏灝忋傛湁浜涘叕鍙革紙榪樻病鎵懼埌鐩堝埄妯″紡鍗存湁杈冨鐢ㄦ埛鐨勭綉绔欐垨娓告垙錛夋妸榪欎釜浣滀負浠栦滑鐨勬湭鏉ュ崠鐐廣?/p>
銆愭洿澶氱粏鑺傛暟鎹?/font>鍋氬ソ娓告垙涓嶄粎浠呯湅緇撴灉鍨嬫暟鎹紝鏇村瀵逛簬寮鍙戠瓥鍒掕鐪嬭繃紼嬭蛋鍚戝瀷鏁版嵁銆?/p>
銆愪緥濡傘?/font>
1銆佹湁浜涙暟鎹彲浠ュ憡璇変綘鍦ㄦ帹騫胯繃紼嬩腑鍝釜鐜妭嫻佸け鐢ㄦ埛鏈澶氥?br>
2銆佹湁浜涙暟鎹彲浠ュ憡璇変綘銆佺帺瀹跺枩嬈㈠摢浜涚郴緇燂紝璁ㄥ帉浠涔堛傛棤璁哄枩鐖辮繕鏄鍘岄兘姣斾笉榪囥愭佸害澶辮觸銆戞紶涓嶅叧蹇冦佹楦瓙鍢寸‖銆傜帺瀹跺綺懼績絳栧垝鐨勫唴瀹規紶涓嶅叧蹇冿紝榪欐槸鏈澶辮觸鐨勭瓥鍒掋?/p>
4銆佹湁浜涙暟鎹彲浠ュ緢娓呮鍛婅瘔浣犵敤鎴峰湪鍒烽挶銆佸湪浣滃紛銆佸湪鍒╃敤婕忔礊銆佸湪鐢ㄥ鎸傘佷慨鏀瑰皝鍖呫傚鏋滄湁鑷姩鍖栨暟鎹垎鏋愭妧鏈嚑涔庡彲浠ュ彂鐜頒紬澶氱帺瀹朵綔寮娿傛敞鎰忓彧鏄彂鐜幫紝鑳藉惁瑙e喅榪樺彇鍐充簬楂樺眰閲嶈鎬佸害鍙婃妧鏈漢鍛樿兘鍔涘拰閫熷害錛岃鐭ラ亾鑰岃繖浜涢棶棰樺嚑涔庡鑷翠簡澶ч噺娓告垙姝諱骸銆?/p>
鍏ㄩ儴鎸?DMARK06榛樿鍒嗚鯨鐜囧緱鍒嗚綆?娓告垙鍐呭疄闄呭撫鏁頒笉璁$畻鍦ㄥ唴(鍥犱負NVIDIA鍜孉TI瀵規父鎴忎紭鍖栭犳垚寰楀垎涓嶅叕姝?鎺掑悕120鍚庣殑鏄懼崱鍥犳椂闂磋繃闀挎棤娉曟祴璇?鍙寜鍘嗗勾鏉ョ綉涓婅瘎鍒嗘帓鍚?(鎵鏈夋帓鍚嶆樉鍗″潎涓哄畼鏂瑰叕鏉塊鐜囨祴璇?.
001 NVIDIA GTX295
002 ATI HD4870X2
003 NVIDIA GTX285
004 ATI HD4850X2
005 NVIDIA GTX280
006 ATI HD4870
007 NVIDIA GTX260
008 ATI HD3870X2
009 ATI HD4850
010 NVIDIA 9800GTX+=NVIDIA GTX250
011 NVIDIA 8800Ultra
012 NVIDIA 8800GTX
013 NVIDIA 9800GTX
014 ATI HD4830
015 NVIDIA 8800GT=NVIDIA 9800GT
016 NVIDIA 8800GTS
017 NVIDIA 8800GS 768M=NVIDIA 9600GSO 768M
018 NVIDIA 9600GT 512
019 NVIDIA 7950GX2
020 ATI HD2900XT
021 ATI HD3870
022 NVIDIA 8800GS 384M=NVIDIA 9600gso 384M
023 ATI X1950XTX
024 NVIDIA 7900GTX
025 ATI HD3850
026 ATI HD4670
027 9600GSO 512M
028 NVIDIA 9600GT 256
029 ATI X1900XTX
030 ATI X1950XT
031 NVIDIA 7950GT
032 ATI 1900XT
033 ATI HD3690
034 NVIDIA 8600GTS
035 NVIDIA 7900GT
036 ATI X1800XT
037 ATI X1950Pro
038 NVIDIA 7800GTX
039 NVIDIA 7900GS
040 ATI X1950GT
041 ATI X1900GT
042 ATI X1800XL
043 NVIDIA 7800GT
044 ATI X850XT/XTPE
045 ATI HD3670
046 ATI HD4650
047 NVIDIA 9500GT
048 NVIDIA 8600GT
049 ATI HD3650
050 ATI X1800GTO
051 ATI X800XT/XTPE
052 NVIDIA 7600GT
053 ATI HD2600XT
054 ATI X1650XT
055 NVIDIA 6800Ultra
056 NVIDIA 6800GT
057 NVIDIA 6800GS
058 ATI X800XL
059 ATI X850Pro
060 NVIDIA 6800
061 ATI X1650 Pro
062 ATI X800pro/GTO
063 ATI X1600XT
064 NVIDIA 7600GS
065 ATI X800SE
066 ATI X1300XT
067 NVIDIA 8500GT=NVIDIA 9400GT
068 ATI X1600Pro
069 NVIDIA 7300GT
070 NVIDIA 6800XT/LE
071 NVIDIA 6600GT
072 ATI X700Pro
073 ATI 9800XT
074 ATI 9800Pro
075 ATI 9700Pro
076 ATI 9800
077 S3 Chrome S27
078 ATI X700
079 NVIDIA 5950Ultra
080 ATI 9700
081 NVIDIA 5900Ultra
082 NVIDIA 5800Ultra
083 NVIDIA 5900
084 NVIDIA 5800
085 ATI X1300Pro
086 NVIDIA 8400GS
087 ATI HD2400Pro
088 NVIDIA 7300GS
089 NVIDIA 6600
090 NVIDIA 5900XT
091 ATI X1300
092 ATI X600XT
093 NVIDIA 7300LE
094 NVIDIA TI4800
095 NVIDIA TI4600
096 ATI 9600XT
097 NVIDIA TI4800SE
098 NVIDIA 5700Ultra
099 ATI 9500 256bit
100 9800SE 128bit
101 ATI X600
102 ATI X550
103 ATI 9600Pro
104 NVIDIA TI4400
105 ATI 9500Pro
106 NVIDIA 6600LE
107 ATI X1300SE
108 NVIDIA 5700
109 ATI 9600
110 NVIDIA 6200
111 NVIDIA TI4200
112 NVIDIA 5600
113 ATI 9550
114 NVIDIA 5600XT
115 ATI 9600SE
116 NVIDIA 5500
117 NVIDIA 7100GS
118 ATI X300
119 ATI 9550SE
120 NVIDIA 6200A
121 ATI 9200Pro
122 ATI 9000Pro
123 ATI 8500Pro
124 NVIDIA GeForce3 TI500
125 ATI 8500
126 ATI 8500LE
127 NVIDIA 5200Ultra
128 ATI 9200
129 ATI 9250
130 NVIDIA GeForce4 MX460
131 NVIDIA 5200
132 ATI 9000
133 ATI 9200SE
134 NVIDIA GeForce3 TI200
135 NVIDIA GeForce3
136 NVIDIA GeForce4 MX 440
137 ATI 7500
138 ATI 7200
139 NVIDIA GeForce2 Ultra
140 ATI 7000
141 NVIDIA GeForce2 GTS
142 NVIDIA GeForce4 MX 420
143 ATI Radeon
144 Voodoo5 5500
145 NVIDIA GeForce2 MX 400
146 NVIDIA GeForce256
147 NVIDIA GeForce2 MX
148 Voodoo4 4500
149 NVIDIA TNT2
150 ATI Rage128 Pro
151 Voodoo3
152 TNT
153 ATI Rage128
154 NVIDIA Riva128
155 ATI Rage3D Pro
156 Voodoo Banshee
157 Voodoo2
158 NVIDIA Riva
159 ATI Rage3D
160 Voodoo