基於事件的開源網路庫 libevent 應用例項

2021-06-23 02:44:06 字數 3504 閱讀 5913

本文例子不加修改在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 的類庫用以開發基於網路的可移...