libev的使用——结合Socket编程
首先推薦幾個(gè)我認(rèn)為學(xué)習(xí)libev比較好的blog,最后一個(gè)地址是官方文檔,給了我很多幫助:
http://vimersu.win/blog/2014/03/06/libev-study/
http://www.cnblogs.com/dirlt/archive/2011/09/07/2169344.html#sec-1
http://blog.csdn.net/woxiaozhi/article/details/16963641
http://www.cnblogs.com/wunaozai/p/3950249.html
http://wenku.baidu.com/link?url=z021OoHoevOJDNP1IVTmEcWvTKRoNKlfzi96k8gUKvcnvdZxlvW4diCihYlxFYRJVjtHSVtYrN451MIqlyznsmO0wUvjRslNPGOZopSIhP_
一.libev原理
之前簡(jiǎn)單寫過(guò)一篇libev的學(xué)習(xí):http://blog.csdn.net/cxy450019566/article/details/52416349
有時(shí)間可以看看,沒(méi)時(shí)間直接看這一篇文章。
需要理解的第一句話:Libev的核心是一個(gè)event loop。一個(gè)event loop,通俗講就是一個(gè)不停在循環(huán)運(yùn)行的事件。
需要理解的第二句話:Libev通過(guò)分配和注冊(cè)watcher對(duì)不同類型的事件進(jìn)行監(jiān)聽(tīng),當(dāng)監(jiān)聽(tīng)被觸發(fā)時(shí),進(jìn)行相應(yīng)的操作。在一個(gè)event loop中,我們可以設(shè)定對(duì)很多l(xiāng)ibev支持的事件(見(jiàn)上一篇博客)的監(jiān)聽(tīng)watcher,這些事件的監(jiān)聽(tīng)是異步進(jìn)行的,觸發(fā)任意一個(gè)監(jiān)聽(tīng)的事件,都可以根據(jù)我們的設(shè)定進(jìn)行某些操作。
理解了這兩句話,你就可以理解libev的作用,以及怎樣來(lái)使用libev。
二.通過(guò)簡(jiǎn)單示例了解libev基本用法
我們從官方示例,來(lái)學(xué)習(xí)libev的基本用法。
[cpp] view plain copy
通過(guò)上面的例子,就可以知道libev使用的思路:
首先,定義一個(gè)eventloop大容器 struct ev_loop,和想要的監(jiān)控事件ev_XXX。
其次,初始化想要監(jiān)控的事件,設(shè)置好回調(diào)函數(shù)和相應(yīng)的參數(shù)ev_XXX_init 。
接下來(lái),讓想要監(jiān)控的事件都投身到大容器中ev_XXX_start。
最后,讓大容器帶著小容器一起運(yùn)行起來(lái) ev_run 。
?
三.常用函數(shù)詳解
1.event loop 相關(guān)
(1)從創(chuàng)建說(shuō)起:
我們默認(rèn)使用EV_DEFAULT類型的loop,使用一下語(yǔ)句來(lái)創(chuàng)建:struct ev_loop *loop = EV_DEFAULT;
EV_DEFAULT宏是以下指令:
ev_default_loop(EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV);
返回一個(gè)最基礎(chǔ)的ev_loop,并自動(dòng)完成它的初始化,注意,如果程序中已經(jīng)執(zhí)行過(guò)該創(chuàng)建,將直接返回之前的創(chuàng)建。除此之外,更多自定義loop,可以使用該函數(shù):struct ev_loop*ev_loop_new (unsigned int flags)。
(2)讓ev_loop運(yùn)行起來(lái)
使用函數(shù)ev_run(loop, int flags)。
這里解釋一下flags的作用,用于設(shè)置ev_loop的運(yùn)行方式:
通常設(shè)置為0,表示該ev_loop在所有watcher結(jié)束后停止,也可以手動(dòng)break,官方鼓勵(lì)手動(dòng)break。
除了0之外,還有一些選擇,如EVRUN_NOWAIT、EVRUN_ONCE。具體請(qǐng)看官方文檔。
ev_run函數(shù)的源碼說(shuō)明。推薦博文:http://www.cnblogs.com/xiangshancuizhu/archive/2013/08/10/3250558.html
(3)ev_loop的停止
前面已經(jīng)說(shuō)過(guò),在flags設(shè)置為0的情況下,停止主要靠全部watcher停止或者手動(dòng)break。
手動(dòng)break用以下函數(shù):ev_break (loop,how)
其中,how代表停止的方式:
EVBREAK_ONE:停止最久遠(yuǎn)的那個(gè)ev_run
EVBREAK_ALL:停止所有的ev_run
2.ev_TYPE公共基礎(chǔ)
(1)watcher對(duì)應(yīng)的幾種狀態(tài)
initialiased:調(diào)用init函數(shù)初始化
active:調(diào)用start進(jìn)行注冊(cè)
pending:已經(jīng)觸發(fā)事件但是沒(méi)有處理
inactive:調(diào)用stop注銷。這個(gè)狀態(tài)等同于initialised這個(gè)狀態(tài)。
(2)ev_TYPE對(duì)應(yīng)不同類型的時(shí)間監(jiān)控,共有的標(biāo)準(zhǔn)化函數(shù)主要如下:
[cpp] view plain copy3.ev_io相關(guān)
(1)ev_io結(jié)構(gòu)
ev_io用來(lái)監(jiān)聽(tīng)io事件,當(dāng)有標(biāo)準(zhǔn)輸入或輸出時(shí),則會(huì)觸發(fā)事件,執(zhí)行回調(diào)函數(shù)。
[cpp] view plain copy(2)初始化
兩種方式:
方式一:ev_init(ev_TYPE *watcher, callback) ,ev_io_set(ev_io *ev, intfd, int events)
方式二:ev_io_init(ev_io*ev, callback,int fd, int events)
即需要設(shè)置監(jiān)聽(tīng)watcher,回調(diào)函數(shù)callback,文件描述符fd,監(jiān)聽(tīng)的事件events。
(3)運(yùn)行和停止
ev_io_start(EV_P_ev_io * w):綁定到ev_loop上
ev_io_stop(EV_P_ev_io * w):從ev_loop上撤離
4.ev_timer相關(guān)
(1)ev_timer結(jié)構(gòu)
ev_timer是一個(gè)相對(duì)時(shí)間的定時(shí)器,會(huì)在給定的時(shí)間點(diǎn)觸發(fā)事件,還可以在固定的時(shí)間間隔之后再次觸發(fā)超時(shí)事件。
[cpp] view plain copy(2)初始化
同樣兩種方式:
方式一:ev_init(ev_TYPE *watcher, callback) ,ev_timer_set (ev_timer *,ev_tstamp after, ev_tstamp repeat)
方式二:ev_timer_init(ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)
即需要設(shè)置監(jiān)聽(tīng)watcher,回調(diào)函數(shù)callback,定時(shí)器時(shí)間after,是否重復(fù)repeat。
其中,repeat設(shè)置為0表示定時(shí)器只觸發(fā)一次,設(shè)置為正整數(shù)則間隔after秒一直不斷觸發(fā)。
(3)運(yùn)行和停止
ev_timer_start(EV_P_ev_io * w):綁定到ev_loop上
ev_timer_stop(EV_P_ev_io * w):從ev_loop上撤離
(4)其它函數(shù)
ev_timer_again(loop, ev_timer *) :重啟,對(duì)于不同狀態(tài)的timer效果不同。
ev_tstampev_timer_remaining (loop, ev_timer *):返回現(xiàn)在到下一次觸發(fā)定時(shí)器之間的時(shí)間。
四.在Socket編程的應(yīng)用實(shí)例
libev用在Socket編程上有幾個(gè)好處,用ev_timer可以控制發(fā)送頻率,用ev_io可以方便地異步進(jìn)行包的接收。下面的實(shí)例就實(shí)現(xiàn)的這個(gè)流程,直接用代碼解釋了:
[cpp] view plain copy
總結(jié)
以上是生活随笔為你收集整理的libev的使用——结合Socket编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: boost bind使用指南
- 下一篇: mmap使用实例