??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合视频网,无码超乳爆乳中文字幕久久 ,日韩欧美亚洲国产精品字幕久久久http://m.shnenglu.com/mysileng/category/20374.htmlzh-cnTue, 25 Jun 2013 03:33:08 GMTTue, 25 Jun 2013 03:33:08 GMT60译Qlibevent参考手册第九章Q连接监听器Q接受TCPq接 (十一) (?http://m.shnenglu.com/mysileng/archive/2013/02/07/197763.html鑫龙鑫龙Thu, 07 Feb 2013 02:48:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/02/07/197763.htmlhttp://m.shnenglu.com/mysileng/comments/197763.htmlhttp://m.shnenglu.com/mysileng/archive/2013/02/07/197763.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/197763.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/197763.html阅读全文

鑫龙 2013-02-07 10:48 发表评论
]]>
译Qlibevent参考手册第八章QevbufferQ缓冲IO实用功能 (? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/05/197748.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 05 Feb 2013 10:52:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/05/197748.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197748.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/05/197748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197748.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197748.html</trackback:ping><description><![CDATA[     摘要: 译自http://www.wangafu.net/~nickm/libevent-book/Ref7_evbuffer.htmllibevent的evbuffer实现了ؓ向后面添加数据和从前面移除数据而优化的字节队列。evbuffer用于处理~冲|络IO?#8220;~冲”部分。它不提供调度IO或者当IOqA时触发IO的功能:q是bufferevent的工作。除非特别说明,本章描述?..  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/05/197748.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-05 18:52 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/05/197748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译Qlibevent参考手册第七章QBuffereventQ高U话?(? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/05/197746.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 05 Feb 2013 09:39:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/05/197746.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197746.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/05/197746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197746.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197746.html</trackback:ping><description><![CDATA[     摘要: 译自http://www.wangafu.net/~nickm/libevent-book/Ref6a_advanced_bufferevents.html 本章描述bufferevent的一些对通常使用不必要的高特征。如果只惛_习如何用buffereventQ可以蟩q这一章,直接阅读下一章? 成对的bufferevent有时候网l程序需要与自n通信。比如说Q通过某些协议...  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/05/197746.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-05 17:39 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/05/197746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译Qlibevent参考手册第六章QbuffereventQ概念和入门 (? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/05/197740.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 05 Feb 2013 06:38:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/05/197740.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197740.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/05/197740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197740.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197740.html</trackback:ping><description><![CDATA[     摘要: 很多时候,除了响应事g之外Q应用还希望做一定的数据~冲。比如说Q写入数据的时候,通常的运行模式是Ql 军_要向q接写入一些数据,把数据放入到~冲Zl {待q接可以写入l 写入量多的数据l C写入了多数据,如果q有更多数据要写入,{待q接再次可以写入q种~冲IO模式很通用Qlibevent为此提供了一U通用机制Q即bufferevent。buffere...  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/05/197740.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-05 14:38 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/05/197740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译Qlibevent参考手册第五章Q辅助类型和函数 (? (?http://m.shnenglu.com/mysileng/archive/2013/02/05/197739.html鑫龙鑫龙Tue, 05 Feb 2013 06:19:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/02/05/197739.htmlhttp://m.shnenglu.com/mysileng/comments/197739.htmlhttp://m.shnenglu.com/mysileng/archive/2013/02/05/197739.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/197739.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/197739.html阅读全文

鑫龙 2013-02-05 14:19 发表评论
]]>
译Qlibevent参考手册第四章Q与事g一起工?(? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/04/197720.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 04 Feb 2013 09:59:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/04/197720.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197720.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/04/197720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197720.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197720.html</trackback:ping><description><![CDATA[     摘要: 译自http://www.wangafu.net/~nickm/libevent-book/Ref4_event.html转自:http://blog.sina.com.cn/s/blog_56dee71a0100qi0y.htmllibevent的基本操作单元是事g。每个事件代表一l条件的集合Q这些条件包括:v 文g描述W已l就l,可以d或者写入v 文g描述W变为就l状态,...  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/04/197720.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-04 17:59 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/04/197720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译QLibevent参考手册第三章Q与事g循环一起工?(? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/04/197719.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 04 Feb 2013 09:36:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/04/197719.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197719.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/04/197719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197719.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197719.html</trackback:ping><description><![CDATA[<div><span style="font-family: simsun; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; color: #464646; ">译自<a style="text-decoration: none; color: #41646f; ">http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html<br /></a></span><span id="h33pbn1" class="Apple-style-span" style="font-family: 新宋? color: #000000; ">转自:<a ><span style="color: #000000; ">http://blog.sina.com.cn/s/blog_56dee71a0100qe76.html</span></a></span><div><h1 style="color: #464646; "><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">1 <wbr>q行循环</span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; color: #464646; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">一旦有了一个已l注册了某些事g的event_baseQ关于如何创建和注册事gL下一节)Q就需要让libevent{待事gq且通知事g的发生?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? font-size: 14pt; font-weight: bold; "><font class="Apple-style-span" color="#0000FF">接口</font><br /><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; color: #0000ff; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> EVLOOP_ONCE             0x01</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> EVLOOP_NONBLOCK         0x02</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; "> EVLOOP_NO_EXIT_ON_EMPTY 0x04</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_loop(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">, </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> flags);</span></div><div style="color: #0000ff; "><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">默认情况下,event_base_loopQ)函数q行event_base直到其中没有已经注册的事件ؓ止。执行@环的时候,函数重复地检查是否有M已经注册的事件被触发Q比如说Q读事g的文件描q符已经qAQ可以读取了Q或者超时事件的时旉卛_到达Q。如果有事g被触发,函数标记被触发的事g?#8220;Ȁzȝ”Qƈ且执行这些事件?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">在flags参数中设|一个或者多个标志就可以改变event_base_loopQ)的行为。如果设|了EVLOOP_ONCEQ@环将{待某些事g成ؓȀzȝQ执行激zȝ事g直到没有更多的事件可以执行,然会q回。如果设|了EVLOOP_NONBLOCKQ@环不会等待事件被触发Q@环将仅仅是否有事g已经qAQ可以立卌发,如果有,则执行事件的回调?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">完成工作后,如果正常退出,event_base_loopQ)q回0Q如果因为后端中的某些未处理错误而退出,则返?1?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">为帮助理解,q里l出event_base_loopQ)的算法概要:</span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">伪代?/span></h2></span></div><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; color: #0000ff; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (any events are registered with the loop,<br />        or EVLOOP_NO_EXIT_ON_EMPTY was </span><span style="color: #0000FF; ">set</span><span style="color: #000000; ">) {<br /><br />    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (EVLOOP_NONBLOCK was </span><span style="color: #0000FF; ">set</span><span style="color: #000000; ">, or any events are already active)<br />        If any registered events have triggered, mark them active.<br />    </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />        Wait until at least one </span><span style="color: #0000FF; ">event</span><span style="color: #000000; "> has triggered, and mark it active.<br /><br />    </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; p </span><span style="color: #000000; "><</span><span style="color: #000000; "> n_priorities; </span><span style="color: #000000; ">++</span><span style="color: #000000; ">p {<br />       </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (any </span><span style="color: #0000FF; ">event</span><span style="color: #000000; "> with priority of p </span><span style="color: #0000FF; ">is</span><span style="color: #000000; "> active) {<br />          Run all active events with priority of p.<br />          </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">; </span><span style="color: #008000; ">/*</span><span style="color: #008000; "> Do not run any events of a less important priority </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />       }<br />    }<br /><br />    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (EVLOOP_ONCE was </span><span style="color: #0000FF; ">set</span><span style="color: #000000; "> or EVLOOP_NONBLOCK was </span><span style="color: #0000FF; ">set</span><span style="color: #000000; ">)<br />       </span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />}</span></div><div style="color: #0000ff; "><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">为方便v见,也可以调?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">接口</span></h2></span></div><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; color: #0000ff; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_dispatch(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);</span></div><div style="color: #0000ff; "><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">event_base_dispatchQ){同于没有设|标志的event_base_loopQ)。所以,event_base_dispatchQ)一直运行,直到没有已经注册的事件了Q或者调用了event_base_loopbreakQ)或者event_base_loopexitQ)为止?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q些函数定义?lt;event2/event.h>中,从libevent <wbr>1.0版就存在了?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">2 <wbr>停止循环</span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">如果惛_U除所有已注册的事件之前停止活动的事g循环Q可以调用两个稍有不同的函数?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">接口</span></h2></span></div><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; color: #0000ff; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_loopexit(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">,<br />                        </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> timeval </span><span style="color: #000000; ">*</span><span style="color: #000000; ">tv);<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_loopbreak(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);</span></div><div style="color: #0000ff; "><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">event_base_loopexitQ)让event_base在给定时间之后停止@环。如果tv参数为NULLQevent_base会立卛_止@环,没有延时。如果event_base当前正在执行MȀzM件的回调Q则回调会l运行,直到q行完所有激zM件的回调之才退出?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">event_base_loopbreakQ)让event_base立即退出@环。它与event_base_loopexitQbase,NULLQ的不同在于Q如果event_base当前正在执行ȀzM件的回调Q它在执行完当前正在处理的事g后立即退出?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">注意event_base_loopexit(base,NULL)和event_base_loopbreak(base)在事件@环没有运行时的行Z同:前者安排下一ơ事件@环在下一轮回调完成后立即停止Q就好像带EVLOOP_ONCE标志调用一PQ后者却仅仅停止当前正在q行的@环,如果事g循环没有q行Q则没有M效果?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q两个函数都在成功时q回0Q失败时q回-1?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">CZQ立卛_?/span></h2></span></div><div style="background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">event2</span><span style="color: #000000; ">/</span><span style="color: #0000ff; ">event</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; "> Here's a callback function that calls loopbreak </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000ff; ">void</span><span style="color: #000000; "> cb(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; "> sock, </span><span style="color: #0000ff; ">short</span><span style="color: #000000; "> what, </span><span style="color: #0000ff; ">void</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg)<br />{<br />    </span><span style="color: #0000ff; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000ff; ">base</span><span style="color: #000000; "> </span><span style="color: #000000; ">=</span><span style="color: #000000; "> arg;<br />    event_base_loopbreak(</span><span style="color: #0000ff; ">base</span><span style="color: #000000; ">);<br />}<br /><br /></span><span style="color: #0000ff; ">void</span><span style="color: #000000; "> main_loop(</span><span style="color: #0000ff; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000ff; ">base</span><span style="color: #000000; ">, evutil_socket_t watchdog_fd)<br />{<br />    </span><span style="color: #0000ff; ">struct</span><span style="color: #000000; "> </span><span style="color: #0000ff; ">event</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #000000; ">watchdog_event;<br /><br />    </span><span style="color: #008000; ">/*</span><span style="color: #008000; "> Construct a new event to trigger whenever there are any bytes to<br />       read from a watchdog socket.  When that happens, we'll call the<br />       cb function, which will make the loop exit immediately without<br />       running any other active events at all.<br />     </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />    watchdog_event </span><span style="color: #000000; ">=</span><span style="color: #000000; "> event_new(</span><span style="color: #0000ff; ">base</span><span style="color: #000000; ">, watchdog_fd, EV_READ, cb, </span><span style="color: #0000ff; ">base</span><span style="color: #000000; ">);<br /><br />    event_add(watchdog_event, NULL);<br /><br />    event_base_dispatch(</span><span style="color: #0000ff; ">base</span><span style="color: #000000; ">);<br />}</span></div><div style="color: #0000ff; "><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">CZQ执行事件@?0U,然后退?/span></h2></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include </span><span style="color: #000000; "><</span><span style="color: #000000; ">event2</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">event</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">></span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> run_base_with_ticks(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">)<br />{<br />  </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> timeval ten_sec;<br /><br />  ten_sec.tv_sec </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />  ten_sec.tv_usec </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />  </span><span style="color: #008000; ">/*</span><span style="color: #008000; "> Now we run the event_base for a series of 10-second intervals, printing<br />     "Tick" after each.  For a much better way to implement a 10-second<br />     timer, see the section below about persistent timer events. </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />  </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (</span><span style="color: #000000; ">1</span><span style="color: #000000; ">) {<br />     </span><span style="color: #008000; ">/*</span><span style="color: #008000; "> This schedules an exit ten seconds from now. </span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />     event_base_loopexit(</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">, </span><span style="color: #000000; ">&</span><span style="color: #000000; ">ten_sec);<br /><br />     event_base_dispatch(</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);<br />     puts(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Tick</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />  }<br />}</span></div><div><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">有时候需要知道对event_base_dispatchQ)或者event_base_loopQ)的调用是正常退出的Q还是因用event_base_loopexitQ)或者event_base_breakQ)而退出的。可以调用下q函数来定是否调用了loopexit或者break函数?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">接口</span></h2></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_got_exit(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_got_break(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">);</span></div><div><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q两个函数分别会在@环是因ؓ调用event_base_loopexitQ)或者event_base_breakQ)而退出的时候返回trueQ否则返回false。下ơ启动事件@环的时候,q些g被重设?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q些函数声明?lt;event2/event.h>中。event_break_loopexit()函数首次在libevent <wbr>1.0c版本中实玎ͼevent_break_loopbreak()首次在libevent <wbr>1.4.3版本中实现?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">3 <wbr>查内部时间缓?/span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">有时候需要在事g回调中获取当前时间的q似视图Q但不想调用gettimeofday()Q可能是因ؓOSgettimeofday()作ؓpȝ调用实现Q而你试图避免pȝ调用的开销Q?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">在回调中Q可以请求libevent开始本轮回调时的当前时间视图?/span></p><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">接口</span></h2></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span><span style="color: #000000; "> event_base_gettimeofday_cached(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">,<br />    </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> timeval </span><span style="color: #000000; ">*</span><span style="color: #000000; ">tv_out);</span></div><div><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">如果当前正在执行回调Qevent_base_gettimeofday_cached()函数讄tv_out参数的gؓ~存的时间。否则,函数调用evutil_gettimeofday()获取真正的当前时间。成功时函数q回0Q失败时q回负数?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">注意Q因为libevent在开始执行回调的时候缓存时间|所以这个D是有一点不_的。如果回调执行很长时_q个值将非常不精?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q个函数是libevent <wbr>2.0.4-alpha新引入的?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">4 <wbr>转储event_base的状?/span></h1><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">接口</span></h2></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; "> event_base_dump_events(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> event_base </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">base</span><span style="color: #000000; ">, FILE </span><span style="color: #000000; ">*</span><span style="color: #000000; ">f);</span></div><div><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">为帮助调试程序(或者调试libeventQ,有时候可能需要加入到event_base的事件及其状态的完整列表。调用event_base_dump_events()可以这个列表输出到指定的文件中?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q个列表是h可读的,未来版本的libevent会改变其格式?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">q个函数在libevent <wbr>2.0.1-alpha版本中引入?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">5 <wbr>废弃的事件@环函?/span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">前面已经讨论q,老版本的libevent <wbr>h“当前”event_base的概c?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">本文讨论的某些事件@环函数具有操作当前event_base的变体。除了没有base参数外,q些函数跟当前新版本函数的行为相同?/span><span id="v35551z" class="Apple-style-span" style="font-family: 新宋? font-size: 19px; font-weight: bold; line-height: 28px; color: #000000; "><img src="http://m.shnenglu.com/images/cppblog_com/mysileng/QQ截图20130204173427.jpg" width="1057" height="188" alt="" /></span></p></span></div><div><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; font-weight: normal; "><div><h2><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 新宋? color: #0000ff; font-size: 14pt; font-weight: bold; ">注意</span></h2><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: 21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 新宋? font-size: 10.5pt; ">2.0版本之前的event_base是不支持锁的Q所以这些函数ƈ不是完全U程安全的:不允许在执行事g循环的线E之外的其他U程中调用_loopbreak()或者_loopexit()函数?/span></p></div></span></div></span></h2></div></span></div><img src ="http://m.shnenglu.com/mysileng/aggbug/197719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-04 17:36 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/04/197719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译Qlibevent参考手册第二章Q创建event_base (? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/04/197718.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 04 Feb 2013 09:18:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/04/197718.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197718.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/04/197718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197718.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197718.html</trackback:ping><description><![CDATA[     摘要: 译自http://www.wangafu.net/~nickm/libevent-book/Ref2_eventbase.html转自:http://blog.sina.com.cn/s/blog_56dee71a0100qdxx.html 使用libevent函数之前需要分配一个或者多个event_basel构体。每个event_basel构体持有一个事仉合,可以以定哪个事g?..  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/04/197718.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-04 17:18 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/04/197718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译QLibevent参考手册第一章:讄libevent (? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/04/197717.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 04 Feb 2013 09:07:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/04/197717.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197717.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/04/197717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197717.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197717.html</trackback:ping><description><![CDATA[     摘要: 译自:http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html转自http://blog.sina.com.cn/s/blog_56dee71a0100q9ks.htmllibevent有一些被整个q程׃n的、媄响整个库的全局讄。必d调用libevent库的M其他部分之前修改q些讄Q否则,libevent会进入不一致的?..  <a href='http://m.shnenglu.com/mysileng/archive/2013/02/04/197717.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/197717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-04 17:07 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/04/197717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译QLibevent参考手册:前言 (? Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/02/04/197716.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Mon, 04 Feb 2013 08:58:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/02/04/197716.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197716.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/02/04/197716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197716.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197716.html</trackback:ping><description><![CDATA[<div><span style="color: #464646; font-family: simsun; "><h1><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">译自:<a title="http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html" style="text-decoration: none; color: #41646f; ">http://www.wangafu.net/~nickm/libevent-book/Ref0_meta.html<br /><span style="color: #000000; ">转自:</span></a><a ><span style="color: #000000; ">http://blog.sina.com.cn/s/blog_56dee71a0100q7j6.html</span></a><br /><br /></span></h1><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 宋体; color: #0000ff; font-size: 14pt; font-weight: bold; ">1 <wbr> 从一万英外看Libevent</span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">Libevent是用于编写高速可UL非阻塞IO应用的库Q其设计目标是:</span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">可移植性:使用libevent~写的程序应该可以在libevent支持的所有^C工作。即使没有好的方式进行非dIOQlibevent也应该支持一般的方式Q让E序可以在受限的环境中运行?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">速度Qlibevent试使用每个q_上最高速的非阻塞IO实现Qƈ且不引入太多的额外开销?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">可扩展性:libevent被设计ؓE序即需要上万个zd套接字的时候也可以良好工作?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">方便Q无ZӞ最自然的用libevent~写E序的方式应该是E_的、可UL的?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "> <wbr></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent׃列组件构成:</span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">evutilQ用于抽象不同^台网l实现差异的通用功能?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">event和event_baseQlibevent的核心,为各U^台特定的、基于事件的非阻塞IO后端提供抽象APIQ让E序可以知道套接字何时已l准备好Q可以读或者写Qƈ且处理基本的时功能Q检OS信号?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">buffereventQؓlibeventZ事g的核心提供用更方便的封装。除了通知E序套接字已l准备好d之外Q还让程序可以请求缓冲的d操作Q可以知道何时IO已经真正发生。(bufferevent接口有多个后端,可以采用pȝ能够提供的更快的非阻塞IO方式Q如Windows中的IOCP。)</span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">evbufferQ在bufferevent层之下实C~冲功能Qƈ且提供了方便有效的访问函数?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">evhttpQ一个简单的HTTP客户?服务器实现?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">evdnsQ一个简单的DNS客户?服务器实现?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">evrpcQ一个简单的RPC实现?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 宋体; color: #0000ff; font-size: 14pt; font-weight: bold; ">2 <wbr> ?/span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">创徏libeventӞ默认安装下列库:</span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent_coreQ所有核心的事g和缓冲功能,包含了所有的event_base、evbuffer、bufferevent和工具函数?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent_extraQ定义了E序可能需要,也可能不需要的协议特定功能Q包括HTTP、DNS和RPC?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libeventQ这个库因ؓ历史原因而存在,它包含libevent_core和libevent_extra的内宏V不应该使用q个库,未来版本的libevent可能Lq个库?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">某些q_上可能安装下列库Q?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent_pthreadsQ添加基于pthread可移植线E库的线E和锁定实现。它独立于libevent_coreQ这L序用libevent时就不需要链接到pthreadQ除非是以多U程方式使用libevent?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent_opensslQ这个库Z用bufferevent和OpenSSLq行加密的通信提供支持。它独立于libevent_coreQ这L序用libevent时就不需要链接到OpenSSLQ除非是q行加密通信?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 宋体; color: #0000ff; font-size: 14pt; font-weight: bold; ">3 头文?/span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent公用头文仉安装在event2目录中,分ؓ三类Q?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">API头文Ӟ定义libevent公用接口。这cd文g没有特定后缀?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">兼容头文Ӟ为已废弃的函数提供兼容的头部包含定义。不应该使用q类头文Ӟ除非是在UL使用较老版本libevent的程序时?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">l构头文Ӟq类头文件以相对不稳定的布局定义各种l构体。这些结构体中的一些是Z提供快速访问而暴Ԍ一些是因ؓ历史原因而暴霌Ӏ直接依赖这cd文g中的Ml构体都会破坏程序对其他版本libevent的二q制兼容性,有时候是以非帔R以调试的方式出现。这cd文gh后缀“_struct.h”?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">Q还存在不在event2目录中的较老版本libevent的头文gQ请参考下节:如果需要用老版本libeventQ?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 宋体; color: #0000ff; font-size: 14pt; font-weight: bold; ">4 如果需要用老版本libevent</span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">libevent 2.0以更合理的、不易出错的方式修正了API。如果可能,~写新程序时应该使用libevent 2.0。但是有时候可能需要用较老的APIQ例如在升已存的应用时Q或者支持因为某些原因不能安?.0或者更新版本libevent的环境时?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">较老版本的libevent头文件较,也不安装在event2目录中?br /><img src="http://m.shnenglu.com/images/cppblog_com/mysileng/QQ截图20130204165731.jpg" width="980" height="214" alt="" /><br /></span></p><div><span style="font-family: simsun; "><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">?.0以及以后版本的libevent中,老的头文件仍然会作ؓ新头文g的封装而存在?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">其他关于使用较老版本的提示Q?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">1.4版之前只有一个库libeventQ它包含现在分散到libevent_core和libevent_extra中的所有功能?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; text-indent: -21pt; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: Wingdings; font-size: 10.5pt; ">v</span> <span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">2.0版之前不支持锁定Q只有确定不同时在多个线E中使用同一个结构体Ӟlibevent才是U程安全的?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: left; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">下面的节q将讨论特定代码区域可能遇到的已l废弃的API?/span></p><h1><span style="word-wrap: normal; word-break: normal; line-height: 28px; font-family: 宋体; color: #0000ff; font-size: 14pt; font-weight: bold; ">5 关于版本状态的提示</span></h1><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">1.4.7及以前版本应该被认ؓ是完全废弃的?.3之前的版本应该被认ؓ是充满bug的?/span></p><p style="margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; text-align: justify; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; font-family: 宋体; font-size: 10.5pt; ">Q此外,不要向libeventl护者发送Q何关?.4.x或者更早版本的新特征,q些版本被认为是E_的发布版本。如果在1.3x或者更早版本中发现bugQ在报告之前L定在最新的E_发布版本中问题仍然存在:后箋发布可能已经解决了问题。)</span></p></span></div><br /></span><p> </p></div><img src ="http://m.shnenglu.com/mysileng/aggbug/197716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-02-04 16:58 <a href="http://m.shnenglu.com/mysileng/archive/2013/02/04/197716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译Q用Libevent的快速可UL非阻塞网l编E:异步IO?(一) (?http://m.shnenglu.com/mysileng/archive/2013/02/04/197715.html鑫龙鑫龙Mon, 04 Feb 2013 08:24:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/02/04/197715.htmlhttp://m.shnenglu.com/mysileng/comments/197715.htmlhttp://m.shnenglu.com/mysileng/archive/2013/02/04/197715.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/197715.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/197715.html阅读全文

鑫龙 2013-02-04 16:24 发表评论
]]>
libevent: evbuffer~冲 (?http://m.shnenglu.com/mysileng/archive/2013/02/01/197671.html鑫龙鑫龙Fri, 01 Feb 2013 12:15:00 GMThttp://m.shnenglu.com/mysileng/archive/2013/02/01/197671.htmlhttp://m.shnenglu.com/mysileng/comments/197671.htmlhttp://m.shnenglu.com/mysileng/archive/2013/02/01/197671.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/197671.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/197671.html

前言

    可以说对于Q何网l库(模块)而言Q一个缓冲模块都是必不可的。缓冲模块主要用于缓冲从|络接收到的数据Q以?br />用户提交的数?用于发?。很多时候,我们q需要将|络模块?非TCP?的这些缓冲数据拷贝到用户层,而这些内存拷?br />都会消耗时间?br />    在这里,我简要分析下libevent的相关代?event.h和buffer.c)?/p>

l构

    关于libevent的缓冲模块,主要是围绕evbufferl构体展开。先看下evbuffer的定义:

struct evbuffer{
  
// 当前有效~冲区的内存起始地址
 u_char *buffer; 
  
// 整个分配(realloc)用来~冲的内存v始地址
  u_char *orig_buffer; 
  
// origin_buffer和buffer之间的字节数
 size_t misalign; 
  
// 整个分配用来~冲的内存字节数
 size_t totallen; 
  
// 当前有效~冲区的长度(字节?
 size_t off; 
  
//回到函数Q当~冲区有变化的时候会被调?/span>
 void (*cb)(struct evbuffer *, size_t, size_t, void *);
  
//回调函数的参?/span>
 void *cbarg; 
};
 libevent的缓冲是一个连l的内存区域Q其处理数据的方?写数据和L?更像一个队列操作方式:从后写入Q从?br />d。evbuffer分别讄相关指针(一个指?用于指示d位置和写入位|。其大致l构如图Q?/span>

    orig_buffer指向由realloc分配的连l内存区域,buffer指向有效数据的内存区域,totallen表示orig_buffer指向的内?br />区域的大,misalign表示buffer相对于orig_buffer的偏U,off表示有效数据的长度?/span>

实际q作

    q里我将l合具体的代码分析libevent是如何操作上面那个队列式的evbuffer的,先看一些辅助函敎ͼ

void evbuffer_drain(struct evbuffer *buf, size_t len)

 

    该函C要操作一些指标,当每ơ从evbuffer里读取数据时Qlibevent便会buffer指针后移Q同时增大misalignQ减offQ?br />而该函数正是做这件事的。说白了Q该函数是用于调整~冲队列的前向指标?br />

int evbuffer_expand(struct evbuffer *buf, size_t datlen)

 

    该函数用于扩充evbuffer的容量。每ơ向evbuffer写数据时Q都是将数据写到buffer+off后,buffer到buffer+off之间已被
使用Q保存的是有效数据,而orig_buffer和buffer之间则是因ؓd数据Ud指标而Ş成的无效区域?br />    evbuffer_expand的扩充策略在于,首先判断如果让出orig_buffer和buffer之间的空闲区域是否可以容Ux加的数据Q如?br />可以Q则Udbuffer和buffer+off之间的数据到orig_buffer和orig_buffer+off之间(有可能发生内存重叠,所以这里移动调用的
是memmove)Q然后把新的数据拯到orig_buffer+off之后Q如果不可以容纳Q那么重新分配更大的I间(realloc)Q同样会Ud
数据?br />    扩充内存的策略ؓQ确保新的内存区域最尺ؓ256Q且以乘?的方式逐步扩大(256?12?024?..)?/p>

    了解了以上两个函敎ͼ看其他函数就比较单了。可以看看具体的L据和写数据:


int evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen)

 

    该函数用于添加一D는h据到evbuffer中。很单,是先判断是否有_的空闲内存,如果没有则调用evbuffer_expand
扩充之,然后直接memcpyQ更新off指标?br />

int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen)

 

    该函数用于将evbuffer中的数据复制l用L?L?。简单地数据memcpyQ然后调用evbuffer_drainUd相关指标?br />

struct evbuffer* evbuffer_new(void)
动态分配一个struct evbufferl构Q需要调用evbuffer_free释放内存?br />
void evbuffer_free(struct evbuffer *buffer)
释放buffer所占用的内存?br />
int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)

