本文例子不加修改在windows下執行(須定義巨集win32,鏈結ws2_32.lib,libevent_core.lib),稍加修改(例如去掉windows所特有的socket初始化)可執行於linux。
該例子建立了乙個event_base,在此base上,增加了兩個event,也就是設定了兩個定時器,主要用來測試事件處理是否是多執行緒(結論是單執行緒)。這個例子也同時試驗了給事件函式傳入自定義引數的情況(例子中是乙個整數)。
在main()函式中呼叫testlibevent_timer()即可執行該例子。
[cpp]view plain
copy
#include
#include
#include "libevent\event.h"
#include "libevent_timer.h"
#include "libevent\event_struct.h"
#include "libevent\util.h"
struct
timeval lasttime;
typedef
struct
event_arg_t;
void
timeout_cb1(evutil_socket_t fd,
short
event,
void
*arg)
void
timeout_cb2(evutil_socket_t fd,
short
event,
void
*arg)
inttestlibevent_timer(
void
)
這個例子比較簡單,監視的控制代碼為-1,實際上不算是事件發生了,而是每次發生超時,呼叫了事件處理函式。
這個例子建立乙個監聽某埠的伺服器,採用事件的方式來處理請求。
[cpp]view plain
copy
#include
#include
#include "libevent\event.h"
#include "libevent\event_struct.h"
#include "libevent\buffer.h"
#include "libevent\bufferevent.h"
#include "libevent\listener.h"
#include "libevent\util.h"
void
client_process(evutil_socket_t fd)
void
echo_read_cb(
struct
bufferevent *bev,
void
*ctx)
void
echo_event_cb(
struct
bufferevent *bev,
short
events,
void
*ctx)
} void
listener_cb(
struct
evconnlistener *listener, evutil_socket_t fd,
struct
sockaddr *sa,
intsocklen,
void
*arg)
//方法二:自己處理recv,read
//
} void
accept_interrupt(evutil_socket_t fd,
short
what,
void
*arg)
} intsocket_server_event_test(
void
)
intport = 2200;
intmax_conn = 10;
//backlog
struct
event_base *base;
struct
evconnlistener *listener;
struct
sockaddr_in sin;
memset(&sin, 0, sizeof
(sin));
sin.sin_family = af_inet;
sin.sin_port = htons(port);
// initalize the event library
base = event_base_new();
if(!base)
return
-2;
listener = evconnlistener_new_bind(base, listener_cb, (void
*)base,
lev_opt_reuseable|lev_opt_close_on_free, max_conn,
(struct
sockaddr*)&sin,
sizeof
(sin));
event_t interrupt_ev;
inthandle = 3;
struct
timeval tv;
interrupt_ev.parg = &handle;
event_assign(&interrupt_ev.eventbody, base, -1, ev_persist, accept_interrupt, (void
*) &interrupt_ev);
evutil_timerclear(&tv);
tv.tv_sec = 40;
event_add(&interrupt_ev.eventbody, &tv);
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
wsacleanup();
return
0;
}
上面的例子中,base需要監視兩個事件,listening事件和定時器事件,設定定時器事件的目的是使該處理執行緒能有「機會」處理一下非listen事情,例如接到退出命令,停止listening等。接收到外部連線後,可以有兩種辦法:一是採用libevent的buffer系列方法讀取埠,二是自己處理讀寫(可採用多執行緒)。
研究libevent的執行機制,已超出本文範圍。採用編譯好的lib庫的好處在於不必考慮其內部的執行,我們只要包含.h檔案即可。libevent的原始檔比較零散,作者在windows平台上,將它們集合在一起(乙個目錄下),修改了其引用路徑,可以源**級包含在專案中,這樣可以設定斷點來觀察libevent的執行。有興趣的同行可以從
這裡
網路程式設計 開源庫
okhttp教程 okhttp3解析 okhttp的使用 okhttp解析,及封裝 vollery的用法 vollery基本用法,載入網路,定製request vollery簡介 記錄一段socket主要做了啥事的理解 tcp和udp的報文結構,每段報文裡面除了資料本身,還包含了包的目的位址和埠,包...
iOS經典的網路開源庫
alamofire swift最流行的http請求庫,很多開發動用到了這個。比較經典,比較方便。詳細的使用方法,在git上作者都給出了 just比較簡單的http請求庫,基本的get,post方法都包含了。swifthttp簡單的http請求,這個可能很多人都接觸過,封裝裝自nsurlsession...
C 開源C C 網路庫
1 ace 龐大 複雜,適合大型專案。開源 免費,不依賴第三方庫,支援跨平台。2 asio asio基於boost開發的非同步io庫,封裝了socket,簡化基於socket程式的開發。開源 免費,支援跨平台。3 poco poco c libraries 提供一套 c 的類庫用以開發基於網路的可移...