如何使用libevent服务器
1. 锘轰簬浜嬩欢椹卞姩镄勯珮镐ц兘寮婧愮绣缁滃簱libevent浠嬬粛鍙婂畨瑁
libevent鏄涓涓杞婚噺绾х殑锘轰簬浜嬩欢椹卞姩镄勯珮镐ц兘镄勫紑婧愮绣缁滃簱锛屽苟涓旀敮鎸佸氢釜骞冲彴锛屽瑰氢釜骞冲彴镄処/O澶岖敤鎶链杩涜屼简灏佽咃纴褰撴垜浠缂栬疟搴撶殑浠g爜镞讹纴缂栬疟镄勮剼链灏嗕细镙规嵁OS鏀鎸佺殑澶勭悊浜嬩欢链哄埗锛屾潵缂栬疟鐩稿簲镄勪唬镰侊纴浠庤屽湪libevent鎺ュ彛涓娄缭鎸佷竴镊淬
鍦ㄥ綋鍓岖殑链嶅姟鍣ㄤ笂锛岄溃瀵圭殑涓昏侀梾棰桦氨鏄瑕佽兘澶勭悊澶ч噺镄勮繛鎺ャ傝岄氲繃libevent杩欎釜缃戠粶搴掳纴鎴戜滑灏卞彲浠ヨ皟鐢ㄥ畠镄𪞝PI𨱒ュ緢濂界殑瑙e喅涓婇溃镄勯梾棰樸傞栧厛锛屽彲浠ユ潵锲为【涓涓嬶纴瀵硅繖涓闂棰樼殑浼犵粺瑙e喅鏂规硶銆
闂棰桡细 濡备綍澶勭悊澶氢釜瀹㈡埛绔杩炴帴
瑙e喅鏂规1锛 I/O澶岖敤鎶链
杩椤嚑绉嶆柟寮忛兘鏄钖屾I/O锛屽嵆褰撹诲啓浜嬩欢灏辩华锛屼粬浠镊宸遍渶瑕佽礋璐h繘琛岃诲啓锛岃繖涓璇诲啓杩囩▼鏄阒诲炵殑锛岃屽纾姝I/O鍒欎笉闇瑕佽嚜宸辫礋璐h诲啓锛屽彧闇瑕侀氱煡璐熻矗璇诲啓镄勭▼搴忓氨鍙浠ヤ简銆
瑙e喅鏂规2锛 澶氱嚎绋嬫妧链鎴栧氲繘绋嬫妧链
澶氱嚎绋嬫妧链鍜屽氲繘绋嬫妧链涔熷彲浠ュ勭悊楂桦苟鍙戠殑鏁版嵁杩炴帴锛屽洜涓哄湪链嶅姟鍣ㄤ腑鍙浠ヤ骇鐢熷ぇ閲忕殑杩涚▼鍜岀嚎绋嫔拰澶勭悊鎴戜滑闇瑕佺洃瑙嗙殑杩炴帴銆备絾鏄锛岃繖涓ょ嶆柟寮忎篃鏄链夊緢澶х殑灞闄愭х殑锛屾瘆濡傚氲繘绋嬫ā鍨嫔氨涓嶉傚悎澶ч噺镄勭煭杩炴帴锛屽洜涓鸿繘绋嬬殑浜х敓鍜屽叧闂闇瑕佹秷钥楄缉澶х殑绯荤粺镐ц兘锛屽悓镙凤纴杩樿佽繘绋嬭繘绋嬮棿镄勯氢俊锛屽湪CPU镐ц兘涓嶈冻镄勬儏鍐典笅涓嶅お阃傚悎銆傝屽氱嚎绋嬫妧链鍒欎笉澶阃傚悎澶勭悊闀胯繛鎺ワ纴锲犱负褰撴垜浠寤虹珛涓涓杩涚▼镞讹纴linux涓浼氭秷钥8G镄勬爤绌洪棿锛屽傛灉鎴戜滑镄勬疮涓杩炴帴閮芥澋镌涓嶆柇寮锛岄偅涔埚ぇ閲忚繛鎺ラ暱杩炴帴钖庯纴瀵艰嚧镄勭粨鏋滃氨鏄鍐呭瓨镄勫ぇ閲忔秷钥椼
瑙e喅鏂规3锛 甯哥敤镄勪笂杩颁簩钥呭嶅悎浣跨敤
涓婅堪镄勪袱绉嶆柟娉曞悇鍏锋湁浼樼己镣癸纴锲犳わ纴鎴戜滑鍙浠ュ皢涓婅堪镄勬柟娉旷粨钖堣捣𨱒ワ纴杩欎篃鏄鐩鍓崭娇鐢ㄨ缉澶氱殑澶勭悊楂桦苟鍙戠殑鏂规硶銆傚氲繘绋+I/O澶岖敤鎴栬呭氱嚎绋+I/O澶岖敤銆傝屽湪鍏蜂綋镄勫疄鐜颁笂锛屽张鍙浠ュ垎涓哄緢澶氱殑鏂瑰纺銆傛瘆濡傚氱嚎绋+I/O澶岖敤鎶链锛屾垜浠浣跨敤浣跨敤涓涓涓荤嚎绋嬭礋璐g洃钖涓涓绔鍙e拰鎺ュ弹镄勬弿杩扮︽槸钖︽湁璇诲啓浜嬩欢浜х敓锛屽傛灉链夛纴鍒椤皢浜嬩欢鍒嗗彂缁椤叾浠栫殑宸ヤ綔杩涚▼铡诲畬鎴愶纴杩欎篃鏄杩涚▼姹犵殑鐞嗗康銆
鍦ㄨ村畬涓婅堪镄勯珮骞跺彂镄勫勭悊鏂规硶涔嫔悗锛屾垜浠鍙浠ユ潵浠嬬粛涓涓猯ibevent镄勪富瑕佺壒镩蹭简銆
钖屾牱锛宭ievent涔熸槸閲囩敤镄勪笂杩扮郴缁熸彁渚涚殑select锛宲oll鍜宔poll鏂规硶𨱒ヨ繘琛孖/O澶岖敤锛屼絾鏄阍埚逛簬澶氢釜绯荤粺骞冲彴涓婄殑涓嶅悓镄処/O澶岖敤瀹炵幇鏂瑰纺锛宭ibevent杩涜屼简閲嶆柊镄勫皝瑁咃纴骞舵彁渚涗简缁熶竴镄𪞝PI鎺ュ彛銆俵ibevent鍦ㄥ疄鐜颁笂浣跨敤浜嗕簨浠堕┍锷ㄨ繖绉嶆満鍒讹纴鍏舵湰璐ㄤ笂鏄涓绉峈eactor妯″纺銆
鍦↙ibevent涓涔熸槸涓镙凤纴钖慙ibevent妗嗘灦娉ㄥ唽鐩稿簲镄勪簨浠跺拰锲炶皟鍑芥暟锛涘綋杩欎簺浜嬩欢鍙戠敓镞讹纴Libevent浼氲皟鐢ㄨ繖浜涘洖璋冨嚱鏁板勭悊鐩稿簲镄勪簨浠躲
lbevent镄勪簨浠舵敮鎸佷笁绉嶏纴鍒嗗埆鏄缃戠粶IO銆佸畾镞跺櫒鍜屼俊鍙枫傚畾镞跺櫒镄勬暟鎹缁撴瀯浣跨敤链灏忓爢锛圡in Heap锛夛纴浠ユ彁楂樻晥鐜囥傜绣缁泪O鍜屼俊鍙风殑鏁版嵁缁撴瀯閲囩敤浜嗗弻钖戦摼琛(TAILQ)銆
镟村歭inux鍐呮牳瑙嗛戞暀绋嬫枃链璧勬枡鍏嶈垂銮峰彇钖庡彴绉佷俊銆愬唴镙搞戙
libevent镄勫畨瑁呭緢绠鍗曪纴鎴戞槸鐩存帴浠巊ithub涓奵lone涓嬩竴涓婧愮爜锛岀劧钖庤繘琛岀紪璇戝畨瑁呯殑銆
鍏蜂綋镄勫懡浠ゆ槸锛埚亣璁句綘宸茬粡瀹夎呬简git锛夛细
鐜板湪镄刲ibevent鐗堟湰宸茬粡鍒拌揪libevent2浜嗭纴鍏跺炲姞浜嗗氱嚎绋嬬殑鏀鎸侊纴API鍑芥暟涔熷彂鐢熶简涓浜涘井灏忕殑鍙桦寲銆
濡傛灉浣犳兂鐭ラ亾镟村氱殑API浣跨敤𨱍呭喌锛岃风偣鍑昏繖閲屻
涓嬮溃锛屽氨锘轰簬libevent2缂栧啓涓涓镵婂ぉ瀹ゆ湇锷″櫒銆
璁捐℃濇兂锛 棣栧厛鍒涘缓涓涓濂楁帴瀛楋纴杩涜屽垱寤轰竴涓浜嬩欢瀵规ょ鍙h繘琛岀洃钖锛屽皢镓璇锋眰镄勭敤鎴风粍鎴愪竴涓阒熷垪锛屽苟鐩戝惉镓链夌殑鐢ㄦ埛浜嬩欢锛屽綋镆愪釜鐢ㄦ埛璇磋瘽浜嗭纴浜х敓浜呜讳簨浠讹纴灏卞皢璇ョ敤鎴风殑鍙戣█鍙戦佺粰阒熷垪涓镄勫叾浠栫敤鎴枫
绋嫔簭鍒嗘瀽
闇瑕佸寘钖镄刲ibevent鍑芥暟澶达细
鍒涘缓涓涓猚lient缁撴瀯浣掳纴鎺ュ弹杩炴帴钖庡瓨鏀炬暟鎹锛
鍏堟潵鐪嬩笅mian鍑芥暟镄勫勭悊锛
棣栧厛锛屽嚱鏁板埯濮嫔寲浜嗕竴涓鐢ㄦ埛阒熷垪tailq锛屾帴镌鍒涘缓浜嗕竴涓狲ocket濂楁帴瀛楋纴骞跺皢濂楁帴瀛楄惧畾涓洪潪阒诲炴ā寮忥纴鎺ョ潃瀵逛竴涓鍏ㄥ眬镄别vbase浜嬩欢闆嗗悎锛屾敞鍐屼简浜嬩欢锛屼簨浠舵簮鏄痩isten_fd锛屽洖璋冨嚱鏁版槸on_accept锛屼簨浠跺彂鐢熺殑𨱍呭喌鏄疎V_READ,钥屼笖镙囧织EV_PESIST琛ㄦ槑璇ヤ簨浠朵竴鐩村瓨鍦锛岃屽悗寮钖浜嬩欢镓鎻忓惊鐜痚vent_base_dispatch(evbase)銆
鍐岖湅涓涓嫔洖璋冨嚱鏁皁n_accpet瀹炵幇锛
杩欎釜锲炶皟鍑芥暟镄勪綔鐢ㄥ緢鏄剧劧锛屽氨鏄鎺ュ弹浜嗕竴涓瀹㈡埛绔镄勮锋眰锛屽苟鐢宠峰ソ浜嗕竴涓猚lient淇℃伅锛屽皢闇瑕佺殑鍐呭瑰~鍐椤ソ锛屽湪濉鍐欎腑闇瑕佹敞镒忕殑鏄锛屽张钖戜笂杩扮殑浜嬩欢闆唀vbase涓娉ㄥ唽浜嗕竴涓狰ufferevent浜嬩欢client->buf_ev,骞舵敞鍐屼简锲炶皟鍑芥暟buffered_on_read,buffered_on_error锛岃繖涓変釜鍑芥暟鍒嗗埆鏄褰撴帴鍙楀悗镄勮繛鎺ュ彂鐢熶简璇绘垨钥呴敊璇浜嬩欢钖庣殑镓ц屽嚱鏁般傛帴镌锛屽皢鐢ㄦ埛镄刢lient缁撴瀯鏀惧叆浜嗙敤鎴风殑阒熷垪tailq涓铡汇
鐢ㄦ埛镄刡uffer鍙璇诲悗镄勬墽琛屽嚱鏁帮细
镓ц屽嚱鏁扮殑浣灭敤寰堟槑鏄撅纴灏唋ibevent绠$悊涓镄刡uffer鏁版嵁璇诲彇鍑猴纴瀛桦叆链鍦扮殑data鏁扮粍鍐咃纴铹跺悗瀵归槦鍒椾腑镄刢lient杩涜屾绱锛屽傛灉涓嶆槸鍙戞暟鎹镄刢lient,鍒椤皢鏁版嵁鍐椤叆璇client镄刡uffer涓锛屽彂阃佺粰璇ョ敤鎴枫傝繖閲屾敞镒忕殑鏄闇瑕佸弽澶嶈诲彇buffer涓镄勬暟鎹锛岄槻姝涓涓璇诲彇骞舵病链夎诲彇骞插噣锛岀洿鍒拌诲彇涓嶅埌鏁版嵁涓烘銆
buffer鍑洪敊澶勭悊鍑芥暟鍜屼笂杩板嚱鏁板樊涓嶅氾纴锷熻兘灏辨槸鍑洪敊钖庯纴缁撴潫鎺変缭瀛樼殑client缁撴瀯锛岃︾粏灏变笉璇翠简銆
缂栬疟镄勬椂鍊栾板缑淇鏀筂akefile涓璍ibevent鏂囦欢澶圭殑浣岖疆
璁捐℃濇兂锛 镓璋揿洖鏄炬湇锷″櫒灏辨槸灏嗗㈡埛绔鍙戣繃𨱒ョ殑鏁版嵁鍐嶅彂锲炲幓锛岃繖閲屼富瑕佷篃灏辨槸璇存槑libevent镄勭函IO澶岖敤瀹炵幇銆傚疄鐜版柟娉曞拰涓婇溃镄勫樊涓嶅氾纴鐢氲呖鍙浠ヨ存洿锷犵亩鍗曘
绋嫔簭鍜屼笂闱㈢殑镵婂ぉ链嶅姟鍣ㄥ樊涓嶅氾纴鍙鏄鍦╞uffer鍙璇荤殑浜嬩欢鍑芥暟涓锛屼笉鏄灏嗙敤鎴风殑鏁版嵁鍙戦佺粰鍏朵粬鐢ㄦ埛锛岃屾槸鐩存帴鍙戦佺粰鐢ㄦ埛链韬銆
璁捐℃濇兂锛 涓婇溃镄勬柟娉曞崟绾浣跨敤libevent镄勭亩鍗曞嚱鏁版潵瀹炵幇链嶅姟锛屼絾鏄杩欓噷锛屾垜浠锅囱炬垜浠闇瑕佸勭悊镄勫㈡埛绔寰埚皯锛屼簬鏄鎴戜滑鍙浠ヤ娇鐢ㄥ逛簬姣忎釜杩炴帴鎴戜滑鍒嗛厤涓涓绾跨▼杩欐牱镄勬柟寮忔潵瀹炵幇瀵圭敤鎴风殑链嶅姟銆傝繖绉嶆柟寮忕亩鍗曟湁鏁堬纴涓瀵逛竴链嶅姟锛屽氨绠椾笟锷¢昏緫鍑虹幇阒诲炰篃涓嶆曘
绋嫔簭鍒嗘瀽
棣栧厛瀹氢箟浜嗕竴浜涙暟鎹缁撴瀯锛寃orker鏁版嵁缁撴瀯瀹氢箟镄勬槸涓涓宸ヤ綔钥咃纴瀹冨寘钖链変竴涓宸ヤ綔绾跨▼锛屽拰缁撴潫镙囧织锛岄渶瑕佽幏鍙栫殑宸ヤ綔阒熷垪锛屽拰寤虹珛阈捐〃闇瑕佺殑鎸囬拡銆俲ob鏁版嵁缁撴瀯瀹氢箟镄勬槸镎崭綔涓涓猨ob镄勬柟娉曞拰瀵硅薄锛岃繖锲炲埌绋嫔簭涓锛屽疄闄呬笂灏辨槸鎸囩殑鏄浜嬩欢鍙戠敓钖庯纴灏佽呭ソ镄刢lient缁撴瀯浣揿拰澶勭悊杩欎釜缁撴瀯浣撶殑鏂规硶銆倃orkqueue鏁版嵁缁撴瀯鎸囩殑鏄褰揿墠镄勫伐浣滈槦鍒椾腑镄勫伐浣滆咃纴浠ュ强宸ヤ綔阒熷垪涓镄勫緟瀹屾垚镄勫伐浣滐纴浠ュ强浜掓枼阌佸拰𨱒′欢鍙橀噺锛埚洜涓哄氢釜宸ヤ綔杩涚▼闇瑕佽块梾杩欎簺璧勬簮锛夈
鍏蜂綋镄勬祦绋嫔氨鏄锛岀敤涓涓涓荤嚎绋嬬洃钖涓涓濂楁帴瀛楋纴骞跺皢濂楁帴瀛楁帴鍙楀埌镄勮繛鎺accept锛屽苟鍒涘缓涓涓猚lient鏁版嵁缁撴瀯淇濆瓨璇ヨ繛鎺ョ殑淇℃伅锛屽湪杩欎釜client缁撴瀯涓娉ㄥ唽涓涓狰ufferevent浜嬩欢锛屾敞鍐屽埌client->evbase涓婏纸杩欐椂鍊栾繖鏄钖庆lient涓镄别vbase娉ㄥ唽浜嗕竴涓浜嬩欢杩樻病链夎繘琛屽惊鐜杩欎釜浜嬩欢闆嗭级銆
鎺ョ潃锛屽綋鐩戝惉鍒版煇涓猚lient链塨ufferevent浜嬩欢鍙戠敓锛屼富绾跨▼灏辨妸璇client缁撴瀯浣揿拰闇瑕佽繘琛岀殑宸ヤ綔鏂规硶鍖呰呮垚涓涓猨ob缁撴瀯锛岀劧钖庢妸杩欎釜job镓斿埌workqueue涓婂幓锛屽苟阃氱煡钖勪釜宸ヤ綔钥呫傝屽悗锛屽悇涓宸ヤ綔钥呭紑镌镄勭嚎绋嫔氨琚婵娲讳简锛岀柉镫傚湴铡粀orkqueue涓婂幓鎶㈠伐浣滃仛锛屾煇涓犸orker𨰾垮埌宸ヤ綔钖庯纴灏卞彲浠ヨВ鍖卝ob锛屾牴鎹甹ob镄勫伐浣滆存槑涔︼纸job_function锛夋搷浣滃伐浣滃硅薄锛坈lient锛変简銆傝繖閲岋纴job镄勫伐浣滆存槑链夋槸寰鐜痗lient涓镄刢lient->evbase锛屼簬鏄杩欐牱绾跨▼灏变细涓鐩村幓鐩戣呜繖涓杩炴帴镄勭姸镐侊纴濡傛灉链夋暟鎹灏辫繖浼氲皟鐢ㄥ洖璋冨嚱鏁拌繘琛屽勭悊銆傚悓镞讹纴杩欎釜绾跨▼涔熷氨鏄阒诲炲湪杩欓噷锛岃繖瀵硅繖涓涓杩炴帴璐熻矗銆
寤虹珛workqueue闇瑕佺殑缁撴瀯浣揿拰鍑芥暟链夛细
涓荤嚎绋嬬殑on_accept鍑芥暟涓猴细
job涓镄勫伐浣沧寚鍗椾负锛
璁捐℃濇兂锛 锅囱炬垜浠镄勭敤鎴峰緢澶氾纴楂桦苟鍙戯纴闀胯繛鎺ワ纴闾d箞鎴戜滑杩樻槸𨱒ョ敤I/O澶岖敤鍜岀嚎绋嬫睁瀹炵幇钖э纴鐢ㄤ竴涓鎺у埗绾跨▼阃氲繃I/O澶岖敤璐熻矗鐩戝惉鍜屽垎鍙戜簨浠讹纴鐢ㄤ竴缁勭嚎绋嬫睁𨱒ヨ繘琛屽勭悊浜嬩欢锛岃繖镙峰氨鍙浠ョ伒娲诲湴灏嗘带鍒堕昏緫鍜屼笟锷¢昏緫鍒嗗紑浜嗭纴瑙佷笅杩拌茶В銆
绋嫔簭鍒嗘瀽
鍏蜂綋镄勬祦绋嫔拰涓婇溃镄勫樊涓嶅氾纴鐢ㄤ竴涓涓荤嚎绋嬬洃钖涓涓濂楁帴瀛楋纴骞跺皢濂楁帴瀛楁帴鍙楀埌镄勮繛鎺accept锛屽苟鍒涘缓涓涓猚lient鏁版嵁缁撴瀯淇濆瓨璇ヨ繛鎺ョ殑淇℃伅锛屽湪杩欎釜client缁撴瀯涓娉ㄥ唽涓涓狰ufferevent浜嬩欢锛屼絾鏄杩欓噷锛屽皢浜嬩欢娉ㄥ唽鍒瘾ccept_evbase涓锛屼粛铹剁敤涓荤嚎绋嬭繘琛岀洃钖銆
钥岄溃瀵圭洃钖钖庡嚭鐜扮殑浜嬩欢锛屽皢client鍜屾搷浣渃lient镄勬柟娉曟墦鍖呮垚涓涓猨ob锛屾斁鍒颁笂杩扮殑workqueue涓铡伙纴璁╁伐浣滆繘绋嬫潵瀹屾垚銆傝繖镙风殑镎崭綔鍜屼笂杩扮殑宸鍒鍦ㄤ簬涓婅堪鏂规硶灏哹ufferevent娉ㄥ唽鍒瘫lient涓镄别vbase涓锛岀敤宸ヤ綔绾跨▼鐩戝惉锛岃屾湰鏂规硶鐢ㄤ富绾跨▼鐩戝惉锛屽伐浣灭嚎绋嬭礋璐e勭悊鐩戝惉浜х敓镄勪簨浠躲
杩栾佺殑宸鍒鍦ㄤ簬涓や釜鍑芥暟 on_accept鍑芥暟:
鍦╞uffered_on_read涓锛屾彁浜job銆
鍦╦ob宸ヤ綔鎸囧崡server_job_function涓灏卞彲浠ュ仛浣犲伐浣滆ュ仛镄勪簨鍎夸简锛屾牴鎹鍙戞潵镄勪俊鎭杩涜屾暟鎹搴揿勭悊锛宧ttp杩斿洖绛夌瓑銆