Ud数据从一个evbuffer到另一个evbuffer?/span>

实际上还是调用了evbuffer_addd数据到outbuf中。但会清除inbuf中的数据?/span>

q回|成功q回0Q?p|q回-1?/span>


int evbuffer_add_printf( struct evbuffer *const char* fmt, )
d一个格式化的字W串到evbufferN?/div>

u_char *evbuffer_find(struct evbuffer *buffer, const u_char *what, size_t len)

查找~冲Z是否存在指定的字W串what?/span>

注意q里使用的是u_charcdQ说明有可能查找的数据不是以’\0’l尾

如果存在q回指向字符串what的指针,没有则返回NULL?/span>


int evbuffer_read(struct evbuffer *buf, int fd, int howmuch)
调用read/recv函数Q从文g描述Wfd上读取数据到evbuffer中。如果缓冲区不够Q调用evbuffer_expand扩充~冲区?/div>
int evbuffer_write(struct evbuffer *buffer, int fd)
把缓冲区中的数据Q调用send/write函数写入文g描述Wfd上, 如果send/write函数写入的字节数大于0Q则调用evbuffer_drain删除已写的数据?/div>
char *evbuffer_readline(struct evbuffer *buffer)

d数据?\r\n","\n\r", "\r" 或?nbsp;"\n"l尾?/span>

