﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-to myself 的分类学习日志-随笔分类-c++ network library</title><link>http://cppblog.com/toMyself/category/9727.html</link><description>做自己想做的事</description><language>zh-cn</language><lastBuildDate>Thu, 09 Jul 2015 13:39:28 GMT</lastBuildDate><pubDate>Thu, 09 Jul 2015 13:39:28 GMT</pubDate><ttl>60</ttl><item><title>libev_lite: test table anfds and table pendings</title><link>http://www.cppblog.com/toMyself/archive/2015/07/08/211188.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 08 Jul 2015 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2015/07/08/211188.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/211188.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2015/07/08/211188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/211188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/211188.html</trackback:ping><description><![CDATA[<br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;ev.h<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />#ifndef&nbsp;EV_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_H_<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_FEATURES&nbsp;0x7f<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_FEATURE_CONFIG&nbsp;&nbsp;&nbsp;((EV_FEATURES)&nbsp;&amp;&nbsp;&nbsp;4)<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_MINPRI&nbsp;(EV_FEATURE_CONFIG&nbsp;?&nbsp;-2&nbsp;:&nbsp;0)<br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_MAXPRI&nbsp;(EV_FEATURE_CONFIG&nbsp;?&nbsp;+2&nbsp;:&nbsp;0)<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;NUMPRI&nbsp;(EV_MAXPRI&nbsp;-&nbsp;EV_MINPRI&nbsp;+&nbsp;1)<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;ABSPRI(w)&nbsp;(((W)w)-&gt;priority&nbsp;-&nbsp;EV_MINPRI)<br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_CB_INVOKE(watcher,&nbsp;revents)&nbsp;(watcher)-&gt;cb&nbsp;((watcher),&nbsp;(revents))<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;EMPTY2(a,b)&nbsp;/*&nbsp;used&nbsp;to&nbsp;suppress&nbsp;some&nbsp;warnings&nbsp;*/<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">************&nbsp;watcher&nbsp;related&nbsp;**********************</span><span style="color: #008000; ">*/</span><br />typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;active;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pending;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;priority;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*data;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*cb)(<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher&nbsp;*next;<br />}&nbsp;ev_watcher;<br /><br />typedef&nbsp;ev_watcher&nbsp;*W;<br /><br /><br />typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher_list<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;active;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pending;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;priority;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*data;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*cb)(<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher_list&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher_list&nbsp;*next;<br />}&nbsp;ev_watcher_list;<br /><br />typedef&nbsp;ev_watcher_list&nbsp;*WL;<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;invoked&nbsp;when&nbsp;fd&nbsp;is&nbsp;either&nbsp;EV_READable&nbsp;or&nbsp;EV_WRITEable&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;revent&nbsp;EV_READ,&nbsp;EV_WRITE&nbsp;</span><span style="color: #008000; ">*/</span><br />typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;active;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pending;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;priority;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*data;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(*cb)(<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*next;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ro&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;events;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ro&nbsp;</span><span style="color: #008000; ">*/</span><br />}&nbsp;ev_io;<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;stores&nbsp;the&nbsp;pending&nbsp;event&nbsp;set&nbsp;for&nbsp;a&nbsp;given&nbsp;watcher&nbsp;</span><span style="color: #008000; ">*/</span><br />typedef&nbsp;<span style="color: #0000FF; ">struct</span><br />{<br />&nbsp;&nbsp;W&nbsp;w;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;events;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;the&nbsp;pending&nbsp;event&nbsp;set&nbsp;for&nbsp;the&nbsp;given&nbsp;watcher&nbsp;</span><span style="color: #008000; ">*/</span><br />}&nbsp;ANPENDING;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;pendingpri;<br /><span style="color: #0000FF; ">int</span>&nbsp;pendingcnt[NUMPRI];<br />ANPENDING&nbsp;*<span style="color: red;">pendings&nbsp;</span>[NUMPRI];&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;save&nbsp;pending&nbsp;events</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;pendingmax&nbsp;[NUMPRI];<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">***************&nbsp;ANFD&nbsp;related&nbsp;***************************</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;set&nbsp;in&nbsp;reify&nbsp;when&nbsp;reification&nbsp;needed&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;EV_ANFD_REIFY&nbsp;1<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;file&nbsp;descriptor&nbsp;info&nbsp;structure&nbsp;</span><span style="color: #008000; ">*/</span><br />typedef&nbsp;<span style="color: #0000FF; ">struct</span><br />{<br />&nbsp;&nbsp;WL&nbsp;head;<br />&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;events;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;the&nbsp;events&nbsp;watched&nbsp;for&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;reify;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;flag&nbsp;set&nbsp;when&nbsp;this&nbsp;ANFD&nbsp;needs&nbsp;reification&nbsp;(EV_ANFD_REIFY,&nbsp;EV__IOFDSET)&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;emask;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;the&nbsp;epoll&nbsp;backend&nbsp;stores&nbsp;the&nbsp;actual&nbsp;kernel&nbsp;mask&nbsp;in&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;unused;<br />&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;egen;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;generation&nbsp;counter&nbsp;to&nbsp;counter&nbsp;epoll&nbsp;bugs&nbsp;</span><span style="color: #008000; ">*/</span><br />}&nbsp;ANFD;<br /><br />ANFD&nbsp;*&nbsp;<span style="color: red;">anfds</span>;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;save&nbsp;all&nbsp;events</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;anfdmax;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;*&nbsp;fdchanges;<br /><span style="color: #0000FF; ">int</span>&nbsp;fdchangemax;<br /><span style="color: #0000FF; ">int</span>&nbsp;fdchangecnt;<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">****************&nbsp;function&nbsp;interface&nbsp;****************************</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">void</span>&nbsp;fd_event(<span style="color: #0000FF; ">int</span>&nbsp;fd,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br /><span style="color: #0000FF; ">void</span>&nbsp;ev_invoke_pending();<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;ev_io_start&nbsp;(ev_io&nbsp;*w);<br /><span style="color: #0000FF; ">void</span>&nbsp;ev_io_stop&nbsp;(ev_io&nbsp;*w);<br /><br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;/*&nbsp;EV_H_&nbsp;*/</div><br /><br /><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 />-->#include&nbsp;"ev.h"<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">***************************************************************************</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;ev_realloc&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*ptr,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;size)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;=&nbsp;realloc(ptr,&nbsp;size);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!ptr&nbsp;&amp;&amp;&nbsp;size)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abort();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ptr;<br />}<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;MALLOC_ROUND&nbsp;4096&nbsp;/*&nbsp;prefer&nbsp;to&nbsp;allocate&nbsp;in&nbsp;chunks&nbsp;of&nbsp;this&nbsp;size,&nbsp;must&nbsp;be&nbsp;2**n&nbsp;and&nbsp;&gt;&gt;&nbsp;4&nbsp;longs&nbsp;*/<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;find&nbsp;a&nbsp;suitable&nbsp;new&nbsp;size&nbsp;for&nbsp;the&nbsp;given&nbsp;array,&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;hopefully&nbsp;by&nbsp;rounding&nbsp;to&nbsp;a&nbsp;nice-to-malloc&nbsp;size&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">int</span>&nbsp;array_nextsize&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;elem,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cur,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cnt)<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ncur&nbsp;=&nbsp;cur&nbsp;+&nbsp;1;<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">do</span><br />&nbsp;&nbsp;&nbsp;&nbsp;ncur&nbsp;&lt;&lt;=&nbsp;1;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(cnt&nbsp;&gt;&nbsp;ncur);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;if&nbsp;size&nbsp;is&nbsp;large,&nbsp;round&nbsp;to&nbsp;MALLOC_ROUND&nbsp;-&nbsp;4&nbsp;*&nbsp;longs&nbsp;to&nbsp;accommodate&nbsp;malloc&nbsp;overhead&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(elem&nbsp;*&nbsp;ncur&nbsp;&gt;&nbsp;MALLOC_ROUND&nbsp;-&nbsp;<span style="color: #0000FF; ">sizeof</span>&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*)&nbsp;*&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncur&nbsp;*=&nbsp;elem;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncur&nbsp;=&nbsp;(ncur&nbsp;+&nbsp;elem&nbsp;+&nbsp;(MALLOC_ROUND&nbsp;-&nbsp;1)&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*)&nbsp;*&nbsp;4)&nbsp;&amp;&nbsp;~(MALLOC_ROUND&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncur&nbsp;=&nbsp;ncur&nbsp;-&nbsp;<span style="color: #0000FF; ">sizeof</span>&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*)&nbsp;*&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncur&nbsp;/=&nbsp;elem;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ncur;<br />}<br /><br /><span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;array_realloc&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;elem,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*<span style="color: #0000FF; ">base</span>,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*cur,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cnt)<br />{<br />&nbsp;&nbsp;*cur&nbsp;=&nbsp;array_nextsize&nbsp;(elem,&nbsp;*cur,&nbsp;cnt);<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ev_realloc&nbsp;(<span style="color: #0000FF; ">base</span>,&nbsp;elem&nbsp;*&nbsp;*cur);<br />}<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;array_init_zero(base,count)&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;memset&nbsp;((<span style="color: #0000FF; ">void</span>&nbsp;*)(<span style="color: #0000FF; ">base</span>),&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>&nbsp;(*(<span style="color: #0000FF; ">base</span>))&nbsp;*&nbsp;(count))<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;array_needsize(type,base,cur,cnt,init)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;!=&nbsp;((cnt)&nbsp;&gt;&nbsp;(cur)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ocur_&nbsp;=&nbsp;(cur);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">base</span>)&nbsp;=&nbsp;(type&nbsp;*)array_realloc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">sizeof</span>&nbsp;(type),&nbsp;(<span style="color: #0000FF; ">base</span>),&nbsp;&amp;(cur),&nbsp;(cnt));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init&nbsp;((<span style="color: #0000FF; ">base</span>)&nbsp;+&nbsp;(ocur_),&nbsp;(cur)&nbsp;-&nbsp;ocur_);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;array_free(stem,&nbsp;idx)&nbsp;\<br />&nbsp;&nbsp;ev_free&nbsp;(stem&nbsp;##&nbsp;s&nbsp;idx);&nbsp;stem&nbsp;##&nbsp;cnt&nbsp;idx&nbsp;=&nbsp;stem&nbsp;##&nbsp;max&nbsp;idx&nbsp;=&nbsp;0;&nbsp;stem&nbsp;##&nbsp;s&nbsp;idx&nbsp;=&nbsp;0<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">***************************************************************************</span><span style="color: #008000;">*/</span><br /><span style="color: #0000FF; ">void</span>&nbsp;ev_invoke_pending()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pendingpri&nbsp;=&nbsp;NUMPRI;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(pendingpri)&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;pendingpri&nbsp;possibly&nbsp;gets&nbsp;modified&nbsp;in&nbsp;the&nbsp;inner&nbsp;loop&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--pendingpri;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(pendingcnt[pendingpri])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ANPENDING&nbsp;*p&nbsp;=&nbsp;pendings[pendingpri]&nbsp;+&nbsp;--pendingcnt[pendingpri];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;w-&gt;pending&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EV_CB_INVOKE(p-&gt;w,&nbsp;p-&gt;events);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;ev_feed_event(<span style="color: #0000FF; ">void</span>&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;W&nbsp;w_&nbsp;=&nbsp;(W)&nbsp;w;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;pri&nbsp;=&nbsp;ABSPRI(w_);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(0&nbsp;!=&nbsp;(w_-&gt;pending))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pendings[pri][w_-&gt;pending&nbsp;-&nbsp;1].events&nbsp;|=&nbsp;revents;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_-&gt;pending&nbsp;=&nbsp;++pendingcnt[pri];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_needsize(ANPENDING,&nbsp;pendings[pri],&nbsp;pendingmax[pri],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w_-&gt;pending,&nbsp;EMPTY2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pendings[pri][w_-&gt;pending&nbsp;-&nbsp;1].w&nbsp;=&nbsp;w_;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pendings[pri][w_-&gt;pending&nbsp;-&nbsp;1].events&nbsp;=&nbsp;revents;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pendingpri&nbsp;=&nbsp;NUMPRI&nbsp;-&nbsp;1;<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;fd_event_nocheck(<span style="color: #0000FF; ">int</span>&nbsp;fd,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ANFD&nbsp;*anfd&nbsp;=&nbsp;anfds&nbsp;+&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io&nbsp;*w;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(w&nbsp;=&nbsp;(ev_io&nbsp;*)&nbsp;anfd-&gt;head;&nbsp;w;&nbsp;w&nbsp;=&nbsp;(ev_io&nbsp;*)&nbsp;((WL)&nbsp;w)-&gt;next)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ev&nbsp;=&nbsp;w-&gt;events&nbsp;&amp;&nbsp;revents;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ev)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_feed_event((W)&nbsp;w,&nbsp;ev);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;do&nbsp;not&nbsp;submit&nbsp;kernel&nbsp;events&nbsp;for&nbsp;fds&nbsp;that&nbsp;have&nbsp;reify&nbsp;set&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;because&nbsp;that&nbsp;means&nbsp;they&nbsp;changed&nbsp;while&nbsp;we&nbsp;were&nbsp;polling&nbsp;for&nbsp;new&nbsp;events&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">void</span>&nbsp;fd_event(<span style="color: #0000FF; ">int</span>&nbsp;fd,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;ANFD&nbsp;*anfd&nbsp;=&nbsp;anfds&nbsp;+&nbsp;fd;<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!anfd-&gt;reify)<br />&nbsp;&nbsp;&nbsp;&nbsp;fd_event_nocheck(fd,&nbsp;revents);<br />}<br /><br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;wlist_add&nbsp;(WL&nbsp;*head,&nbsp;WL&nbsp;elem)<br />{<br />&nbsp;&nbsp;elem-&gt;next&nbsp;=&nbsp;*head;<br />&nbsp;&nbsp;*head&nbsp;=&nbsp;elem;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;wlist_del&nbsp;(WL&nbsp;*head,&nbsp;WL&nbsp;elem)<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(*head)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*head&nbsp;==&nbsp;elem)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*head&nbsp;=&nbsp;elem-&gt;next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;=&nbsp;&amp;(*head)-&gt;next;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;ev_io_start&nbsp;(ev_io&nbsp;*w)<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd&nbsp;=&nbsp;w-&gt;fd;<br /><br />&nbsp;&nbsp;array_needsize&nbsp;(ANFD,&nbsp;anfds,&nbsp;anfdmax,&nbsp;fd&nbsp;+&nbsp;1,&nbsp;array_init_zero);<br />&nbsp;&nbsp;wlist_add&nbsp;(&amp;anfds[fd].head,&nbsp;(WL)w);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;ev_io_stop&nbsp;(ev_io&nbsp;*w)<br />{<br />&nbsp;&nbsp;wlist_del&nbsp;(&amp;anfds[w-&gt;fd].head,&nbsp;(WL)w);<br />}</div><br /><br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;test.c<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />#include&nbsp;"ev.h"<br />#include&nbsp;&lt;stdio.h&gt;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;test_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_watcher&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("test_cb\n");<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1&nbsp;fd&nbsp;-&gt;&nbsp;multi&nbsp;events(or&nbsp;event&nbsp;watcher)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;epoll_poll&nbsp;-&gt;&nbsp;fd_event&nbsp;-&gt;&nbsp;fd_event_nocheck&nbsp;-&gt;&nbsp;ev_feed_event&nbsp;-&gt;&nbsp;ev_invoke_pending</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;aargc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io&nbsp;w_io;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.active&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.pending&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.priority&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.data&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.cb&nbsp;=&nbsp;test_cb;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.next&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.fd&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;w_io.events&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_start(&amp;w_io);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;register&nbsp;event</span><span style="color: #008000; "><br /></span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd&nbsp;=&nbsp;10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd_event(fd,&nbsp;revents);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;discover&nbsp;event</span><span style="color: #008000; "><br /></span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ev_invoke_pending();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;raise&nbsp;event</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/211188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2015-07-08 16:53 <a href="http://www.cppblog.com/toMyself/archive/2015/07/08/211188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用thrift实现订阅服务和发布服务</title><link>http://www.cppblog.com/toMyself/archive/2015/07/07/211176.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 07 Jul 2015 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2015/07/07/211176.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/211176.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2015/07/07/211176.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/211176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/211176.html</trackback:ping><description><![CDATA[服务：订阅服务 market_subscriber 和 发布服务 market_publisher<br />功能：market_subscriber 能够向&nbsp;market_publisher 请求订阅某些类型的消息，当 market_publisher 有该类型的消息时，需要把它推送给订阅服务。<br />流程：1.&nbsp;market_publisher 服务启动，监听端口，注册事件处理函数，处理订阅请求消息。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.&nbsp;market_subscriber 服务启动，监听端口，注册事件处理函数，处理接收推动来的消息。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3.&nbsp;market_subscriber 向&nbsp;market_publisher 发起订阅请求，market_publisher 根据订阅请求参数，长连接&nbsp;market_subscriber 提供的消息接收端口。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4.&nbsp;market_publisher 通过长连接向 market_subscriber 推送消息。<br />注意：1.&nbsp;market_publisher 到&nbsp;market_subscriber 的长连接的维护：<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （1）market_subscriber 一定时间内未收到&nbsp;market_publisher 的推送消息，尝试重新发起订阅请求。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; （2）market_publisher 推送订阅消息时，发现连接断开，尝试重连。 考虑&nbsp;market_publisher 有重启的情况，收到的订阅请求参数需要做持久化。 ==&gt; TODO：增加一个&nbsp;market_subscriber 到&nbsp;market_publisher 的取消订阅的请求。<br /><br />实现：<br />1. market_subscriber.thrift &nbsp;--&nbsp;market_subscriber 实现的服务接口<br /><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; ">namespace</span>&nbsp;cpp&nbsp;market_subscriber<br /><span style="color: #0000FF; ">namespace</span>&nbsp;java&nbsp;market_subscriber<br /><span style="color: #0000FF; ">namespace</span>&nbsp;perl&nbsp;market_subscriber<br /><span style="color: #0000FF; ">namespace</span>&nbsp;php&nbsp;market_subscriber<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Snapshot<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;i32&nbsp;nSecurityID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;证券ID<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;i32&nbsp;nTime;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;序号/时间/日期&nbsp;HHMMSSmmm<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;3:&nbsp;i32&nbsp;nTradingPhaseCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;0:开市前&nbsp;&nbsp;1:开盘集合竞价&nbsp;2:连续竞价&nbsp;3:临时停盘&nbsp;4:收盘集合竞价&nbsp;5:集中竞价闭市&nbsp;&nbsp;6:协议转让结束&nbsp;&nbsp;7:闭市<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;i32&nbsp;nPreClosePx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;昨收价&nbsp;*&nbsp;10000<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;5:&nbsp;i32&nbsp;nOpenPx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;开盘价&nbsp;..<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;6:&nbsp;i32&nbsp;nHighPx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;最高价&nbsp;..<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;7:&nbsp;i32&nbsp;nLowPx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;最低价&nbsp;..<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;8:&nbsp;i32&nbsp;nLastPx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;最新价&nbsp;..<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;9:&nbsp;i64&nbsp;llTradeNum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;成交笔数<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;10:&nbsp;i64&nbsp;llVolume;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;成交量<br /></span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;11:&nbsp;i64&nbsp;llValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #808080; ">&lt;&nbsp;成交额(*10000)<br /></span><span style="color: #008000; ">}&nbsp;&nbsp;&nbsp;</span><span style="color: #808080; "><br /></span><br />service&nbsp;SubscriberService<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;推送消息<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Oneway&nbsp;means&nbsp;the&nbsp;client&nbsp;only&nbsp;makes&nbsp;request&nbsp;and&nbsp;does&nbsp;not&nbsp;listen&nbsp;for&nbsp;any&nbsp;response&nbsp;at&nbsp;all.&nbsp;Oneway&nbsp;methods&nbsp;must&nbsp;be&nbsp;void.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;oneway&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sendSnapshot(1:list&lt;Snapshot&gt;&nbsp;lstSnapshot);<br />}</div><br />2. market_publisher.thrift --&nbsp;market_publisher 实现的服务接口<br /><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; ">namespace</span>&nbsp;cpp&nbsp;market_publisher<br /><span style="color: #0000FF; ">namespace</span>&nbsp;java&nbsp;market_publisher<br /><span style="color: #0000FF; ">namespace</span>&nbsp;perl&nbsp;market_publisher<br /><span style="color: #0000FF; ">namespace</span>&nbsp;php&nbsp;market_publisher<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;SubscribeMarketParam<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;user_name;<br />&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;password;<br />&nbsp;&nbsp;&nbsp;&nbsp;3:&nbsp;i32&nbsp;type;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;订阅类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;ip;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;接收推送数据的ip</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;5:&nbsp;i16&nbsp;port;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;接收推送数据的port</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;SubscribeMarketAck<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;required&nbsp;i32&nbsp;error_code;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;0，成功；&nbsp;其它，失败</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;optional&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;error_info;<br />}<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;GetStockBaseInfoParam<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;required&nbsp;i32&nbsp;stock_code;<br />}<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;GetStockBaseInfoAck<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;required&nbsp;i32&nbsp;error_code;<br />&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;optional&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;error_info;<br />&nbsp;&nbsp;&nbsp;&nbsp;3:&nbsp;optional&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;stock_name;<br />}<br /><br />service&nbsp;PublisherService<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000;">&nbsp;订阅请求：订阅行情信息</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;SubscribeMarketAck&nbsp;subscribeMarket(1:SubscribeMarketParam&nbsp;param);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GetStockBaseInfoAck&nbsp;getStockBaseInfo(1:GetStockBaseInfoParam&nbsp;param);<br />}</div><br />3. subscriber_server.cpp<br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Main.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />#include&nbsp;"../gen-cpp/SubscriberService.h"<br />#include&nbsp;"../gen-cpp/PublisherService.h"<br />#include&nbsp;&lt;thrift/protocol/TBinaryProtocol.h&gt;<br />#include&nbsp;&lt;thrift/server/TSimpleServer.h&gt;<br />#include&nbsp;&lt;thrift/transport/TSocket.h&gt;<br />#include&nbsp;&lt;thrift/transport/TServerSocket.h&gt;<br />#include&nbsp;&lt;thrift/transport/TBufferTransports.h&gt;<br />#include&nbsp;&lt;boost/thread/thread.hpp&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::protocol;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::transport;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::server;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;boost::shared_ptr;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;::market_subscriber;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;::market_publisher;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;SubscriberServiceHandler&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;SubscriberServiceIf&nbsp;{<br />&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;SubscriberServiceHandler()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Your&nbsp;initialization&nbsp;goes&nbsp;here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sendSnapshot(<span style="color: #0000FF; ">const</span>&nbsp;std::vector&lt;Snapshot&gt;&nbsp;&amp;&nbsp;lstSnapshot)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Your&nbsp;implementation&nbsp;goes&nbsp;here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("sendSnapshot\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Received&nbsp;snapshots'&nbsp;number:&nbsp;"&nbsp;&lt;&lt;&nbsp;lstSnapshot.size()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(std::vector&lt;Snapshot&gt;::const_iterator&nbsp;iter&nbsp;=&nbsp;lstSnapshot.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;!=&nbsp;lstSnapshot.end();&nbsp;iter++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"nSecurityID:&nbsp;"&nbsp;&lt;&lt;&nbsp;iter-&gt;nSecurityID&nbsp;&lt;&lt;&nbsp;"\t";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"nTime:&nbsp;"&nbsp;&lt;&lt;&nbsp;iter-&gt;nTime&nbsp;&lt;&lt;&nbsp;"\t";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);<br />&nbsp;&nbsp;}<br /><br />};<br /><br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;CLIENT_LISTNE_IP&nbsp;=&nbsp;"127.0.0.1";<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">short</span>&nbsp;CLIENT_LISTNE_PORT&nbsp;=&nbsp;9060;<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;subscriberServiceThread()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;SubscriberServiceHandler&gt;&nbsp;handler(<span style="color: #0000FF; ">new</span>&nbsp;SubscriberServiceHandler());<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TProcessor&gt;&nbsp;processor(<span style="color: #0000FF; ">new</span>&nbsp;SubscriberServiceProcessor(handler));<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TServerTransport&gt;&nbsp;serverTransport(<span style="color: #0000FF; ">new</span>&nbsp;TServerSocket(CLIENT_LISTNE_PORT));<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TTransportFactory&gt;&nbsp;transportFactory(<span style="color: #0000FF; ">new</span>&nbsp;TBufferedTransportFactory());<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TProtocolFactory&gt;&nbsp;protocolFactory(<span style="color: #0000FF; ">new</span>&nbsp;TBinaryProtocolFactory());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TSimpleServer&nbsp;server(processor,&nbsp;serverTransport,&nbsp;transportFactory,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocolFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;server.serve();<br />}<br /><br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::thread&nbsp;thrd(&amp;subscriberServiceThread);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;wait&nbsp;for&nbsp;subscriberServiceThread&nbsp;ready</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;sleep(3);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TSocket&gt;&nbsp;socket(<span style="color: #0000FF; ">new</span>&nbsp;TSocket("127.0.0.1",&nbsp;9090));<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TTransport&gt;&nbsp;transport(<span style="color: #0000FF; ">new</span>&nbsp;TBufferedTransport(socket));<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TProtocol&gt;&nbsp;protocol(<span style="color: #0000FF; ">new</span>&nbsp;TBinaryProtocol(transport));<br />&nbsp;&nbsp;&nbsp;&nbsp;PublisherServiceClient&nbsp;client(protocol);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport-&gt;open();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SubscribeMarketAck&nbsp;ack;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SubscribeMarketParam&nbsp;param;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.__set_user_name("mazhan");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.__set_password("123456");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.__set_type(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.__set_ip(CLIENT_LISTNE_IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param.__set_port(CLIENT_LISTNE_PORT);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.subscribeMarket(ack,&nbsp;param);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"subscribeMarket(),&nbsp;error&nbsp;code:&nbsp;"&nbsp;&lt;&lt;&nbsp;ack.error_code&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport-&gt;close();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(TException&amp;&nbsp;tx)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"ERROR:&nbsp;"&nbsp;&lt;&lt;&nbsp;tx.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;thrd.join();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /></div><br />4. pubsher_server.cpp<br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Main.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br /><br />#include&nbsp;"../gen-cpp/SubscriberService.h"<br />#include&nbsp;"../gen-cpp/PublisherService.h"<br />#include&nbsp;&lt;thrift/protocol/TBinaryProtocol.h&gt;<br />#include&nbsp;&lt;thrift/server/TSimpleServer.h&gt;<br />#include&nbsp;&lt;thrift/transport/TSocket.h&gt;<br />#include&nbsp;&lt;thrift/transport/TServerSocket.h&gt;<br />#include&nbsp;&lt;thrift/transport/TBufferTransports.h&gt;<br />#include&nbsp;&lt;thrift/concurrency/ThreadManager.h&gt;<br />#include&nbsp;&lt;boost/thread/thread.hpp&gt;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::protocol;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::transport;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::server;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;::apache::thrift::concurrency;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;boost::shared_ptr;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;::market_publisher;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;&nbsp;::market_subscriber;<br /><br /><br />std::list&lt;boost::shared_ptr&lt;SubscriberServiceClient&gt;&nbsp;&gt;&nbsp;g_lstSubscriberServiceClient;<br />boost::mutex&nbsp;g_mutexSubscriberServiceClient;<br /><br /><br /><span style="color: #0000FF; ">class</span>&nbsp;PublisherServiceHandler&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;PublisherServiceIf&nbsp;{<br />&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;PublisherServiceHandler()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Your&nbsp;initialization&nbsp;goes&nbsp;here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;subscribeMarket(SubscribeMarketAck&amp;&nbsp;_return,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;SubscribeMarketParam&amp;&nbsp;param)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Your&nbsp;implementation&nbsp;goes&nbsp;here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"subscribeMarket,&nbsp;ip="&nbsp;&lt;&lt;&nbsp;param.ip&nbsp;&lt;&lt;&nbsp;",&nbsp;port="&nbsp;&lt;&lt;&nbsp;param.port&nbsp;&lt;&lt;&nbsp;"."&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TSocket&gt;&nbsp;socket(<span style="color: #0000FF; ">new</span>&nbsp;TSocket(param.ip,&nbsp;param.port));<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TTransport&gt;&nbsp;transport(<span style="color: #0000FF; ">new</span>&nbsp;TBufferedTransport(socket));<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;TProtocol&gt;&nbsp;protocol(<span style="color: #0000FF; ">new</span>&nbsp;TBinaryProtocol(transport));<br />&nbsp;&nbsp;&nbsp;&nbsp;boost::shared_ptr&lt;SubscriberServiceClient&gt;&nbsp;client(<span style="color: #0000FF; ">new</span>&nbsp;SubscriberServiceClient(protocol));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;error_code&nbsp;=&nbsp;1;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;fail&nbsp;to&nbsp;open</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport-&gt;open();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_code&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;add&nbsp;to&nbsp;subscribes&nbsp;list</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;<span style="color: #0000FF; ">lock</span>(g_mutexSubscriberServiceClient);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_lstSubscriberServiceClient.push_back(client);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(TException&amp;&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;"&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_return.__set_error_info(e.what());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(std::exception&amp;&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;"&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_return.__set_error_info(e.what());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buff[100];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snprintf(buff,&nbsp;99,&nbsp;"fail&nbsp;to&nbsp;open&nbsp;%s:%d.",&nbsp;param.ip.c_str(),&nbsp;param.port);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;"&nbsp;&lt;&lt;&nbsp;buff&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_return.__set_error_info(buff);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;_return.__set_error_code(error_code);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;getStockBaseInfo(GetStockBaseInfoAck&amp;&nbsp;_return,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;GetStockBaseInfoParam&amp;&nbsp;param)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Your&nbsp;implementation&nbsp;goes&nbsp;here</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;printf("getStockBaseInfo\n");<br />&nbsp;&nbsp;}<br /><br />};<br /><br /><br />int32_t&nbsp;getCurTime()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;t&nbsp;=&nbsp;time(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;tmp[64];<br />&nbsp;&nbsp;&nbsp;&nbsp;strftime(tmp,&nbsp;<span style="color: #0000FF; ">sizeof</span>(tmp),&nbsp;"%H%M%S",&nbsp;localtime(&amp;t));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;atoi(tmp);<br />}<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;send&nbsp;markets&nbsp;to&nbsp;subscribers.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;publisherServiceThread()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;Snapshot&gt;&nbsp;lstSnapshot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Snapshot&nbsp;snapshot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nSecurityID&nbsp;=&nbsp;100000001;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nTime&nbsp;=&nbsp;getCurTime()&nbsp;*&nbsp;1000&nbsp;+&nbsp;rand()&nbsp;%&nbsp;1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nTradingPhaseCode&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nPreClosePx&nbsp;=&nbsp;240500;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nOpenPx&nbsp;=&nbsp;250500;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nHighPx&nbsp;=&nbsp;250800;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nLowPx&nbsp;=&nbsp;240800;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.nLastPx&nbsp;=&nbsp;250300;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.llTradeNum&nbsp;=&nbsp;15000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.llVolume&nbsp;=&nbsp;6000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;snapshot.llValue&nbsp;=&nbsp;15030000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lstSnapshot.push_back(snapshot);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::mutex::scoped_lock&nbsp;<span style="color: #0000FF; ">lock</span>(g_mutexSubscriberServiceClient);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::list&lt;boost::shared_ptr&lt;SubscriberServiceClient&gt;&nbsp;&gt;::iterator&nbsp;iter&nbsp;=&nbsp;g_lstSubscriberServiceClient.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(iter&nbsp;!=&nbsp;g_lstSubscriberServiceClient.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*iter)-&gt;sendSnapshot(lstSnapshot);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(TException&amp;&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;"&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;g_lstSubscriberServiceClient.erase(iter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(std::exception&amp;&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;"&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;g_lstSubscriberServiceClient.erase(iter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Exception:&nbsp;fail&nbsp;to&nbsp;call&nbsp;sendSnapshot()."&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;g_lstSubscriberServiceClient.erase(iter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;port&nbsp;=&nbsp;9090;<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;PublisherServiceHandler&gt;&nbsp;handler(<span style="color: #0000FF; ">new</span>&nbsp;PublisherServiceHandler());<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TProcessor&gt;&nbsp;processor(<span style="color: #0000FF; ">new</span>&nbsp;PublisherServiceProcessor(handler));<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TServerTransport&gt;&nbsp;serverTransport(<span style="color: #0000FF; ">new</span>&nbsp;TServerSocket(port));<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TTransportFactory&gt;&nbsp;transportFactory(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TBufferedTransportFactory());<br />&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr&lt;TProtocolFactory&gt;&nbsp;protocolFactory(<span style="color: #0000FF; ">new</span>&nbsp;TBinaryProtocolFactory());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TSimpleServer&nbsp;server(processor,&nbsp;serverTransport,&nbsp;transportFactory,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocolFactory);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;boost::thread&nbsp;thrd(&amp;publisherServiceThread);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("Starting&nbsp;the&nbsp;server<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;server.serve();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("done.\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/211176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2015-07-07 17:57 <a href="http://www.cppblog.com/toMyself/archive/2015/07/07/211176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>libev simple server and client</title><link>http://www.cppblog.com/toMyself/archive/2015/07/03/211135.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 03 Jul 2015 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2015/07/03/211135.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/211135.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2015/07/03/211135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/211135.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/211135.html</trackback:ping><description><![CDATA[实现功能：client从标准输入读取输入，发送到server；server收到client的消息后，原样发给client。<br /><br />libev simple server<br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;example_server.c<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;errno.h&gt;<br />#include&nbsp;&lt;netinet/<span style="color: #0000FF; ">in</span>.h&gt;<br />#include&nbsp;&lt;strings.h&gt;<br />#include&nbsp;"ev.h"<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;PORT&nbsp;8333<br /><span style="color: #0000FF; ">#define</span>&nbsp;BUFFER_SIZE&nbsp;1024<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX_ALLOWED_CLIENT&nbsp;10240<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*libevlist[MAX_ALLOWED_CLIENT]&nbsp;=&nbsp;{&nbsp;NULL&nbsp;};<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;gcc&nbsp;example_server.c&nbsp;ev.o&nbsp;-lm</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;accept_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br /><span style="color: #0000FF; ">void</span>&nbsp;read_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br /><span style="color: #0000FF; ">int</span>&nbsp;freelibev(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd);<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop&nbsp;=&nbsp;ev_default_loop(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sd;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;addr_len&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;socket_watcher;<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_timer&nbsp;timeout_watcher;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((sd&nbsp;=&nbsp;socket(PF_INET,&nbsp;SOCK_STREAM,&nbsp;0))&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("socket&nbsp;error.&nbsp;errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;addr,&nbsp;<span style="color: #0000FF; ">sizeof</span>(addr));<br />&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_port&nbsp;=&nbsp;htons(PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_addr.s_addr&nbsp;=&nbsp;INADDR_ANY;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bind(sd,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr*)&nbsp;&amp;addr,&nbsp;<span style="color: #0000FF; ">sizeof</span>(addr))&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("bind&nbsp;error.errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(listen(sd,&nbsp;2)&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("listen&nbsp;error\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("ev_loop&nbsp;beg\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_init(&amp;socket_watcher,&nbsp;accept_cb,&nbsp;sd,&nbsp;EV_READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_start(loop,&nbsp;&amp;socket_watcher);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("ev_loop&nbsp;start\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_loop(loop,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("ev_loop&nbsp;end\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;accept_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in&nbsp;client_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;client_len&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(client_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;client_sd;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*w_client&nbsp;=&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;ev_io*)&nbsp;malloc(<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;ev_io));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(EV_ERROR&nbsp;&amp;&nbsp;revents)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;event&nbsp;in&nbsp;accept\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;client_sd&nbsp;=&nbsp;accept(watcher-&gt;fd,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr&nbsp;*)&nbsp;&amp;client_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;client_len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(client_sd&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("accept&nbsp;error\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果连接数超出指定范围，则关闭连接</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(client_sd&nbsp;&gt;&nbsp;MAX_ALLOWED_CLIENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("fd&nbsp;too&nbsp;large[%d]\n",&nbsp;client_sd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(client_sd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(libevlist[client_sd]&nbsp;!=&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("client_sd&nbsp;not&nbsp;NULL&nbsp;fd&nbsp;is&nbsp;[%d]\n",&nbsp;client_sd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("someone&nbsp;connected.\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_init(w_client,&nbsp;read_cb,&nbsp;client_sd,&nbsp;EV_READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_start(loop,&nbsp;w_client);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;libevlist[client_sd]&nbsp;=&nbsp;w_client;<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;read_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buffer[BUFFER_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;read;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(EV_ERROR&nbsp;&amp;&nbsp;revents)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;event&nbsp;in&nbsp;read");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;read&nbsp;=&nbsp;recv(watcher-&gt;fd,&nbsp;buffer,&nbsp;BUFFER_SIZE,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(read&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("read&nbsp;error,errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(read&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("someone&nbsp;disconnected,&nbsp;errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freelibev(loop,&nbsp;watcher-&gt;fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("get&nbsp;the&nbsp;message:%s\n",&nbsp;buffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;send(watcher-&gt;fd,&nbsp;buffer,&nbsp;read,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(buffer,&nbsp;read);<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;freelibev(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;fd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(libevlist[fd]&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("the&nbsp;fd&nbsp;already&nbsp;freed[%d]\n",&nbsp;fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_stop(loop,&nbsp;libevlist[fd]);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(libevlist[fd]);<br />&nbsp;&nbsp;&nbsp;&nbsp;libevlist[fd]&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />}</div><br />libev simple client<br /><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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;example_client.c<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;errno.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;netdb.h&gt;<br />#include&nbsp;&lt;sys/types.h&gt;<br />#include&nbsp;&lt;netinet/<span style="color: #0000FF; ">in</span>.h&gt;<br />#include&nbsp;&lt;sys/socket.h&gt;<br />#include&nbsp;&lt;netinet/<span style="color: #0000FF; ">in</span>.h&gt;<br />#include&nbsp;"ev.h"<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;PORT&nbsp;8333<br /><span style="color: #0000FF; ">#define</span>&nbsp;BUFFER_SIZE&nbsp;1024<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;gcc&nbsp;example_client.c&nbsp;ev.o&nbsp;-lm</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;read_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br /><span style="color: #0000FF; ">void</span>&nbsp;stdin_cb(EV_P_&nbsp;ev_io&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents);<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;g_server_sockfd;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop&nbsp;=&nbsp;ev_default_loop(0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;hostent&nbsp;*he;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;主机信息&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr_in&nbsp;their_addr;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;对方地址信息&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;get&nbsp;the&nbsp;host&nbsp;info&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((he&nbsp;=&nbsp;gethostbyname("127.0.0.1"))&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;注意：获取DNS信息时，显示出错需要用herror而不是perror&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;herror("gethostbyname");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((g_server_sockfd&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;0))&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("socket");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;their_addr.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;their_addr.sin_port&nbsp;=&nbsp;htons(PORT);&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;short,&nbsp;NBO&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;their_addr.sin_addr&nbsp;=&nbsp;*((<span style="color: #0000FF; ">struct</span>&nbsp;in_addr&nbsp;*)&nbsp;he-&gt;h_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;(their_addr.sin_zero),&nbsp;8);&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;其余部分设成0&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(connect(g_server_sockfd,&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr&nbsp;*)&nbsp;&amp;their_addr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;sockaddr))&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("connect");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io&nbsp;w_client;<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_init(&amp;w_client,&nbsp;read_cb,&nbsp;g_server_sockfd,&nbsp;EV_READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_start(loop,&nbsp;&amp;w_client);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io&nbsp;stdin_watcher;<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_init(&amp;stdin_watcher,&nbsp;stdin_cb,&nbsp;STDIN_FILENO,&nbsp;EV_READ);<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_io_start(loop,&nbsp;&amp;stdin_watcher);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf("ev_loop&nbsp;start\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;ev_loop(loop,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("ev_loop&nbsp;end\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;close(g_server_sockfd);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;read_cb(<span style="color: #0000FF; ">struct</span>&nbsp;ev_loop&nbsp;*loop,&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;ev_io&nbsp;*watcher,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buffer[BUFFER_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(EV_ERROR&nbsp;&amp;&nbsp;revents)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;event&nbsp;in&nbsp;read");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;recv(watcher-&gt;fd,&nbsp;buffer,&nbsp;BUFFER_SIZE,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(len&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("network&nbsp;read&nbsp;error,errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(len&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("someone&nbsp;disconnected.errno:%d\n",&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(watcher-&gt;fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_io_stop(loop,&nbsp;watcher);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(watcher);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("get&nbsp;the&nbsp;message:%s\n",&nbsp;buffer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(strcmp("quit",&nbsp;&nbsp;buffer)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_io_stop(EV_A_&nbsp;watcher);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;to&nbsp;stop&nbsp;network&nbsp;io&nbsp;event</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_break(EV_A_&nbsp;EVBREAK_CANCEL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;stdin_cb(EV_P_&nbsp;ev_io&nbsp;*w,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;revents)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buffer[BUFFER_SIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(buffer,&nbsp;BUFFER_SIZE);<br />&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(EV_ERROR&nbsp;&amp;&nbsp;revents)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("error&nbsp;event&nbsp;in&nbsp;read");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;w-&gt;fd:&nbsp;STDIN_FILENO<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;len&nbsp;=&nbsp;recv(w-&gt;fd,&nbsp;buffer,&nbsp;sizeof(buffer),&nbsp;0);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;wrong??</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;read(w-&gt;fd,&nbsp;buffer,&nbsp;<span style="color: #0000FF; ">sizeof</span>(buffer));&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;right</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(len&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("stdin&nbsp;read&nbsp;error,&nbsp;return:%ld,&nbsp;errno:%d\n",&nbsp;len,&nbsp;errno);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('\n'&nbsp;==&nbsp;buffer[len-1])<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer[len-1]&nbsp;=&nbsp;'\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;('\r'&nbsp;==&nbsp;buffer[len-2])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer[len-2]&nbsp;=&nbsp;'\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;send(g_server_sockfd,&nbsp;buffer,&nbsp;len,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(strcmp("quit",&nbsp;&nbsp;buffer)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_io_stop(EV_A_&nbsp;w);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;to&nbsp;stop&nbsp;network&nbsp;io&nbsp;event</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev_break(EV_A_&nbsp;EVBREAK_CANCEL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(buffer,&nbsp;len);<br />}</div><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/211135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2015-07-03 19:14 <a href="http://www.cppblog.com/toMyself/archive/2015/07/03/211135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE的编译</title><link>http://www.cppblog.com/toMyself/archive/2013/11/15/204268.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Fri, 15 Nov 2013 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/11/15/204268.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/204268.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/11/15/204268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/204268.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/204268.html</trackback:ping><description><![CDATA[<br /><br />
<ul style="font-size: medium; font-family: Tahoma; orphans: 2; widows: 2; line-height: normal"><li><span style="font-size: 14pt; font-family: Arial; color: #010101">在Windows上编译ACE：</span></li><li style="list-style-type: none; display: inline">
<ol><li><span style="font-size: 14pt; font-family: Arial; color: #010101">安装</span><span style="font-size: 14pt; font-family: Arial">ActivePerl-5.14</span></li><li><span style="font-size: 14pt; font-family: Arial; color: #010101">设置环境变量</span><span style="font-size: 14pt; font-family: Arial">ACE_ROOT</span></li><li><span style="font-size: 14pt; font-family: Arial">创建文件 $ACE_ROOT/ace/config.h，写入如下内容 </span>
<ul><li><span style="font-size: 14pt; font-family: Arial">#include "ace/config-win32.h"</span></li></ul></li><li><span style="font-size: 14pt; font-family: Arial; color: #010101">X:\third\ACE_wrappers&gt;bin\mwc.pl -type vc9 ACE.mwc</span></li><li><span style="font-size: 14pt; font-family: Arial; color: #010101">打开</span><span style="font-size: 14pt; font-family: Arial">ACE.sln编译</span></li></ol></li><li><span style="font-size: 14pt; font-family: Arial">在Linux上编译ACE：</span> </li>
<ol><li><span style="font-size: 14pt; font-family: Arial">设置环境变量 </span>
<ul><li><span style="font-size: 14pt; font-family: Arial">vim ~/.bashrc</span></li><li><span style="font-size: 14pt; font-family: Arial">export ACE_ROOT=/home/yourname/ACE_wrappers</span></li><li><span style="font-size: 14pt; font-family: Arial">export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ACE_ROOT/ace</span></li></ul></li><li><span style="font-size: 14pt; font-family: Arial">创建文件 $ACE_ROOT/ace/config.h，写入如下内容 </span>
<ul><li><span style="font-size: 14pt; font-family: Arial">#include "ace/config-linux.h"</span></li></ul></li><li><span style="font-size: 14pt; font-family: Arial">创建文件 $ACE_ROOT/include/makeinclude/platform_macros.GNU 写入 </span>
<ul><li><span style="font-size: 14pt; font-family: Arial">include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU</span></li></ul></li><li><span style="font-size: 14pt; font-family: Arial">可以在 platform_macros.GNU 里写入 INSTALL_PREFIX=/home/yourname/ace_install_dir/ 来制定输出目录</span></li><li><span style="font-size: 14pt; font-family: Arial">./bin/mwc.pl -static -type make ACE.mwc</span></li><li><span style="font-size: 14pt; font-family: Arial">make ACE&nbsp;</span></li><li><span style="font-size: 14pt; font-family: Arial">生成：ar rv </span><span style="font-size: 14pt; font-family: Arial; color: #ff0000">../lib/libACE.a</span><span style="font-size: 14pt; font-family: Arial"> Local_Name_Space.o ....o</span></li><li style="list-style-type: none; display: inline"><span style="font-size: 14pt; font-family: Arial"></li></ol></li></ul>
<div>
<ul style="white-space: normal; text-transform: none; word-spacing: 0px; color: rgb(0,0,0); text-align: left; font: medium Tahoma; orphans: 2; widows: 2; letter-spacing: normal; text-indent: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><li><font size="2" face="Consolas, Courier New, Courier, mono, serif"><span style="font-size: 12pt; font-family: Arial; line-height: 18px">支持使用ACE_Dev_Poll_Reactor:</span></font></li>
<ol><li><font size="2" face="Consolas, Courier New, Courier, mono, serif"><span style="line-height: 18px"><span style="font-size: 12pt; font-family: Arial">Dev_Poll_Reactor这个文件编译需要定义ACE_HAS_EVENT_POLL宏，否则跳过，不编译。于是在</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000">config.h</span><span style="font-size: 12pt; font-family: Arial">里面加入了</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000">#</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000">d</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000">efine ACE_HAS_EVENT_POLL</span><span style="font-size: 12pt; font-family: Arial; color: ">，</span><span style="font-size: 12pt; font-family: Arial">重新编译库，再重新编译测试文件，全部成功，运行正常。</span></span></font></li><li><font size="2" face="Consolas, Courier New, Courier, mono, serif"><span style="font-size: 12pt; font-family: Arial; line-height: 18px">注意生成的libACE.a的路径和你程序连接的路径是否一致。一般通过MPC生成的库存在于</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000; line-height: 18px">$(ACE_ROOT)/lib/</span><span style="font-size: 12pt; font-family: Arial; line-height: 18px">目录下，而通过</span></font><span style="font-size: 12pt; font-family: Arial">autoconf 和 automake生成的库存在于</span><span style="font-size: 12pt; font-family: Arial; color: #ff0000">$(ACE_ROOT)/build/ace/.libs/</span><span style="font-size: 12pt; font-family: Arial">目录下。</span></li><li style="list-style-type: none; display: inline"></span><span style="font-size: 14pt; font-family: Arial"><br /></span></li></ol></li></ul></div>参考：&nbsp;<a href="http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/MPC/docs/USAGE">http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/MPC/docs/USAGE</a><br /><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/204268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-11-15 16:26 <a href="http://www.cppblog.com/toMyself/archive/2013/11/15/204268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE UDP Client and Server example</title><link>http://www.cppblog.com/toMyself/archive/2013/10/08/203595.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 08 Oct 2013 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/10/08/203595.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/203595.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/10/08/203595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/203595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/203595.html</trackback:ping><description><![CDATA[<br /><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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;UDP_Peer_Event_Handler.h<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#ifndef&nbsp;_UDP_PEER_EVENT_HANDLER_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_UDP_PEER_EVENT_HANDLER_H_<br /><br />#include&nbsp;"ace/SOCK_Dgram.h"<br />#include&nbsp;"ace/INET_Addr.h"<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;UDP_Peer_Event_Handler&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ACE_Event_Handler<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;ACE_Event_Handler&nbsp;super;<br /><br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;UDP_Peer_Event_Handler&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;ACE_INET_Addr&nbsp;&amp;local_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~UDP_Peer_Event_Handler();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;ACE_HANDLE&nbsp;get_handle&nbsp;(<span style="color: #0000FF; ">void</span>)&nbsp;<span style="color: #0000FF; ">const</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_input&nbsp;(ACE_HANDLE&nbsp;handle);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_timeout&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;ACE_Time_Value&nbsp;&amp;&nbsp;tv,<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*arg&nbsp;=&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_close&nbsp;(ACE_HANDLE&nbsp;handle,ACE_Reactor_Mask&nbsp;close_mask);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_signal&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;signum,&nbsp;siginfo_t*&nbsp;siginfo,&nbsp;ucontext_t*&nbsp;context);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;send&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*buf,&nbsp;size_t&nbsp;len,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ACE_INET_Addr&nbsp;&amp;addr);<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">ACE_SOCK_Dgram&nbsp;gram_;</span><br />};<br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;_UDP_PEER_EVENT_HANDLER_H_</span></div><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;UDP_Peer_Event_Handler.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"UDP_Peer_Event_Handler.h"<br /><br /><br />UDP_Peer_Event_Handler::UDP_Peer_Event_Handler&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;ACE_INET_Addr&nbsp;&amp;local_addr)<br />:&nbsp;gram_(local_addr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG((LM_DEBUG,&nbsp;"UDP_Peer_Event_Handler&nbsp;constructor&nbsp;was&nbsp;called.\n"));<br />}<br /><br /><br />UDP_Peer_Event_Handler::~UDP_Peer_Event_Handler()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG((LM_DEBUG,&nbsp;"UDP_Peer_Event_Handler&nbsp;destructor&nbsp;was&nbsp;called.\n"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;gram_.close();<br />}<br /><br /><br />ACE_HANDLE&nbsp;UDP_Peer_Event_Handler::get_handle&nbsp;(<span style="color: #0000FF; ">void</span>)&nbsp;<span style="color: #0000FF; ">const</span><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>-&gt;gram_.get_handle();<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;UDP_Peer_Event_Handler::handle_close&nbsp;(ACE_HANDLE&nbsp;handle,&nbsp;ACE_Reactor_Mask&nbsp;mask)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG((LM_DEBUG,&nbsp;"************handle_close***********\n"));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mask&nbsp;==&nbsp;ACE_Event_Handler::WRITE_MASK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;super::handle_close(handle,&nbsp;mask);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;UDP_Peer_Event_Handler::handle_input&nbsp;(ACE_HANDLE)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[BUFSIZ];<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_INET_Addr&nbsp;from_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;address[32];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">ACE_DEBUG&nbsp;((LM_DEBUG,"(%P|%t)&nbsp;activity&nbsp;occurred&nbsp;on&nbsp;handle&nbsp;%d!/n",this-&gt;gram_.get_handle&nbsp;()));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;nbytes&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;gram_.recv&nbsp;(buf,&nbsp;<span style="color: #0000FF; ">sizeof</span>(buf),&nbsp;from_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nbytes&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR&nbsp;((LM_ERROR,"%p","handle_input&nbsp;error/n"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,&nbsp;"[%d]bytes&nbsp;from[%s]&nbsp;received:%s/n",&nbsp;nbytes,&nbsp;address,&nbsp;buf));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;UDP_Peer_Event_Handler::handle_timeout&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;ACE_Time_Value&nbsp;&amp;,<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,"(%P|%t)&nbsp;timed&nbsp;out&nbsp;for&nbsp;udp/n"));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;UDP_Peer_Event_Handler::handle_signal&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;signum,&nbsp;siginfo_t*&nbsp;siginfo,&nbsp;ucontext_t*&nbsp;context)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ACE_Event_Handler::handle_signal&nbsp;(signum,&nbsp;siginfo,&nbsp;context);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;UDP_Peer_Event_Handler::send&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*buf,size_t&nbsp;len,<span style="color: #0000FF; ">const</span>&nbsp;ACE_INET_Addr&nbsp;&amp;addr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>-&gt;gram_.send&nbsp;(buf,&nbsp;len,&nbsp;addr);<br />}</div><br /><br /><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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ACE_UDP_Server.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"UDP_Peer_Event_Handler.h"<br />#include&nbsp;"ace/OS_main.h"<br />#include&nbsp;"ace/Reactor.h"<br /><br /><span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">const</span>&nbsp;u_short&nbsp;SERVER_PORT&nbsp;=&nbsp;10101;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;ACE_TMAIN&nbsp;(<span style="color: #0000FF; ">int</span>,&nbsp;ACE_TCHAR&nbsp;*[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_INET_Addr&nbsp;<span style="color: red;">local_addr(SERVER_PORT);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;UDP_Peer_Event_Handler&nbsp;*udp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_NEW_RETURN(udp,&nbsp;UDP_Peer_Event_Handler(local_addr),&nbsp;-1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ACE_Reactor::instance()-&gt;register_handler(udp,&nbsp;ACE_Event_Handler::READ_MASK)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR_RETURN((LM_ERROR,&nbsp;"ACE_Reactor::register_handler"),&nbsp;-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_Reactor::instance()-&gt;run_event_loop();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><br /><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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ACE_UDP_Client.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"UDP_Peer_Event_Handler.h"<br />#include&nbsp;"ace/OS_main.h"<br />#include&nbsp;"ace/Reactor.h"<br /><br /><span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;u_short&nbsp;SERVER_PORT&nbsp;=&nbsp;10101;<br /><span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*SERVER_HOST_NAME&nbsp;=&nbsp;"127.0.0.1";&nbsp;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;ACE_TMAIN&nbsp;(<span style="color: #0000FF; ">int</span>,&nbsp;ACE_TCHAR&nbsp;*[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_INET_Addr<span style="color: red;">&nbsp;local_addr((u_short)0);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;UDP_Peer_Event_Handler&nbsp;*udp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_NEW_RETURN(udp,&nbsp;UDP_Peer_Event_Handler(local_addr),&nbsp;-1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_INET_Addr&nbsp;remote_addr(SERVER_PORT,&nbsp;SERVER_HOST_NAME);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;udp-&gt;send("hello",&nbsp;5,&nbsp;remote_addr);&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;SEND&nbsp;MESSAGE</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ACE_Reactor::instance()-&gt;register_handler(udp,&nbsp;ACE_Event_Handler::WRITE_MASK)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR_RETURN((LM_ERROR,&nbsp;"ACE_Reactor::register_handler"),&nbsp;-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_Reactor::instance()-&gt;run_event_loop();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/203595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-10-08 15:31 <a href="http://www.cppblog.com/toMyself/archive/2013/10/08/203595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE TCP Client and Server example</title><link>http://www.cppblog.com/toMyself/archive/2013/10/08/203593.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 08 Oct 2013 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/10/08/203593.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/203593.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/10/08/203593.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/203593.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/203593.html</trackback:ping><description><![CDATA[<br /><br /><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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;TCP_Peer_Event_Handler.h<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#ifndef&nbsp;_TCP_PEER_EVENT_HANDLER_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_TCP_PEER_EVENT_HANDLER_H_<br /><br />#include&nbsp;"ace/Message_Block.h"<br />#include&nbsp;"ace/SOCK_Stream.h"<br />#include&nbsp;"ace/Svc_Handler.h"<br /><br /><br /><span style="color: #0000FF; ">class</span>&nbsp;TCP_Peer_Event_Handler&nbsp;:<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ACE_Svc_Handler&lt;ACE_SOCK_STREAM,&nbsp;ACE_NULL_SYNCH&gt;<br />{<br />&nbsp;&nbsp;typedef&nbsp;ACE_Svc_Handler&lt;ACE_SOCK_STREAM,&nbsp;ACE_NULL_SYNCH&gt;&nbsp;super;<br /><br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;TCP_Peer_Event_Handler();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~TCP_Peer_Event_Handler();<br /><br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;Activate&nbsp;the&nbsp;client&nbsp;handler.&nbsp;&nbsp;This&nbsp;is&nbsp;typically&nbsp;called&nbsp;by&nbsp;the<br />&nbsp;&nbsp;</span><span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;ACE_Acceptor&nbsp;or&nbsp;ACE_Connector.</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;<span style="color: #ff0000;">open</span>&nbsp;(<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;=&nbsp;0);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;input&nbsp;is&nbsp;available&nbsp;from&nbsp;the&nbsp;client.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_input&nbsp;(ACE_HANDLE&nbsp;fd&nbsp;=&nbsp;ACE_INVALID_HANDLE);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;output&nbsp;is&nbsp;possible.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_output&nbsp;(ACE_HANDLE&nbsp;fd&nbsp;=&nbsp;ACE_INVALID_HANDLE);<br /><br />&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Called&nbsp;when&nbsp;this&nbsp;handler&nbsp;is&nbsp;removed&nbsp;from&nbsp;the&nbsp;ACE_Reactor.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;handle_close&nbsp;(ACE_HANDLE&nbsp;handle,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_Reactor_Mask&nbsp;close_mask);<br />};<br /><br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;_TCP_PEER_EVENT_HANDLER_H_</span></div><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;TCP_Peer_Event_Handler.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"TCP_Peer_Event_Handler.h"<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;MAXHOSTNAMELEN&nbsp;&nbsp;&nbsp;255<br /><br /><br />TCP_Peer_Event_Handler::TCP_Peer_Event_Handler()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,&nbsp;ACE_TEXT("(%P|%t)&nbsp;TCP_Peer_Event_Handler&nbsp;constructor!\n")));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor(get_reactor());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;TCP_Peer_Event_Handler()&nbsp;Using&nbsp;reactor&nbsp;0x%x\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor()));<br />}<br /><br /><br />TCP_Peer_Event_Handler::~TCP_Peer_Event_Handler()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,&nbsp;ACE_TEXT("(%P|%t)&nbsp;TCP_Peer_Event_Handler&nbsp;destructor!\n")));<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;TCP_Peer_Event_Handler<span style="color: #ff0000;">:</span><span style="color: #ff0000;">:</span><span style="color: #ff0000;">open(</span><span style="color: #0000FF; ">void</span>&nbsp;*p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;open()&nbsp;Using&nbsp;reactor&nbsp;0x%x\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor()));<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(super::open&nbsp;(p)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br /><br />&nbsp;&nbsp;ACE_TCHAR&nbsp;peer_name[MAXHOSTNAMELEN];<br />&nbsp;&nbsp;ACE_INET_Addr&nbsp;peer_addr;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;peer&nbsp;().get_remote_addr&nbsp;(peer_addr)&nbsp;==&nbsp;0&nbsp;&amp;&amp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peer_addr.addr_to_string&nbsp;(peer_name,&nbsp;MAXHOSTNAMELEN)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;Connection&nbsp;from&nbsp;%s\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;peer_name));<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;TCP_Peer_Event_Handler::handle_input(ACE_HANDLE)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;handle_input()&nbsp;Using&nbsp;reactor&nbsp;0x%x\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor()));<br /><br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;size_t&nbsp;INPUT_SIZE&nbsp;=&nbsp;4096;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buffer[INPUT_SIZE];<br />&nbsp;&nbsp;ssize_t&nbsp;recv_cnt,&nbsp;send_cnt;<br /><br />&nbsp;&nbsp;recv_cnt&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;<span style="color: #ff0000;">peer&nbsp;().recv</span>&nbsp;(buffer,&nbsp;<span style="color: #0000FF; ">sizeof</span>(buffer));<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(recv_cnt&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;Connection&nbsp;closed\n")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;buffer[recv_cnt]&nbsp;=&nbsp;'\0';<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;Recv&nbsp;%s\n"),&nbsp;buffer));<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;send_cnt&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;peer&nbsp;().send&nbsp;(buffer,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_static_cast&nbsp;(size_t,&nbsp;recv_cnt));<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(send_cnt&nbsp;==&nbsp;recv_cnt)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(send_cnt&nbsp;==&nbsp;-1&nbsp;&amp;&amp;&nbsp;ACE_OS::last_error&nbsp;()&nbsp;!=&nbsp;EWOULDBLOCK)<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR_RETURN&nbsp;((LM_ERROR,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;%p\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("send")),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(send_cnt&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;send_cnt&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;ACE_Message_Block&nbsp;*mb;<br />&nbsp;&nbsp;size_t&nbsp;remaining&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_static_cast&nbsp;(size_t,&nbsp;(recv_cnt&nbsp;-&nbsp;send_cnt));<br />&nbsp;&nbsp;ACE_NEW_RETURN<br />&nbsp;&nbsp;&nbsp;&nbsp;(mb,&nbsp;ACE_Message_Block&nbsp;(&amp;buffer[send_cnt],&nbsp;remaining),&nbsp;-1);<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;output_off&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;msg_queue&nbsp;()-&gt;is_empty&nbsp;();<br />&nbsp;&nbsp;ACE_Time_Value&nbsp;nowait&nbsp;(ACE_OS::gettimeofday&nbsp;());<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;putq&nbsp;(mb,&nbsp;&amp;nowait)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR&nbsp;((LM_ERROR,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;%p;&nbsp;discarding&nbsp;data\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("enqueue&nbsp;failed")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mb-&gt;release&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(output_off)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor&nbsp;()-&gt;register_handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">this</span>,&nbsp;ACE_Event_Handler::WRITE_MASK);<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;TCP_Peer_Event_Handler::handle_output(ACE_HANDLE)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;handle_output()&nbsp;Using&nbsp;reactor&nbsp;0x%x\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor()));<br /><br /><br />&nbsp;&nbsp;ACE_Message_Block&nbsp;*mb;<br />&nbsp;&nbsp;ACE_Time_Value&nbsp;nowait&nbsp;(ACE_OS::gettimeofday&nbsp;());<br />&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(-1&nbsp;!=&nbsp;<span style="color: #0000FF; ">this</span>-&gt;getq&nbsp;(mb,&nbsp;&amp;nowait))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;send_cnt&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;<span style="color: #ff0000;">peer&nbsp;().send</span>&nbsp;(mb-&gt;rd_ptr&nbsp;(),&nbsp;mb-&gt;length&nbsp;());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(send_cnt&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR&nbsp;((LM_ERROR,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;%p\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("send")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mb-&gt;rd_ptr&nbsp;(ACE_static_cast&nbsp;(size_t,&nbsp;send_cnt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mb-&gt;length&nbsp;()&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;ungetq&nbsp;(mb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mb-&gt;release&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(<span style="color: #0000FF; ">this</span>-&gt;msg_queue&nbsp;()-&gt;is_empty&nbsp;())&nbsp;?&nbsp;-1&nbsp;:&nbsp;0;<br />}<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;TCP_Peer_Event_Handler::handle_close&nbsp;(ACE_HANDLE&nbsp;h,&nbsp;ACE_Reactor_Mask&nbsp;mask)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG&nbsp;((LM_DEBUG,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("(%P|%t)&nbsp;handle_close()&nbsp;Using&nbsp;reactor&nbsp;0x%x\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;reactor()));<br /><br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mask&nbsp;==&nbsp;ACE_Event_Handler::WRITE_MASK)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;super::handle_close&nbsp;(h,&nbsp;mask);<br />}</div><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ACE_TCP_Server.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"TCP_Peer_Event_Handler.h"<br />#include&nbsp;"ace/Log_Msg.h"<br />#include&nbsp;"ace/INET_Addr.h"<br />#include&nbsp;"ace/SOCK_Acceptor.h"<br />#include&nbsp;"ace/Reactor.h"<br />#include&nbsp;"ace/Acceptor.h"<br />#include&nbsp;&lt;ace/TP_Reactor.h&gt;<br />#include&nbsp;&lt;ace/Dev_Poll_Reactor.h&gt;<br /><br /><br /><span style="color: #ff0000;">typedef&nbsp;ACE_Acceptor&lt;TCP_Peer_Event_Handler,&nbsp;ACE_SOCK_ACCEPTOR&gt;&nbsp;</span><br /><span style="color: #ff0000;">&nbsp; TCP_Client_Acceptor;</span><br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;ACE_TMAIN&nbsp;(<span style="color: #0000FF; ">int</span>,&nbsp;ACE_TCHAR&nbsp;*[])<br />{<br />&nbsp;&nbsp;ACE_INET_Addr&nbsp;port_to_listen("8112");<br />&nbsp;&nbsp;TCP_Client_Acceptor&nbsp;acceptor;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #ff0000;">acceptor.open</span>&nbsp;(port_to_listen)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br /><br />&nbsp;&nbsp;ACE_Reactor::instance&nbsp;()-&gt;run_reactor_event_loop&nbsp;();<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(0);<br />}</div><br /><br /><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: #008000; ">/*</span><span style="color: #008000; ">&nbsp;ACE_TCP_Client.cpp<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />#include&nbsp;"TCP_Peer_Event_Handler.h"<br /><br /><span style="color: #ff0000;">typedef&nbsp;ACE_Connector&lt;TCP_Peer_Event_Handler,&nbsp;ACE_SOCK_CONNECTOR&gt;</span><br /><span style="color: #ff0000;">&nbsp;&nbsp;TCP_Client_Connector;</span><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;ACE_TMAIN&nbsp;(<span style="color: #0000FF; ">int</span>,&nbsp;ACE_TCHAR&nbsp;*[])<br />{<br />&nbsp;&nbsp;ACE_INET_Addr&nbsp;port_to_connect&nbsp;("8112",&nbsp;ACE_LOCALHOST);<br />&nbsp;&nbsp;TCP_Client_Connector&nbsp;connector;<br />&nbsp;&nbsp;TCP_Peer_Event_Handler&nbsp;client;<br />&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #ff0000;">connector.connect</span>&nbsp;(&amp;client,&nbsp;port_to_connect)&nbsp;==&nbsp;-1)<br />&nbsp;&nbsp;&nbsp;&nbsp;ACE_ERROR_RETURN&nbsp;((LM_ERROR,&nbsp;ACE_TEXT&nbsp;("%p\n"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_TEXT&nbsp;("connect")),&nbsp;1);<br /><br />&nbsp;&nbsp;ACE_Reactor::instance&nbsp;()-&gt;run_reactor_event_loop&nbsp;();<br />&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(0);<br />}</div><br /><br /><br /><br /><br /><div></div><img src ="http://www.cppblog.com/toMyself/aggbug/203593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-10-08 15:06 <a href="http://www.cppblog.com/toMyself/archive/2013/10/08/203593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Use of ACE</title><link>http://www.cppblog.com/toMyself/archive/2013/09/17/203281.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 17 Sep 2013 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/09/17/203281.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/203281.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/09/17/203281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/203281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/203281.html</trackback:ping><description><![CDATA[<br /><div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"><ul><li><span style="text-align: -webkit-auto; font-family: Arial; font-size: 12pt;">Using the Acceptor-Connector Framework</span></li><li style="list-style: none; display: inline"><ol><li><a href="http://edc.tversu.ru/elib/inf/0027/0201699710_ch07lev1sec6.html"><span style="font-family: Arial; font-size: 12pt;">http://edc.tversu.ru/elib/inf/0027/0201699710_ch07lev1sec6.html</span></a><br /><em style="font-family: Arial; font-size: 12pt;">When it accepts a new connectio</em><em style="font-family: Arial; font-size: 12pt;">n, an ACE_Acceptor creates a new sevice handler instance&#8212;in our case, </em><em style="font-family: Arial; font-size: 12pt;">a ClientService object. After cre</em><em style="font-family: Arial; font-size: 12pt;">ating it,</em><em style="font-family: Arial; font-size: 12pt;"> ACE_Acceptor calls the new service handler's open() hook method;</em><br /></li></ol></li><li><span style="font-family: Arial; font-size: 12pt;">ACE_Message_Block</span></li><li style="list-style: none; display: inline"><ol><li><a href="http://www.dre.vanderbilt.edu/Doxygen/5.6/html/ace/classACE__Message__Block.html"><span style="font-family: Arial; font-size: 12pt;">http://www.dre.vanderbilt.edu/Doxygen/5.6/html/ace/classACE__Message__Block.html</span></a></li></ol></li></ul><div></div></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div></div><img src ="http://www.cppblog.com/toMyself/aggbug/203281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-09-17 15:58 <a href="http://www.cppblog.com/toMyself/archive/2013/09/17/203281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACE读书笔记</title><link>http://www.cppblog.com/toMyself/archive/2013/09/03/202984.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Tue, 03 Sep 2013 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/09/03/202984.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/202984.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/09/03/202984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/202984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/202984.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; font-size: 18pt;">目录<br />
<a href="#title1" title="1. 整体说明">1. 整体说明</a><br />
<a href="#title2" title="2. ACE C++ Wrapper Facade">2. ACE C++ Wrapper Facade</a><br />
<a href="#title3" title="3. ACE框架">3. ACE框架</a><br />
<a href="#title4" title="4. 参考">4. 参考</a><br />
<a href="#attach1" title="附1. 单播、多播和广播">附1. 单播、多播和广播</a><br />
<a href="#attach2" title="附2. 深入C++丛书">附2. 深入C++丛书</a><br />
<br />
<br />
</span>
<h1><a name='title1' id='title1'></a><span style="font-family: Arial; font-size: 18pt;">1.&nbsp;整体说明</span></h1>
<p><span style="font-family:宋体;">应用环境下的面向对象中间件层次（</span>4<span style="font-family:宋体;">层）：</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">1）&nbsp;<span style="font-family:宋体;">主机基础设施中间件：封装</span>OS API<span style="font-family:宋体;">；</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">2）&nbsp;<span style="font-family:宋体;">分布式中间件：在</span>1<span style="font-family:宋体;">）的基础上提供更高级的服务，例如连接管理和内存管理、同步、多线程等。</span>CORBA<span style="font-family:宋体;">、</span>ACE ORB<span style="font-family:宋体;">（</span>TAO<span style="font-family:宋体;">）？</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">3）&nbsp;<span style="font-family:宋体;">公共中间件服务：为各种具体应用抽取出公共的服务，例如事件通知、日志记录、持久性、安全且可恢复的事务等。</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">4）&nbsp;<span style="font-family:宋体;">特定领域中间件服务：为特定的领域（例如电信、电子商务等）提供特定的服务。</span></p>
<p>&nbsp;</p>
<p><span style="font-family:宋体;">分析过程、领域分析（</span>domain analysis<span style="font-family:宋体;">）</span></p>
<p><span style="font-family:宋体;">问题空间（</span>problem space<span style="font-family:宋体;">）：面对的是&#8220;软件体系及设计&#8221;方面的问题。</span></p>
<p><span style="font-family:宋体;">方案空间（</span>solution space<span style="font-family:宋体;">）：涉及的是&#8220;实现应用程序的软件工具和技术&#8221;。</span></p>
<p><span style="font-family:宋体;">设计空间（</span>design dimension<span style="font-family:宋体;">），属于问题空间（？），了解领域内的抽象概念，达成共识。</span></p>
<p>&nbsp;</p>
<p>ACE<span style="font-family:宋体;">的层次化体系结构：</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">1）&nbsp;ACE OS Adaptation<span style="font-family:宋体;">层（</span>10%<span style="font-family:宋体;">）：由一个名为</span>ACE_OS<span style="font-family:宋体;">的类构成，包含</span>500<span style="font-family:宋体;">多个</span>C++<span style="font-family:宋体;">静态方法，这些方法封装了原始的、基于</span>C<span style="font-family:宋体;">的</span>OS API<span style="font-family:宋体;">。</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">2）&nbsp;ACE C++ Wrapper Fa&#231;ade<span style="font-family:宋体;">层（</span>50%<span style="font-family:宋体;">）：在以面向对象的方法将</span>1<span style="font-family:宋体;">）中的方法封装成</span>C++<span style="font-family:宋体;">类。</span></p>
<p><span style="font-family:宋体;">分类：通信服务、<strong>连接</strong></span><strong>/</strong><strong><span style="font-family:宋体;">通信角色</span></strong><span style="font-family:宋体;">、通信领域。</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;">3）&nbsp;ACE framework<span style="font-family:宋体;">层（</span>40%<span style="font-family:宋体;">）：加强类间的关联，提供更大粒度上的软件复用。（参考《</span>c++<span style="font-family:宋体;">网络编程</span> <span style="font-family:宋体;">卷</span>2<span style="font-family:宋体;">》）</span></p>
<h1><a name='title2' id='title2'></a>2.&nbsp;ACE C++ Wrapper Fa&#231;ade</h1>
<p><strong>&nbsp; &nbsp; &nbsp;Network &lt;--&gt;Socket related &lt;--&gt; Message Block related &lt;--&gt; I/O CDR related</strong></p>
<p><strong><span style="font-family:宋体;">&nbsp; &nbsp;其中</span>Socket related</strong><strong><span style="font-family:宋体;">包括：</span>Address </strong><strong><span style="font-family:宋体;">、</span>Connector</strong><strong><span style="font-family:宋体;">、</span>Acceptor</strong><strong><span style="font-family:宋体;">和</span>Stream</strong><strong><span style="font-family:宋体;">。</span></strong></p>
<p style="text-indent:20.65pt;"><strong><span style="font-family:宋体;">服务器的并发设计</span>: I/O</strong><strong><span style="font-family:宋体;">操作是否频繁、计算任务是否繁重（&#8220;计算密集&#8221;型服务）。</span></strong></p>
<p><strong>&nbsp; &nbsp; &nbsp;</strong><strong><span style="font-family:宋体;">在整个</span>ACE</strong><strong><span style="font-family:宋体;">中使用统一的返回约定，即</span>0</strong><strong><span style="font-family:宋体;">表示成功，</span>-1</strong><strong><span style="font-family:宋体;">表示失败，失败的原因保存在</span>errno</strong><strong><span style="font-family:宋体;">中。</span></strong></p>
<h1><a name='title3' id='title3'></a>3.&nbsp;ACE框架</h1>
<p><img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_01.png" width="788" height="197" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_02.png" width="555" height="100" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_03.png" width="555" height="72" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_04.png" width="554" height="76" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_05.png" width="555" height="93" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_06.png" width="555" height="120" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_07.png" width="555" height="72" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_08.png" width="583" height="190" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_09.png" width="577" height="105" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_10.png" width="401" height="488" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_11.png" width="472" height="446" alt="" /><br />
<br />
</p>
<h1><a name='title4' id='title4'></a>4.&nbsp;参考</h1>
<p><span style="font-family:宋体;">《</span>Advanced CORBA Programming with C++<span style="font-family:宋体;">》</span></p>
<p><a href="http://ace.ece.uci.edu/">http://ace.ece.uci.edu/</a></p>
<p><a href="http://www.riverace.com/">http://www.riverace.com</a></p>
<p><a href="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</a></p>
<p><strong>&nbsp;</strong></p>
<p>Douglas C.Schmidt</p>
<p><span style="font-size:9.0pt; font-family:宋体;color:#333333;background:white">美国</span><span style="font-size:9.0pt;font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333;background:white">Vanderbilt</span><span style="font-size:9.0pt;font-family:宋体;color:#333333; background:white">大学电子工程与计算机科学系的教授。除了学术研究而外</span><span style="font-size:9.0pt;font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333;background:white">,Schmidt</span><span style="font-size:9.0pt;font-family:宋体;color:#333333; background:white">教授在面向对象通信系统构建方面已经拥有超过十年的经验。他是面向对象框架</span><span style="font-size:9.0pt;font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333;background:white">Adaptive Communication Environment(ACE)</span><span style="font-size:9.0pt;font-family:宋体;color:#333333;background:white">的首席架构者和开发者</span><span style="font-size:9.0pt;font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333;background:white">,</span><span style="font-size:9.0pt;font-family:宋体;color:#333333; background:white">该框架可自由获取、并得到了广泛使用</span><span style="font-size:9.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333; background:white">,</span><span style="font-size:9.0pt;font-family:宋体;color:#333333;background:white">其中含有一组丰富的组件</span><span style="font-size:9.0pt;font-family: &quot;Tahoma&quot;,&quot;sans-serif&quot;;color:#333333;background:white">,</span><span style="font-size:9.0pt;font-family:宋体;color:#333333; background:white">实现了用于高性能和实时通信系统的各种设计模式。</span></p>
<p><img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_12.png" width="971" height="82" alt="" /><br />
</p>
<p>&nbsp;</p>
<h1><a name='attach1' id='attach1'></a>附1. 单播、多播和广播</h1>
<p style="margin-left:18.0pt;text-indent:-18.0pt;"><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432">1，&nbsp;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">单播（</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">unicast</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">）：有具体目标地址的帧从源到达目标地址的过程。比如你对小月喊</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8220;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">小月</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8221;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">，那么只有小月答应你</span>&nbsp;<span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。单播是说，对特定的主机进行数据传送。例如给某一个主机发送</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">IP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">数据包。这时候，数据链路层给出的数据头里面是非常具体的目的地址，对于以太网来</span> <span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">说，就是网卡的</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">MAC</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">地址（不是</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">FF-FF-FF-FF-FF-FF</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">这样的地址）。现在的具有路由功能的主机应该可以将单播数据定向转发，而目的主机的网</span> <span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">络接口则可以过滤掉和自己</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">MAC</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">地址不一致的数据。</span></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;"><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432">2，&nbsp;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">多播（</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">multicast</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">）：也叫组播。仅应用于</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">UDP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。就是帧送往定义在一组内的地址。比如你喊：</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8220;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">是男人都过来一人发一百块钱</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8221;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。哪么男的都会过来女的就不会过来因为没有钱发她不会理你。多播组？帧仅传送给属于多播组的多个主机。使用多播，主机可加入一个或多个多播组。这样，网卡将获悉该主机属于哪个多播组，然后仅接收主机所在多播组的那些多播帧。</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">Internet</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">组管理协议（</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IGMP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">）、多播路由协议（如</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">PIM</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">、</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">DVMRP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">等）？当一台主机欲加入某个多播组时，会发出</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8220;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">主机成员报告</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8221;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">的</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IGMP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时，便会将其转发给所有的多播主机。多播路由器还会周期性地发出</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8220;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">主机成员查询</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8221;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">的</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IGMP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">消息，向子网查询多播主机，若发现某个多播组已没有任何成员，则停止转发该多播组的数据。此外，当支持</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IGMP v2</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">的主机（如Ｗ</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">indows 98/2000</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">计算机）退出某个多播组时，还会向路由器发送一条</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8220;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">离开组</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">&#8221;</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">的</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IGMP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">消息，以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时，路由器才会停止向该子网转发该多播组的数据。</span><span style="font-size: 9pt; font-family: Arial, sans-serif; background-color: white; background-position: initial initial; background-repeat: initial initial;">IP</span><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">多播应用的编程方法？</span></p>
<p style="margin-left:18.0pt"><span style="font-size: 9pt; font-family: 宋体; background-color: white; background-position: initial initial; background-repeat: initial initial;">参考：</span><a href="http://baike.baidu.com/view/378050.htm">http://baike.baidu.com/view/378050.htm</a></p>
<p style="margin-left:18.0pt;text-indent:-18.0pt;"><span style="font-size:9.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432">3，&nbsp;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">广播（</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">broadcast</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">）：仅应用于</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">UDP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。就是把帧发往所有能到达的地址。比如学校的广播中喊</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8220;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">今天放假</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">&#8221;</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。哪么全校的同学都会响应，大叫爽死了。广播是主机针对某一个网络上的所有主机发送数据包。这个网络可能是网络，可能是子网，还可能是所有的子网。如果是网络，例如</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">A</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">类网址的广播就是</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white"> netid.255.255.255</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">，如果是子网，则是</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">netid.netid.subnetid.255</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">；如果是所有的子网（</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">B</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">类</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">IP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">）则是则是</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white"> netid.netid.255.255</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。广播所用的</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">MAC</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">地址</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">FF-FF-FF-FF-FF-FF</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">。网络内所有的主机都会收到这个广播数据，网卡只要把</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white"> MAC</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">地址为</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">FF-FF-FF-FF-FF-FF</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">的数据交给内核就可以了。一般说来</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">ARP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">，或者路由协议</span><span style="font-size:9.0pt;font-family: &quot;Verdana&quot;,&quot;sans-serif&quot;;color:#323432;background:white">RIP</span><span style="font-size:9.0pt;font-family:宋体;color:#323432;background:white">应该是以广播的形式播发的。</span></p>
<h1><a name='attach2' id='attach2'></a>附2. 深入C++丛书</h1>
<p><img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_13.png" width="554" height="403" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/tomyself/ace_intro_14.png" width="554" height="328" alt="" /><br />
<br />
<br />
</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/toMyself/aggbug/202984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-09-03 13:38 <a href="http://www.cppblog.com/toMyself/archive/2013/09/03/202984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cpp-netlib之async_client解析</title><link>http://www.cppblog.com/toMyself/archive/2013/07/15/201825.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 15 Jul 2013 09:19:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/07/15/201825.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201825.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/07/15/201825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201825.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201825.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">cpp-netlib:</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">参考：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">1.&nbsp;</span><a href="http://cpp-netlib.org/" style="color: #1d58d1; text-decoration: none; line-height: normal; text-align: -webkit-auto; background-color: #ffffff; font-family: Tahoma; orphans: 2; widows: 2; font-size: medium;">http://cpp-netlib.org/<br /></a><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">2.&nbsp;</span><a href="https://github.com/cpp-netlib/" style="color: #1d58d1; text-decoration: none; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">https://github.com/cpp-netlib/</a><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">3.&nbsp;</span><a href="http://github.com/cpp-netlib/" style="color: #1d58d1; text-decoration: none; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">http://github.com/cpp-netlib/</a><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">解析版本： cpp-netlib-0.9.4</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">注：使用的boost版本为boost_1_53_0。 若使用boost_1_46_1在Windows上编译会出现错误。<br /><br /><br /></span><div>testClient.cpp：</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;boost/shared_ptr.hpp&gt;<br />#include&nbsp;&lt;boost/network/protocol/http/client.hpp&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;http&nbsp;=&nbsp;boost::network::http;<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;boost::network;<br /><br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;body_handler&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">explicit</span>&nbsp;body_handler(<span style="color: #0000FF; ">void</span>*&nbsp;context)<br />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;context_(context)&nbsp;{}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_NETWORK_HTTP_BODY_CALLBACK(<span style="color: #0000FF; ">operator</span>(),&nbsp;range,&nbsp;error)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;in&nbsp;here,&nbsp;range&nbsp;is&nbsp;the&nbsp;Boost.Range&nbsp;iterator_range,&nbsp;and&nbsp;error&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;Boost.System&nbsp;error&nbsp;code.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!error)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Received&nbsp;"&nbsp;&lt;&lt;&nbsp;boost::distance(range)&nbsp;&lt;&lt;&nbsp;"bytes."&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body_.append(boost::begin(range),&nbsp;boost::end(range));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"body:&nbsp;"&nbsp;&lt;&lt;&nbsp;body_&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Error:&nbsp;"&nbsp;&lt;&lt;&nbsp;error&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;context_;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;body_;<br />};<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(std::exception&nbsp;&amp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;!=&nbsp;2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"Usage:&nbsp;"&nbsp;&lt;&lt;&nbsp;argv[0]&nbsp;&lt;&lt;&nbsp;"&nbsp;[url]"&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;http::client&nbsp;client;<br />&nbsp;&nbsp;&nbsp;&nbsp;http::client::request&nbsp;request(argv[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;&lt;&lt;&nbsp;header("Connection",&nbsp;"close");<br />&nbsp;&nbsp;&nbsp;&nbsp;http::client::response&nbsp;response&nbsp;=&nbsp;client.<span style="color: #0000FF; ">get</span>(request,&nbsp;http::_body_handler=body_handler(NULL));<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"status:&nbsp;"&nbsp;&lt;&lt;&nbsp;http::status(response)&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/201825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-07-15 17:19 <a href="http://www.cppblog.com/toMyself/archive/2013/07/15/201825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cpp-netlib之三大组类</title><link>http://www.cppblog.com/toMyself/archive/2013/07/15/201821.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 15 Jul 2013 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/07/15/201821.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201821.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/07/15/201821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201821.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201821.html</trackback:ping><description><![CDATA[1. cpp-netlib-class-server<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cpp-netlib-class-server.jpg" width="849" height="1021" alt="" /><br /><br />2. cpp-netlib-class-client<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cpp-netlib-class-client.jpg" width="792" height="846" alt="" /><br /><br />3. cpp-netlib-class-message<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cpp-netlib-class-message.jpg" width="955" height="679" alt="" /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/201821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-07-15 16:59 <a href="http://www.cppblog.com/toMyself/archive/2013/07/15/201821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cpp-netlib之async_server解析</title><link>http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 15 Jul 2013 08:29:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201819.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201819.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201819.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">cpp-netlib:</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">参考：</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">1.&nbsp;</span><a href="http://cpp-netlib.org/" style="color: #1d58d1; text-decoration: none; line-height: normal; text-align: -webkit-auto; background-color: #ffffff; font-family: Tahoma; orphans: 2; widows: 2; font-size: medium;">http://cpp-netlib.org/<br /></a>2.&nbsp;<a href="https://github.com/cpp-netlib/">https://github.com/cpp-netlib/</a><br />3.&nbsp;<a href="http://github.com/cpp-netlib/">http://github.com/cpp-netlib/</a><br /><br /><br /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">解析版本： cpp-netlib-0.9.4</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff;">注：使用的boost版本为boost_1_53_0。 若使用boost_1_46_1在Windows上编译会出现错误。<br /><br /><br />测试代码</span>testAsyncServer.cpp<br /><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 />-->#include&nbsp;"CommonPrecomp.h"<br />#include&nbsp;"RequestHandler.h"<br />#include&nbsp;"RequestHandlerFactory.h"<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;test_handler&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;when&nbsp;there&nbsp;are&nbsp;many&nbsp;request&nbsp;at&nbsp;the&nbsp;same&nbsp;time,&nbsp;can&nbsp;put&nbsp;the&nbsp;request&nbsp;into&nbsp;a&nbsp;queue,&nbsp;then&nbsp;let&nbsp;another&nbsp;thread&nbsp;process&nbsp;it.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;or&nbsp;maybe&nbsp;need&nbsp;to&nbsp;call&nbsp;http::client&nbsp;to&nbsp;connect&nbsp;to&nbsp;other&nbsp;server,&nbsp;and&nbsp;get&nbsp;response.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()(<span style="color: #0000FF; ">const</span>&nbsp;server::request&nbsp;&amp;request,&nbsp;server::connection_ptr&nbsp;connection)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request_handler_ptr&nbsp;request_handler_&nbsp;=&nbsp;request_handler_factory::get_mutable_instance().create();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;request_handler_-&gt;start(request,&nbsp;connection);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;!=&nbsp;3)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;"Usage:&nbsp;"&nbsp;&lt;&lt;&nbsp;argv[0]&nbsp;&lt;&lt;&nbsp;"&nbsp;address&nbsp;port"&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test_handler&nbsp;handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utils::thread_pool&nbsp;thread_pool_(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;instance(argv[1],&nbsp;argv[2],&nbsp;handler,&nbsp;thread_pool_);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance.run();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(std::exception&nbsp;&amp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><div>CommonPrecomp.h</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 />-->#ifndef&nbsp;_COMMON_PRECOMP_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_COMMON_PRECOMP_H_<br /><br />#include&nbsp;&lt;boost/shared_ptr.hpp&gt;<br />#include&nbsp;&lt;boost/network/protocol/http/server.hpp&gt;<br />#include&nbsp;&lt;boost/range/algorithm/find_if.hpp&gt;<br />#include&nbsp;&lt;boost/serialization/singleton.hpp&gt;<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;http&nbsp;=&nbsp;boost::network::http;<br /><span style="color: #0000FF; ">namespace</span>&nbsp;utils&nbsp;=&nbsp;boost::network::utils;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;test_handler;<br />typedef&nbsp;boost::network::http::async_server&lt;test_handler&gt;&nbsp;server;<br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000;">&nbsp;_COMMON_PRECOMP_H_</span></div><br /><div>CommonPrecomp.cpp</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 />-->#include&nbsp;"CommonPrecomp.h"</div><br />RequestHandler.h<br /><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 />-->#ifndef&nbsp;_REQUEST_HANDLER_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_REQUEST_HANDLER_H_<br /><br /><br /><span style="color: #0000FF; ">class</span>&nbsp;request_handler<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;is_content_length&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;Header&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>()(Header&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;&nbsp;header)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;boost::iequals(header.name,&nbsp;"content-length");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;request_handler();<br />&nbsp;&nbsp;&nbsp;&nbsp;~request_handler();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;start(<span style="color: #0000FF; ">const</span>&nbsp;server::request&nbsp;&amp;request,&nbsp;server::connection_ptr&nbsp;connection);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;read_callback(server::connection::input_range&nbsp;input,&nbsp;boost::system::error_code&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;&nbsp;ec,&nbsp;std::size_t&nbsp;bytes_transferred,&nbsp;server::connection_ptr&nbsp;connection);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;write_callback(boost::system::error_code&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;&nbsp;ec);<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;uri_;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;content_;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::size_t&nbsp;content_length_;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::size_t&nbsp;read_content_length_;<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;server::response_header&nbsp;common_headers[3];<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;bad_request;<br />};<br /><br />typedef&nbsp;boost::shared_ptr&lt;request_handler&gt;&nbsp;request_handler_ptr;<br /><br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;_REQUEST_HANDLER_H_</span></div><br /><div>RequestHandler.cpp</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 />-->#include&nbsp;"CommonPrecomp.h"<br />#include&nbsp;"RequestHandler.h"<br />#include&nbsp;"RequestHandlerFactory.h"<br /><br />request_handler::request_handler()<br />:&nbsp;uri_()<br />,&nbsp;content_()<br />,&nbsp;content_length_(0)<br />,&nbsp;read_content_length_(0)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"request_handler&nbsp;constructor!"&nbsp;&lt;&lt;&nbsp;std::endl;<br />}<br /><br />request_handler::~request_handler()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"request_handler&nbsp;destructor!"&nbsp;&lt;&lt;&nbsp;std::endl;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;request_handler::start(<span style="color: #0000FF; ">const</span>&nbsp;server::request&nbsp;&amp;request,&nbsp;server::connection_ptr&nbsp;connection)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(request.method&nbsp;==&nbsp;"POST")&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server::request::headers_container_type::iterator&nbsp;found&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::find_if(request.headers,&nbsp;is_content_length());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(found&nbsp;==&nbsp;request.headers.end())&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_status(server::connection::bad_request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_headers(boost::make_iterator_range(common_headers,&nbsp;common_headers+3));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;write(bad_request,&nbsp;boost::bind(&amp;request_handler::write_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uri_&nbsp;=&nbsp;http::destination(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content_length_&nbsp;=&nbsp;boost::lexical_cast&lt;std::size_t&gt;(found-&gt;value);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;read(boost::bind(&amp;request_handler::read_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1,&nbsp;_2,&nbsp;_3,&nbsp;_4));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_status(server::connection::bad_request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_headers(boost::make_iterator_range(common_headers,&nbsp;common_headers+3));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;write(bad_request,&nbsp;boost::bind(&amp;request_handler::write_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;request_handler::read_callback(server::connection::input_range&nbsp;input,&nbsp;boost::system::error_code&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;&nbsp;ec,&nbsp;std::size_t&nbsp;bytes_transferred,&nbsp;server::connection_ptr&nbsp;connection)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ec)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;"Error:&nbsp;"&nbsp;&lt;&lt;&nbsp;ec&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;todo&nbsp;others.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;read_content_length_&nbsp;+=&nbsp;bytes_transferred;<br />&nbsp;&nbsp;&nbsp;&nbsp;content_&nbsp;+=&nbsp;std::<span style="color: #0000FF; ">string</span>(input.begin(),&nbsp;input.end());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(read_content_length_&nbsp;&lt;&nbsp;content_length_)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;read(boost::bind(&amp;request_handler::read_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1,&nbsp;_2,&nbsp;_3,&nbsp;_4));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;("/videoProcessing/start"&nbsp;==&nbsp;uri_)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;todo:&nbsp;decode&nbsp;the&nbsp;body(content)&nbsp;by&nbsp;creating&nbsp;a&nbsp;message&nbsp;of&nbsp;application&nbsp;logic&nbsp;layer</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;response_body&nbsp;=&nbsp;"&lt;Message&nbsp;Code=\"0000\"&nbsp;Descript=\"OK.\"&gt;&lt;/Message&gt;";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;server::response_header&gt;&nbsp;headers(common_headers,&nbsp;common_headers+3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers[2].value&nbsp;=&nbsp;boost::lexical_cast&lt;std::<span style="color: #0000FF; ">string</span>&gt;(response_body.size());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_status(server::connection::ok);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_headers(boost::make_iterator_range(headers.begin(),&nbsp;headers.end()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;write(response_body,&nbsp;boost::bind(&amp;request_handler::write_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_status(server::connection::bad_request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;set_headers(boost::make_iterator_range(common_headers,&nbsp;common_headers+3));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-&gt;write(bad_request,&nbsp;boost::bind(&amp;request_handler::write_callback,&nbsp;<span style="color: #0000FF; ">this</span>,&nbsp;_1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;request_handler::write_callback(boost::system::error_code&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;&nbsp;ec)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;request_handler_factory::get_mutable_instance().destroy(<span style="color: #0000FF; ">this</span>);<br />}<br /><br /><br />server::response_header&nbsp;request_handler::common_headers[3]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;{"Connection","close"}<br />&nbsp;&nbsp;&nbsp;&nbsp;,{"Content-Type",&nbsp;"text/plain"}<br />&nbsp;&nbsp;&nbsp;&nbsp;,{"Content-Length",&nbsp;"0"}<br />};<br /><br />std::<span style="color: #0000FF; ">string</span>&nbsp;request_handler::bad_request("Bad&nbsp;Request.");</div><br /><br /><div>RequestHandlerFactory.h</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 />-->#ifndef&nbsp;_REQUEST_HANDLER_FACTORY_H_<br /><span style="color: #0000FF; ">#define</span>&nbsp;_REQUEST_HANDLER_FACTORY_H_<br /><br />#include&nbsp;"RequestHandler.h"<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;request_handler_factory&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;boost::serialization::singleton&lt;request_handler_factory&gt;<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;request_handler_ptr&nbsp;create();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;destroy(request_handler*&nbsp;handler);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;~request_handler_factory();<br /><br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;std::list&lt;request_handler_ptr&gt;&nbsp;request_handler_lst;<br />};<br /><br /><br /><span style="color: #0000FF; ">#endif</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;_REQUEST_HANDLER_FACTORY_H_</span></div><br /><div>RequestHandlerFactory.cpp</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 />-->#include&nbsp;"CommonPrecomp.h"<br />#include&nbsp;"RequestHandlerFactory.h"<br />#include&nbsp;"RequestHandler.h"<br /><br />request_handler_factory::~request_handler_factory()<br />{<br />}<br /><br />request_handler_ptr&nbsp;request_handler_factory::create()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;request_handler_ptr&nbsp;request_handler_(<span style="color: #0000FF; ">new</span>&nbsp;request_handler());<br />&nbsp;&nbsp;&nbsp;&nbsp;request_handler_lst.push_back(request_handler_);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;request_handler_;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;request_handler_factory::destroy(request_handler*&nbsp;handler)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(std::list&lt;request_handler_ptr&gt;::iterator&nbsp;iter&nbsp;=&nbsp;request_handler_lst.begin();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;!=&nbsp;request_handler_lst.end();&nbsp;iter++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(iter-&gt;<span style="color: #0000FF; ">get</span>()&nbsp;==&nbsp;handler)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request_handler_lst.erase(iter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />图1：cppnetlib-asio-async_server.jpg<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cppnetlib-asio-async_server.jpg" width="1282" height="1940" alt="" /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/toMyself/aggbug/201819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-07-15 16:29 <a href="http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cpp-netlib之network解析</title><link>http://www.cppblog.com/toMyself/archive/2013/07/04/201518.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Thu, 04 Jul 2013 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/07/04/201518.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201518.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/07/04/201518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201518.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201518.html</trackback:ping><description><![CDATA[cpp-netlib:<br />参考：<br />1.&nbsp;<a href="http://cpp-netlib.org/" style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">http://cpp-netlib.org/<br /></a><br />解析版本： cpp-netlib-0.9.4<br />注：使用的boost版本为boost_1_53_0。 若使用boost_1_46_1在Windows上编译会出现错误。<br /><br /><div><span style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">cpp-netlib-0.9.4版本编译后：</span><ol style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"><li>Linux：<br /> libcppnetlib-client-connections.a<br /> libcppnetlib-server-parsers.a<br /> libcppnetlib-uri.a<br /></li><li>Windows：H:\work\boost\cpp-netlib-0.9.4\libs\network\src\Release<br /> cppnetlib-client-connections.lib<br /> cppnetlib-server-parsers.lib<br /> cppnetlib-uri.lib</li><li>Windows工程配置： <ol><li>include: &nbsp;H:/work/boost/<span style="text-align: -webkit-auto;">boost_1_53_0</span><span style="text-align: -webkit-auto;">;H:/work/boost/cpp-netlib-0.9.4;</span></li><li>preprocessor:&nbsp;_SCL_SECURE_NO_WARNINGS;&nbsp;_WIN32_WINNT=0x0501;</li></ol></li></ol></div><br />测试代码testServer.cpp：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;boost/network/protocol/http/server.hpp&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;http&nbsp;=&nbsp;boost::network::http;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;hello_world;<br />typedef&nbsp;http::server&lt;hello_world&gt;&nbsp;server;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;hello_world&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(server::request&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;request,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server::response&nbsp;&amp;response)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;ip&nbsp;=&nbsp;source(request);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;server::response::stock_reply(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server::response::ok,&nbsp;std::<span style="color: #0000FF; ">string</span>("Hello,&nbsp;")&nbsp;+&nbsp;ip&nbsp;+&nbsp;"!");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;log(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;msg)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;msg&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">int</span><br />main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*&nbsp;argv[])&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;!=&nbsp;3)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;"Usage:&nbsp;"&nbsp;&lt;&lt;&nbsp;argv[0]&nbsp;&lt;&lt;&nbsp;"&nbsp;address&nbsp;port"&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hello_world&nbsp;handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;server_(argv[1],&nbsp;argv[2],&nbsp;handler);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_.run();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(std::exception&nbsp;&amp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cerr&nbsp;&lt;&lt;&nbsp;e.what()&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br />图1：cppnetlib-listening<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cppnetlib-listening.jpg" width="1012" height="695" alt="" /><br /><br /><br />图2：cppnetlib-handleAccept<br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cppnetlib-handleAccept.jpg" width="928" height="1019" alt="" /><br /><br /><br />图3：cppnetlib-class<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/tomyself/cppnetlib-class.jpg" width="829" height="1132" alt="" /><br />说明：<br />1. http::server与http::async_server的区别：<br />&nbsp; &nbsp;（1）http::async_server使用了多线程来处理每个连接上的请求，详细分析查看《cpp-netlib之async_server解析》：<a href="http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html">http://www.cppblog.com/toMyself/archive/2013/07/15/201819.html</a>。&nbsp;<br /><div>thread_pool().post(boost::bind(&amp;Handler::operator(), &amp;handler, cref(request_), async_connection&lt;Tag,Handler&gt;::shared_from_this()))。</div><br /><br /><br /><img src ="http://www.cppblog.com/toMyself/aggbug/201518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-07-04 17:28 <a href="http://www.cppblog.com/toMyself/archive/2013/07/04/201518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost Parameter库学习笔记</title><link>http://www.cppblog.com/toMyself/archive/2013/07/03/201493.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 03 Jul 2013 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/07/03/201493.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201493.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/07/03/201493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201493.html</trackback:ping><description><![CDATA[<div>The Boost Parameter Library<br />参考：<br />1. 英文文档：&nbsp;<a href="http://www.boost.org/doc/libs/1_54_0/libs/parameter/doc/html/index.html">http://www.boost.org/doc/libs/1_54_0/libs/parameter/doc/html/index.html</a><br />2. 中文文档：<a href="http://stlchina.huhoo.net/boost/libs/parameter/doc/html/index.html">http://stlchina.huhoo.net/boost/libs/parameter/doc/html/index.html</a><br />3. 中文文档下载svn： <a href="http://boost-doc-zh.googlecode.com/svn/trunk">http://boost-doc-zh.googlecode.com/svn/trunk<br /></a><br />测试代码：<br /><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 />-->#include&nbsp;&lt;boost/parameter.hpp&gt;<br />#include&nbsp;&lt;boost/type_traits.hpp&gt;<br />#include&nbsp;&lt;boost/mpl/is_sequence.hpp&gt;<br />#include&nbsp;&lt;boost/mpl/<span style="color: #0000FF; ">void</span>.hpp&gt;<br />#include&nbsp;&lt;boost/preprocessor/repetition.hpp&gt;<br />#include&nbsp;&lt;boost/noncopyable.hpp&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;memory&gt;<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;libnofx<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(host)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(port)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(handler)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(io_service)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_FUNCTION(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">bool</span>),&nbsp;server_init,&nbsp;tag,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(required&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(host,&nbsp;(std::<span style="color: #0000FF; ">string</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(port,&nbsp;(std::<span style="color: #0000FF; ">string</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;&amp;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(handler,&nbsp;*))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(optional<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(io_service,&nbsp;*,&nbsp;0))<br />&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host_type&nbsp;str;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"host="&nbsp;&lt;&lt;&nbsp;host&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"port="&nbsp;&lt;&lt;&nbsp;port&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"handler="&nbsp;&lt;&lt;&nbsp;handler&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"io_service="&nbsp;&lt;&lt;&nbsp;io_service&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;libnofx<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(arg1)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(arg2)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;callable2<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_CONST_MEMBER_FUNCTION(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>),&nbsp;print<span style="color: #008000; ">/*</span><span style="color: #008000; ">operator()</span><span style="color: #008000; ">*/</span>,&nbsp;tag,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(required&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(arg1,&nbsp;(<span style="color: #0000FF; ">int</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(arg2,&nbsp;(<span style="color: #0000FF; ">int</span>)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;arg1&nbsp;&lt;&lt;&nbsp;",&nbsp;"&nbsp;&lt;&lt;&nbsp;arg2&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br /><br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;libnofx<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_NAME(index)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;myclass_impl<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;ArgumentPack&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myclass_impl(ArgumentPack&nbsp;<span style="color: #0000FF; ">const</span>&amp;&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"name&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;args[_name]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;";&nbsp;index&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;args[_index&nbsp;|&nbsp;42]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;myclass&nbsp;:&nbsp;myclass_impl<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_CONSTRUCTOR(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myclass,&nbsp;(myclass_impl),&nbsp;tag<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;(required&nbsp;(name,*))&nbsp;(optional&nbsp;(index,*)))&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;no&nbsp;semicolon</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br /><br /><br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;libnofx<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_TEMPLATE_KEYWORD(class_type)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_TEMPLATE_KEYWORD(base_list)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_TEMPLATE_KEYWORD(held_type)<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_PARAMETER_TEMPLATE_KEYWORD(copyable)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;boost;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;boost::mpl::_;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;define&nbsp;BOOST_PYTHON_MAX_BASES&nbsp;10<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;detail&nbsp;{&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;bases_base&nbsp;{};&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;A&nbsp;type&nbsp;list&nbsp;for&nbsp;specifying&nbsp;bases<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">template&nbsp;&lt;&nbsp;BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PYTHON_MAX_BASES,&nbsp;typename&nbsp;Base,&nbsp;mpl::void_)&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">struct&nbsp;bases&nbsp;:&nbsp;detail::bases_base<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">};</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;A0&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A1&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A2&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A3&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A4&nbsp;=&nbsp;<span style="color: #0000FF; ">void</span>&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;bases&nbsp;:&nbsp;detail::bases_base<br />&nbsp;&nbsp;&nbsp;&nbsp;{};<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;parameter::parameters&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter::required&lt;tag::class_type,&nbsp;is_class&lt;_&gt;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;parameter::optional&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter::deduced&lt;tag::base_list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;is_base_and_derived&lt;detail::bases_base,&nbsp;_&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;parameter::optional&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter::deduced&lt;tag::held_type&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;mpl::not_&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mpl::or_&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_base_and_derived&lt;detail::bases_base,&nbsp;_&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;is_same&lt;boost::noncopyable,&nbsp;_&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;parameter::optional&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameter::deduced&lt;tag::copyable&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;is_same&lt;boost::noncopyable,&nbsp;_&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&gt;&nbsp;class_signature;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A1&nbsp;=&nbsp;parameter::void_<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A2&nbsp;=&nbsp;parameter::void_<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;A3&nbsp;=&nbsp;parameter::void_<br />&nbsp;&nbsp;&nbsp;&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;class_<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;ArgumentPack</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_signature::bind&lt;A0,A1,A2,A3&gt;::type&nbsp;args;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Extract&nbsp;first&nbsp;logical&nbsp;parameter.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;parameter::binding&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args,&nbsp;tag::class_type&gt;::type&nbsp;class_type;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;parameter::binding&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args,&nbsp;tag::base_list,&nbsp;bases&lt;&gt;&nbsp;&gt;::type&nbsp;base_list;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;parameter::binding&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args,&nbsp;tag::held_type,&nbsp;class_type&gt;::type&nbsp;held_type;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;parameter::binding&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args,&nbsp;tag::copyable,&nbsp;<span style="color: #0000FF; ">void</span>&gt;::type&nbsp;copyable;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;B&nbsp;{&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~B();&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;D&nbsp;:&nbsp;B&nbsp;{&nbsp;~D();&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">typedef&nbsp;class_&lt;class_type&lt;B&gt;,&nbsp;copyable&lt;boost::noncopyable&gt;&nbsp;&gt;&nbsp;c1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">typedef&nbsp;class_&lt;D,&nbsp;held_type&lt;std::auto_ptr&lt;D&gt;&nbsp;&gt;,&nbsp;base_list&lt;bases&lt;B&gt;&nbsp;&gt;&nbsp;&gt;&nbsp;c2;</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;class_&lt;B,&nbsp;boost::noncopyable&gt;&nbsp;c1;<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;class_&lt;D,&nbsp;std::auto_ptr&lt;D&gt;,&nbsp;bases&lt;B&gt;&nbsp;&gt;&nbsp;c2;<br />}<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;libnofx;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;2.1&nbsp;Parameter-Enabled&nbsp;Functions<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;success&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;success&nbsp;=&nbsp;server_init("0.0.0.0",&nbsp;"4112",&nbsp;"0x12345678",&nbsp;12345678);<br />&nbsp;&nbsp;&nbsp;&nbsp;success&nbsp;=&nbsp;server_init(_port="4113",&nbsp;_host="127.0.0.1",&nbsp;_handler="0x87654321");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;2.2&nbsp;Parameter-Enabled&nbsp;Member<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;arg1&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;arg2&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;callable2&nbsp;ca2;<br />&nbsp;&nbsp;&nbsp;&nbsp;ca2.print(arg1,&nbsp;arg2);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;2.3&nbsp;Parameter-Enabled&nbsp;Constructors<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;myclass&nbsp;x("bob",&nbsp;3);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;positional</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;myclass&nbsp;y(_index&nbsp;=&nbsp;12,&nbsp;_name&nbsp;=&nbsp;"sally");&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;named</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;myclass&nbsp;z("june");&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;positional/defaulted</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;2.4&nbsp;Parameter-Enabled&nbsp;Class&nbsp;Templates<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c1::class_type,&nbsp;B&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c1::base_list,&nbsp;bases&lt;&gt;&nbsp;&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c1::held_type,&nbsp;B&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c1::copyable,&nbsp;boost::noncopyable&gt;));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c2::class_type,&nbsp;D&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c2::base_list,&nbsp;bases&lt;B&gt;&nbsp;&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c2::held_type,&nbsp;std::auto_ptr&lt;D&gt;&nbsp;&gt;));<br />&nbsp;&nbsp;&nbsp;&nbsp;BOOST_MPL_ASSERT((boost::is_same&lt;c2::copyable,&nbsp;<span style="color: #0000FF; ">void</span>&gt;));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br /><br />keyword tag type 和 Parameter-Enabled Constructors 预编译后的代码样例：<br /><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; ">namespace</span>&nbsp;libnofx<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;tag&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;name&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;<span style="color: #0000FF; ">const</span>*&nbsp;keyword_name()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"name";&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost::parameter::value_type&lt;&nbsp;boost::mpl::_2,&nbsp;name,&nbsp;boost::parameter::void_&nbsp;&gt;&nbsp;_;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost::parameter::value_type&lt;&nbsp;boost::mpl::_2,&nbsp;name,&nbsp;boost::parameter::void_&nbsp;&gt;&nbsp;_1;&nbsp;};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::boost::parameter::keyword&lt;tag::name&gt;&nbsp;<span style="color: #0000FF; ">const</span>&amp;&nbsp;_name&nbsp;=&nbsp;::boost::parameter::keyword&lt;tag::name&gt;::instance;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;tag&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;index&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;<span style="color: #0000FF; ">const</span>*&nbsp;keyword_name()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"index";&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost::parameter::value_type&lt;&nbsp;boost::mpl::_2,&nbsp;index,&nbsp;boost::parameter::void_&nbsp;&gt;&nbsp;_;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost::parameter::value_type&lt;&nbsp;boost::mpl::_2,&nbsp;index,&nbsp;boost::parameter::void_&nbsp;&gt;&nbsp;_1;&nbsp;};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::boost::parameter::keyword&lt;tag::index&gt;&nbsp;<span style="color: #0000FF; ">const</span>&amp;&nbsp;_index&nbsp;=&nbsp;::boost::parameter::keyword&lt;tag::index&gt;::instance;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;myclass_impl<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;ArgumentPack&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myclass_impl(ArgumentPack&nbsp;<span style="color: #0000FF; ">const</span>&amp;&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"name&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;args[_name]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;";&nbsp;index&nbsp;=&nbsp;"&nbsp;&lt;&lt;&nbsp;args[_index&nbsp;|&nbsp;42]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;myclass&nbsp;:&nbsp;myclass_impl<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;BoostParameterDummy&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;boost_param_params_79ctor&nbsp;&nbsp;:&nbsp;boost::parameter::parameters&lt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::parameter::required&lt;tag::name&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;typename&nbsp;boost::parameter::aux::unwrap_predicate&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;&gt;::type&nbsp;&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;boost::parameter::optional&lt;tag::index&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;typename&nbsp;boost::parameter::aux::unwrap_predicate&lt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*&nbsp;&gt;::type&nbsp;&gt;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost_param_params_79ctor&nbsp;&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;constructor_parameters79;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ParameterArgumentType0&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">explicit</span>&nbsp;myclass(&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ParameterArgumentType0&nbsp;&amp;&nbsp;a0&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;typename&nbsp;boost::parameter::aux::match&lt;&nbsp;constructor_parameters79<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;&nbsp;ParameterArgumentType0&nbsp;&gt;::type&nbsp;=&nbsp;constructor_parameters79()&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;boost::parameter::aux::unaryfunptr_arg_type&lt;&nbsp;<span style="color: #0000FF; ">void</span>(*)(myclass_impl)&nbsp;&gt;::type&nbsp;(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor_parameters79()(&nbsp;&nbsp;a0&nbsp;)&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ParameterArgumentType0&nbsp;,&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ParameterArgumentType1&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myclass(&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ParameterArgumentType0&nbsp;&amp;&nbsp;a0&nbsp;,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;ParameterArgumentType1&nbsp;&amp;&nbsp;a1&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;typename&nbsp;boost::parameter::aux::match&lt;&nbsp;constructor_parameters79,&nbsp;&nbsp;ParameterArgumentType0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;ParameterArgumentType1&nbsp;&gt;::type&nbsp;=&nbsp;constructor_parameters79()&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;boost::parameter::aux::unaryfunptr_arg_type&lt;&nbsp;<span style="color: #0000FF; ">void</span>(*)(myclass_impl)&nbsp;&gt;::type&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;constructor_parameters79()(&nbsp;&nbsp;a0&nbsp;,&nbsp;a1&nbsp;)&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />}</div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/toMyself/aggbug/201493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-07-03 16:41 <a href="http://www.cppblog.com/toMyself/archive/2013/07/03/201493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POCO之Net解析</title><link>http://www.cppblog.com/toMyself/archive/2013/06/24/201274.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 24 Jun 2013 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2013/06/24/201274.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/201274.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2013/06/24/201274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/201274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/201274.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: POCO：参考：1. http://pocoproject.org/2. https://github.com/pocoproject解析版本：poco-1.4.6p1测试代码--TestServer.cpp：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.co...&nbsp;&nbsp;<a href='http://www.cppblog.com/toMyself/archive/2013/06/24/201274.html'>阅读全文</a><img src ="http://www.cppblog.com/toMyself/aggbug/201274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2013-06-24 17:40 <a href="http://www.cppblog.com/toMyself/archive/2013/06/24/201274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost多线程编程</title><link>http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Wed, 22 Sep 2010 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Boost多线程编程背景&#8226;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率；为了达到最大的吞吐量，事务服务器在单独的线程上运行服务程序；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GUI应用程序将那些费...&nbsp;&nbsp;<a href='http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html'>阅读全文</a><img src ="http://www.cppblog.com/toMyself/aggbug/127347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-09-22 17:15 <a href="http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zlib</title><link>http://www.cppblog.com/toMyself/archive/2010/08/02/121981.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 02 Aug 2010 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/08/02/121981.html</guid><description><![CDATA[一个压缩库，配合boost使用<br>zlib 1.2.3 -&gt; <a href="http://www.zlib.net/">www.zlib.net</a> 
<img src ="http://www.cppblog.com/toMyself/aggbug/121981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-08-02 17:03 <a href="http://www.cppblog.com/toMyself/archive/2010/08/02/121981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost的编译</title><link>http://www.cppblog.com/toMyself/archive/2010/08/02/121979.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Mon, 02 Aug 2010 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2010/08/02/121979.html</guid><description><![CDATA[<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 12pt; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">bjam&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">toolset</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">msvc</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">9.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">build</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">complete<br>bjam&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">build</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">complete</span></div>
<p><br>首先运行boost根目录下的bootstrap.bat，然后会生成一个bjam的文件，运行这个文件，大部分的文件就都生成出来了。不过有两个文件是我们需要的(libboost_bzip2-vc90-mt.lib libboost_zlib-vc90-mt.lib)，而在windows下编译，boost默认是不编译的，因为boost用了zlib和bzip两个三方库来进行编译的。所以我们要手动把这两个文件生成出来，从上述地址把软件下来，然后解压到某地。运行下述命令：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; bjam -sZLIB_SOURCE=ZLIB_PATH -sBZIP2_SOURCE=BZIP_PATH --toolset=msvc address-model=32 --with-iostreams stage</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里面我们要为boost制定zlib和bzip的位置，然后我们会看到生成了如下输出</p>
<p>libboost_iostreams-vc80-mt-s-1_38.lib和libboost_zlib-vc80-mt-s-1_38.lib<br>（iostreams和zlib）<br>bjam --toolset=msvc --with-iostreams -sZLIB_SOURCE=d:\zlib stage runtime-link=static threading=multi release</p>
<p><br>boost&nbsp;&nbsp; <a href="http://sourceforge.net/projects/boost/files/boost/1.43.0/">http://sourceforge.net/projects/boost/files/boost/1.43.0/</a> <br>bzip2&nbsp;&nbsp; <a href="http://www.bzip.org/downloads.html">http://www.bzip.org/downloads.html</a>&nbsp;<br>zlib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.zlib.net/">http://www.zlib.net/</a> </p>
<br>
<img src ="http://www.cppblog.com/toMyself/aggbug/121979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2010-08-02 17:01 <a href="http://www.cppblog.com/toMyself/archive/2010/08/02/121979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asio</title><link>http://www.cppblog.com/toMyself/archive/2009/03/05/75627.html</link><dc:creator>kongkongzi</dc:creator><author>kongkongzi</author><pubDate>Thu, 05 Mar 2009 07:17:00 GMT</pubDate><guid>http://www.cppblog.com/toMyself/archive/2009/03/05/75627.html</guid><wfw:comment>http://www.cppblog.com/toMyself/comments/75627.html</wfw:comment><comments>http://www.cppblog.com/toMyself/archive/2009/03/05/75627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/toMyself/comments/commentRss/75627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/toMyself/services/trackbacks/75627.html</trackback:ping><description><![CDATA[<font size=-1 face="Courier New, Courier, mono">
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">boost::asio<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">boost::asio::io_service&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;This&nbsp;class&nbsp;provides&nbsp;access&nbsp;to&nbsp;I/O&nbsp;functionality.</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">boost::asio::io_service::run();&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Run&nbsp;the&nbsp;io_service's&nbsp;event&nbsp;processing&nbsp;loop.&nbsp;<br></span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="COLOR: #008000">&nbsp;在run之前已经注册了(将)要处理的Event</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">boost::asio::io_service::post(CompletionHandler&nbsp;handler);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Request&nbsp;the&nbsp;io_service&nbsp;to&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// invoke&nbsp;the&nbsp;given&nbsp;handler&nbsp;and&nbsp;return&nbsp;immediately.&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">boost::asio::ip::tcp::acceptor<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">boost::asio::strand&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;guarantees&nbsp;that,&nbsp;for&nbsp;those&nbsp;handlers&nbsp;that&nbsp;are&nbsp;dispatched&nbsp;through&nbsp;it,<br>&nbsp;&nbsp;&nbsp;//&nbsp;an&nbsp;executing&nbsp;handler&nbsp;will&nbsp;be&nbsp;allowed&nbsp;to&nbsp;complete&nbsp;before&nbsp;the&nbsp;next&nbsp;one&nbsp;is&nbsp;started.</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">boost::bind&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;bind&nbsp;any&nbsp;argument&nbsp;to&nbsp;a&nbsp;specific&nbsp;value&nbsp;or&nbsp;route&nbsp;input&nbsp;arguments&nbsp;into&nbsp;arbitrary&nbsp;positions</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #000000">&nbsp;strand_.wrap(boost::bind(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tcp_client_jade::handle_read_type,&nbsp;shared_from_this(),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::asio::placeholders::error));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strand_.wrap(boost::bind(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tcp_client_jade::handle_read_type,&nbsp;shared_from_this(),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::asio::placeholders::error));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strand_.wrap(boost::bind(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">session::handle_write,&nbsp;shared_from_this(),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::asio::placeholders::error));</span></div>
<p></font><br><br><br>使用io_service作为处理工作的work pool，可以看到，就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行，有可能你会发现，io_services.dispatch的接口也和io_service.post一样，但不同的是它是直接调用而不是经过push到队列然后在io_services.run中执行，而在这个示例当中，显然我们需要把工作交到另一个线程去完成，这样才不会影响网络接收线程池的工作以达到高效率的接收数据，这种设计与前面的netsever其实相同，这就是典型的Half Sync/Half Async。二者的区别就是netsever自己实现了工作队列，而不是直接使用io_service，这种设计实际上在win下是使用了iocp作为工作队列。<br>&nbsp;不过我更倾向于前一种设计，因为那样做，代码一切都在自己的掌握中，而io_service则是经过许多封装代码，并且本身设计只是用于处理网络完成事件的。<br>无论如何使用，都能感觉到使用boost.asio实现服务器，不尽是一件非常轻松的事，而且代码很漂亮，逻辑也相当清晰，这点上很不同于ACE。</p>
<p>我觉IO_SERVICE是一个基本性的接口，基本上通常用到的类实例都需要通过它来构造功能我们可以看似socket</p>
<p><br>学习boost的使用：<br>1、查看源代码。boost在源码了添加了大量的注释，对于理解某个函数的功能、使用方法等都有大量的说明。<br>2、查看doc文档。boost在doc里提供了比较多的应用实例，可以参考。</p>
<p><br>&nbsp; /// The type of the service that will be used to provide I/O operations.<br>&nbsp; typedef IoObjectService service_type;</p>
<p>&nbsp; /// The underlying implementation type of I/O object.<br>&nbsp; typedef typename service_type::implementation_type implementation_type;</p>
<p>&nbsp; // The backend service implementation.<br>&nbsp; service_type&amp; service;</p>
<p>&nbsp; // The underlying native implementation.<br>&nbsp; implementation_type implementation;<br>&nbsp; <br>数据与操作的分离？<br>io_service associated with the object.</p>
<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">boost::asio::detail::task_io_service</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">boost::asio::detail::epoll_reactor</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::do_one<br>boost</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">asio</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">detail</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">task_io_service.hpp:</span><span style="COLOR: #000000">222</span><span style="COLOR: #000000"><br><br></span></div>
<br><br>
<img src ="http://www.cppblog.com/toMyself/aggbug/75627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/toMyself/" target="_blank">kongkongzi</a> 2009-03-05 15:17 <a href="http://www.cppblog.com/toMyself/archive/2009/03/05/75627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>