From: http://blog.csdn.net/kaitiren/article/details/35254577
?
libevent是一個基于事件觸發的網絡庫,memcached底層也是使用libevent庫,今天學習下。
總體來說,libevent有下面一些特點和優勢:
* 統一數據源, 統一I/O事件,信號和定時器這三種事件;
* 可移植,跨平臺支持多種I/O多路復用技術, epoll、poll、dev/poll、select 和kqueue 等;
* 對并發編程支持,避免競態條件;
* 高性能,由事件驅動;
* 輕量級,專注于網絡;
libevent有下面幾大部分組成:
*?事件管理包括各種IO(socket)、定時器、信號等事件,也是libevent應用最廣的模塊;
*?緩存管理是指evbuffer功能;
*?DNS是libevent提供的一個異步DNS查詢功能;
*?HTTP是libevent的一個輕量級http實現,包括服務器和客戶端
一些資料:
* libevent官網:http://libevent.org/?
* libevent API:http://www.monkey.org/~provos/libevent/doxygen-2.0.1/index.html
* CSDN上剖析得很贊的文章:http://blog.csdn.net/sparkliang/article/details/4957667
// =============================================================================================
下面寫了2個簡單的使用例子,一個是定時器,一個是TCP服務器,都只涉及到libevent的事件管理模塊。
一、簡單定時器:實現程序每秒輸出一個“Game Over!”
event_init() =>?evtimer_set() =>?event_add() =>event_dispatch()
[cpp]?view plaincopy
#include?<stdio.h>?? #include?<iostream>?? ?? ?? #include?<event.h>?? using?namespace?std;?? ?? ?? void?onTime(int?sock,?short?event,?void?*arg)?? {?? ????cout?<<?"Game?Over!"?<<?endl;?? ?? ????struct?timeval?tv;?? ????tv.tv_sec?=?1;?? ????tv.tv_usec?=?0;?? ?????? ????event_add((struct?event*)arg,?&tv);?? }?? ?? int?main()?? {?? ?????? ????event_init();?? ?? ????struct?event?evTime;?? ?????? ????evtimer_set(&evTime,?onTime,?&evTime);?? ?? ????struct?timeval?tv;?? ????tv.tv_sec?=?1;?? ????tv.tv_usec?=?0;?? ?????? ????event_add(&evTime,?&tv);?? ?? ?????? ????event_dispatch();?? ?? ????return?0;?? }??
編譯并執行,編譯加 -levent:
[cpp]?view plaincopy
gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest?#?mv?time.cpp?timer.cpp?? gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest?#?g++?-o?timer?timer.cpp?-levent?? gapp_devnet_1:/data/home/andyawang/code/2013_11/LibeventTest?#?./timer??? Game?Over!?? Game?Over!?? Game?Over!?? Game?Over!??
二、TCP服務器:
實現監聽本機8888端口并輸出客戶端發送過來的信息
event_base_new()=>event_set()=>event_base_set()=>event_add()=>event_base_dispatch()
[cpp]?view plaincopy
#include?<stdio.h>?? #include?<string.h>?? #include?<iostream>?? #include?<sys/socket.h>?????? #include?<netinet/in.h>?????? #include?<arpa/inet.h>?????? #include?<netdb.h>?? ?? #include?<event.h>?? using?namespace?std;?? ?? ?? struct?event_base*?base;?? ?? ?? void?onRead(int?iCliFd,?short?iEvent,?void?*arg)?? {?? ????int?iLen;?? ????char?buf[1500];?? ?? ????iLen?=?recv(iCliFd,?buf,?1500,?0);?? ?? ????if?(iLen?<=?0)?{?? ????????cout?<<?"Client?Close"?<<?endl;?? ?? ?????????? ????????struct?event?*pEvRead?=?(struct?event*)arg;?? ????????event_del(pEvRead);?? ????????delete?pEvRead;?? ?? ????????close(iCliFd);?? ????????return;?? ????}?? ?? ????buf[iLen]?=?0;?? ????cout?<<?"Client?Info:"?<<?buf?<<?endl;?? }?? ?? ?? void?onAccept(int?iSvrFd,?short?iEvent,?void?*arg)?? {?? ????int?iCliFd;?? ????struct?sockaddr_in?sCliAddr;?? ?? ????socklen_t?iSinSize?=?sizeof(sCliAddr);?? ????iCliFd?=?accept(iSvrFd,?(struct?sockaddr*)&sCliAddr,?&iSinSize);?? ?? ?????? ????struct?event?*pEvRead?=?new?event;?? ????event_set(pEvRead,?iCliFd,?EV_READ|EV_PERSIST,?onRead,?pEvRead);?? ????event_base_set(base,?pEvRead);?? ????event_add(pEvRead,?NULL);?? }?? ?? int?main()?? {?? ?? ????int?iSvrFd;???? ????struct?sockaddr_in?sSvrAddr;?? ???????????????? ????memset(&sSvrAddr,?0,?sizeof(sSvrAddr));???? ????sSvrAddr.sin_family?=?AF_INET;???? ????sSvrAddr.sin_addr.s_addr?=?inet_addr("127.0.0.1");?????? ????sSvrAddr.sin_port?=?htons(8888);????? ?????????????????????????????? ?????? ????iSvrFd?=?socket(AF_INET,?SOCK_STREAM,?0);???? ????bind(iSvrFd,?(struct?sockaddr*)&sSvrAddr,?sizeof(sSvrAddr));???? ????listen(iSvrFd,?10);?? ?? ?????? ????base?=?event_base_new();?? ?????? ????struct?event?evListen;?? ?????? ????event_set(&evListen,?iSvrFd,?EV_READ|EV_PERSIST,?onAccept,?NULL);?? ?????? ????event_base_set(base,?&evListen);?? ?????? ????event_add(&evListen,?NULL);?? ?????? ?????? ????event_base_dispatch(base);?? ?? ????return?0;?? } ?
cocos2dx加libevent庫
路徑: $path = cocos2dx/platform/third_party
1.win32
?? 將生成的libevent_core.lib,libevent_extras.lib放到$path/win32/libraries中
?? 頭文件event2和event-config.h 放到$path/win32/libevent中
?? VS中設置include path和 add lib
?
2.ios
?? 生成IOS平臺的庫文件(libevent_core.a,libevent_extra.a,libevent_pthreads.a)放到$path/ios/libraries中,注意:是IOS的庫文件,不是linux的
?? 頭文件放到$path/ios/libevent
? xcode中增加head search path 和 添加剛才的3個庫文件
? 庫文件找了也是用libevent的OnionBrowser生成
?
3.android
?? android實在在多坑了,搞了好久才搞定
? 問題列表
?? 1).logcat輸出調試:在proj.android/jni/andoird.mk 中加入LOCAL_CFLAGS := -DCOCOS2D_DEBUG=1
?? 2).在NDK BUILD過程中提示htons找不到,查了好久發現是自定義的endian.h和系統文件重名
?? 3).加好后bufferevent_socket_connect返回-1,連接失敗.
??????? 原因是沒有網絡權限,在proj.android/AndroidManifest.xml中加上 權限申請
??????? <uses-permission android:name="android.permission.INTERNET"></uses-permission>
?? 4) ndk build完后連接失敗,找不到一些庫函數,原因是在build libevent.a的時候注釋了一段,鏈接符"\"結果把后面的全都注釋掉了,
?????? 導致libevent.包不完整
?
??? 添加庫:在網上git找了個andoird用的libevent,用ndk build好后放到$path/android/libevent中,.mk文件寫法跟libcurl一樣
?? 鏈接:https://github.com/ventureresearch/libevent/tree/master
?? 然后在proj.android/jni/andoird.mk中加上LOCAL_STATIC_LIBRARIES += cocos_event_static;
??????????? ?$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libevent)
總結
以上是生活随笔為你收集整理的cocos2dx libevent简介和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。