q回动态分配内存,需要调用者自׃用free来释攑ֆ存。返回一个以\0l尾的字W串?/span>


void evbuffer_setcb(struct evbuffer *buffer,
    
void (*cb)(struct evbuffer *, size_t, size_t, void *),
    
void *cbarg)
讄回调函数。当~冲Z发生变化Ӟ 调用讄的回调函数?/div>

Evbuffer提供的API已经全部介绍完毕Q接下来我们通过一个实例进一步学习如何用evbuffer, 惌使用evbufferQ系l里必须已经安装了libevent?/span>

例子代码如下Qevbuffer-test.c

#include <stdio.h>
#include <string.h>
#include <assert.h>

//引入libevent头文?/span>
#include "event.h"

int main(int argc, char** argv)
{
    
struct evbuffer* buff = NULL;
    
char c, c2[3= {0};
    

    
buff = evbuffer_new();
    
assert(buff != NULL);
    

    
evbuffer_add(buff, "1"1);
    
evbuffer_add(buff, "2"1);
    
evbuffer_add(buff, "3"1);
    
evbuffer_add_printf(buff, "%d%d"45);
    
assert(buff->off == 5);

    
evbuffer_remove(buff, &c, sizeof(char));
    
assert(c == '1');
    
evbuffer_remove(buff, &c, sizeof(char));
    
assert(c == '2');
    
evbuffer_remove(buff, &c, sizeof(char));
    
assert(c == '3');
    
evbuffer_remove(buff, c2, 2);
    
assert(strcmp(c2, "45"== 0);
    

    
assert(buff->off == 0);
  

    
evbuffer_add(buff, "test\r\n"6);
    
assert(buff->off == 6);
    

    
char* line = evbuffer_readline(buff);
    
assert(strcmp(line, "test"==0);
    
assert(buff->off == 0);
    
free(line);
   

    
evbuffer_free(buff);
    

    
printf("ok\n");
    

    
return 0;
}

 

 



鑫龙 2013-02-01 20:15 发表评论
]]>libevent学习资料 Q{Q?/title><link>http://m.shnenglu.com/mysileng/archive/2013/01/17/197349.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Thu, 17 Jan 2013 09:34:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2013/01/17/197349.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/197349.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2013/01/17/197349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/197349.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/197349.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-size: 14px; line-height: 26px; background-color: #ffffff; font-family: monospace;">The libevent API provides a mechanism to execute a callback function when a<br />specific event occurs on a file descriptor or after a timeout has been<br />reached. Furthermore, libevent also support callbacks due to signals or<br />regular timeouts.<br /><br />libevent is meant to replace the event loop found in event driven network<br />servers. An application just needs to call event_dispatch() and then add or<br />remove events dynamically without having to change the event loop.<br /><br /><br />官网<br /><span style="color: #6a5acd;"><u><a style="color: #336699; text-decoration: initial;">http://libevent.org/</a></u></span><br /><br />Fast portable non-blocking network programming with Libevent<br /><span style="color: #6a5acd;"><u><a style="color: #336699; text-decoration: initial;">http://www.wangafu.net/~nickm/libevent-book/</a></u></span><br /><br /><br />epoll学习W记<br /><span style="color: #6a5acd;"><u><a href="http://m.shnenglu.com/converse/archive/2008/04/29/48482.aspx" style="color: #336699; text-decoration: initial;">http://m.shnenglu.com/converse/archive/2008/04/29/48482.aspx</a></u></span><br /><br />libevent事g处理框架分析<br /><span style="color: #6a5acd;"><u><a href="http://m.shnenglu.com/converse/archive/2009/01/03/71040.aspx" style="color: #336699; text-decoration: initial;">http://m.shnenglu.com/converse/archive/2009/01/03/71040.aspx</a></u></span><br /><br />libevent入门教程QEcho Server based on libevent<br /><span style="color: #6a5acd;"><u><a style="color: #336699; text-decoration: initial;">http://www.felix021.com/blog/read.php?2068</a></u></span><br /><br />libevent源码深度剖析<br /><span style="color: #6a5acd;"><u><a style="color: #336699; text-decoration: initial;">http://blog.csdn.net/sparkliang/article/category/660506<br /><br /></a></u></span></span><span style="color: #333333; font-family: monospace; line-height: 26px; background-color: #ffffff;">libevent源码分析</span><br /><div><span style="font-size: 8pt;"><a >http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html</a><br /><br /><br /></span></div><span style="color: #333333; font-size: 14px; line-height: 26px; background-color: #ffffff; font-family: monospace;">How to use epoll? A complete example in C<br /></span><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff;"><span style="font-family: monospace;"><span style="color: #6a5acd;"><u><a style="color: #336699; text-decoration: initial;">https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/</a></u></span></span></p><img src ="http://m.shnenglu.com/mysileng/aggbug/197349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2013-01-17 17:34 <a href="http://m.shnenglu.com/mysileng/archive/2013/01/17/197349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.pqdaili.cn" target="_blank">þֻоƷ߹ۿ</a>| <a href="http://www.aving.com.cn" target="_blank">þԭƷ</a>| <a href="http://www.911sss.cn" target="_blank">ƷþþþþþҹƬ </a>| <a href="http://www.vyipin.cn" target="_blank">þþþĻ</a>| <a href="http://www.awo6.cn" target="_blank">þþþһvr</a>| <a href="http://www.sspfn.cn" target="_blank">Ʒþþþþ벻</a>| <a href="http://www.youk6.cn" target="_blank">޹˾þһWWW</a>| <a href="http://www.120o.cn" target="_blank">޾ƷNVþþþþþþþ</a>| <a href="http://www.jiedidianzubiao.cn" target="_blank">þ</a>| <a href="http://www.kiterunner.com.cn" target="_blank">þþþavӰ</a>| <a href="http://www.fyhd.net.cn" target="_blank">þۺ77777鶹</a>| <a href="http://www.shenhoulong.com.cn" target="_blank">ۺϾþþƷɫ</a>| <a href="http://www.gbestech.cn" target="_blank">Ļþи</a>| <a href="http://www.duxj.cn" target="_blank">þþþó˾ƷĻ</a>| <a href="http://www.91hid.cn" target="_blank">Ʒѿþþ</a>| <a href="http://www.haotese.cn" target="_blank">츾޾þĻ</a>| <a href="http://www.drxt.com.cn" target="_blank">þþþþҹƷƷ</a>| <a href="http://www.nyvgcd.cn" target="_blank">91Ʒ91þþþþ</a>| <a href="http://www.qishini.cn" target="_blank">޺ݺۺϾþ</a>| <a href="http://www.vrmn.cn" target="_blank">þֻоƷ4</a>| <a href="http://www.lianliankan123.cn" target="_blank">þþþþþþ뾫Ʒպ</a>| <a href="http://www.ichz.cn" target="_blank">þۺɫ</a>| <a href="http://www.xeqw.cn" target="_blank">պƷھþ</a>| <a href="http://www.piaowutong.com.cn" target="_blank">ҹƷþþþþþС˵</a>| <a href="http://www.tasd.org.cn" target="_blank">þҹɫƷ</a>| <a href="http://www.ycjtjedu.cn" target="_blank">þݺҹҹվ</a>| <a href="http://www.qeckf.cn" target="_blank">Ʒþþþþ˳</a>| <a href="http://www.gxyy.org.cn" target="_blank">þ޾Ʒa</a>| <a href="http://www.net901.cn" target="_blank">99þþƷѾƷһ</a>| <a href="http://www.hit5.cn" target="_blank">þþþAV</a>| <a href="http://www.jinxing168.net.cn" target="_blank">97Ʒ˾þþô߽ </a>| <a href="http://www.ycsxw.cn" target="_blank">պ뾫Ʒþһ </a>| <a href="http://www.ktqcc.cn" target="_blank">þþþѾƷ</a>| <a href="http://www.xsvt.cn" target="_blank">˾þۺij</a>| <a href="http://www.pcsaver.cn" target="_blank">þۺϾƷþ</a>| <a href="http://www.uzijav.cn" target="_blank">þþƷ</a>| <a href="http://www.love5000.cn" target="_blank">Ʒtvþþþþþ</a>| <a href="http://www.thha.cn" target="_blank">žžƷþþþþ</a>| <a href="http://www.x6844.cn" target="_blank">ƷþþþþþþþĻ </a>| <a href="http://www.6r9q.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.8xpn.cn" target="_blank">޹Ʒ˾þ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>