<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>狼穴</title>
  <link>http://wolfkiller.blogbus.com</link>
  <description><![CDATA[不入狼穴，焉得狼崽。。。]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Thu, 01 Jan 1970 07:00:00 +0700</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/5/1/5/1101515/avatar_1101515_96.jpg</url>
									<title>狼穴</title>
									<link>http://wolfkiller.blogbus.com</link>
								</image>  <item>
   <title>ACE_FIFO的进程间通信机制</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了三种实现进程间通信的</span><span lang="EN-US"><font face="Times New Roman">IPC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">机制，</span><span lang="EN-US"><font face="Times New Roman">ACE_FIFO_Recv/Send</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系列的设施可以在没有定义</span><span lang="EN-US"><font face="Times New Roman">ACE_HAS_STREAM_PIPES</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的环境下使用。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE_FIFO_Recv</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于从管道文件中读取数据。如果该管道文件不存在，则它会创建一个，这在该类实例的初始化时进行。与之相反，</span><span lang="EN-US"><font face="Times New Roman">ACE_FIFO_Send</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在指定的管道文件中写数据，如果该管道文件不存在，则会出错。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般情况下，我们会按照如下的例程来开始从一个指定的管道文件中读入数据：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">       </span>char pipename[]=”/thispipe”;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 41.25pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE_FIFO_Recv reader(pipename);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>char buf[1024]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＝｛</span><span lang="EN-US"><font face="Times New Roman">0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">｝</span><span lang="EN-US"><font face="Times New Roman">;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>int len</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＝</span><span lang="EN-US"><font face="Times New Roman">0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">       </span>if( (len=reader.recv(buf,1024))&gt;0 )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 3"><font face="Times New Roman">                     </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">……</span><span lang="EN-US"><font face="Times New Roman">//error handle</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管道的标识</span><span lang="EN-US"><font face="Times New Roman">pipename</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将被用于生成管道文件，所以对它的命名应该遵循文件的命名方式，上例中即表示在根目录下使用名为</span><span lang="EN-US"><font face="Times New Roman">thispipe</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的管道文件。</span><span lang="EN-US"><font face="Times New Roman">recv()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法会阻塞到管道中有数据可读。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面则是典型的写入端方法：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">               </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">               </span>ACE_FIFO_Send writer(pipename);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">               </span>if( (len=writer.send(buf,len+6))&lt;0 )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 5"><font face="Times New Roman">                                   </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">……</span><span lang="EN-US"><font face="Times New Roman">//error handle</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要注意的是，如果</span><span lang="EN-US"><font face="Times New Roman">writer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被初始化的时候该管道文件不存在，则</span><span lang="EN-US"><font face="Times New Roman">writer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的初始化会出错。随后的</span><span lang="EN-US"><font face="Times New Roman">send()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法也会出错。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果要利用这一设施进行双向通信，有两种方案可以采用：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一：使用一个管道文件：接收方开启管道等待接收数据，发送方利用同一管道标识写入。接收方在接收数据以后，用同样的标识实例化一个</span><span lang="EN-US"><font face="Times New Roman">ACE_FIFO_Send</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，以写入数据，而同时在原发送方建立一个同样的接收过程，等待接收这个反馈数据。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是，这种方法存在冲突，需要小心避免：如果接收方是以循环接收的方式等待读取数据的，那么它写回的反馈数据可能被它自己的下一个循环接收，陷入自己跟自己通信的混乱状态。这种可能性在实践中接近百分之百，理论上则是出于操作系统的时间片轮换的调度策略。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二：使用两个管道文件：接收方开启监听管道等待数据，发送方用该管道标识写入数据，然后，发送方“马上“建立另一个管道，以等待接收方的反馈数据。同时，接收方在接收到数据处理后，执行对另一管道的写入操作。为了实现同步，可以采用在接收方的接收数据和发送数据之间插入一个睡眠动作以保障同步。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面附一个可运行的示例：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">notify</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序用于向指定进程发送某些字符串的消息，</span><span lang="EN-US"><font face="Times New Roman">p1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序则接收该消息，并且进行处理（附加一段字符串），然后返回这段经过修改的数据。略做修改，该示例可扩展成为</span><span lang="EN-US"><font face="Times New Roman">notify</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">向多个进程同时发送消息进行进程间通信。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">//notify.cpp</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/FIFO_Send.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/FIFO_Recv.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/Log_Msg.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">const char *pipename[] ={&quot;/p1&quot;,&quot;/p2&quot;,&quot;/p3&quot;};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">const char *pipename_[]={&quot;/p1_&quot;,&quot;/p2_&quot;,&quot;/p3_&quot;};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">const int num = 1;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">int ACE_TMAIN(int,ACE_TCHAR *[])</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>ACE_FIFO_Send *writer=NULL;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>ACE_FIFO_Recv *reader=NULL;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>char buf[1024]={0};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>strcpy(buf,&quot;this is a message!&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>for(int i=0;i&lt;num;i++)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>{<span style="mso-spacerun: yes">       </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>writer = new ACE_FIFO_Send(pipename[i]);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>if( 0&gt;=writer-&gt;send(buf,strlen(buf)) )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>ACE_ERROR_RETURN((LM_ERROR,&quot;send to %s error,exit!\n&quot;,pipename[i]),-1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>memset(buf,0,1024);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>reader = new ACE_FIFO_Recv(pipename_[i]);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>int n = reader-&gt;recv(buf,1024);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>if( n&gt;0 )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>ACE_DEBUG((LM_INFO,&quot;recv %d bytes message back:[%s]\n&quot;,n,buf));</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">//p1.cpp</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/FIFO_Send.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/FIFO_Recv.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;ace/Log_Msg.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">int main(int argc,char *argv[])</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>char pipename[16]={0};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>char pipename_[16]={0};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>strcpy(pipename,&quot;/p1&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>ACE_FIFO_Recv reader(pipename);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>sprintf(pipename_,&quot;%s_&quot;,pipename);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>char buf[1024];</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>int len;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="mso-spacerun: yes">      </span>while(1)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>memset(buf,0,1024);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>len = 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>if( (len=reader.recv(buf,1024))&gt;0 )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>ACE_DEBUG((LM_INFO,&quot;recv %d:\t[%s]\n&quot;,len,buf));</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>sprintf(buf+len,&quot;--back&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>ACE_OS::sleep(1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>ACE_FIFO_Send writer(pipename_);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                        </span>if( (len=writer.send(buf,len+6))&lt;0 )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">                                </span>ACE_ERROR_RETURN((LM_ERROR,&quot;send error!\n&quot;),-1);<span style="mso-spacerun: yes">                </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360074.html">ACE安装（VC/LINUX)</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360129.html&title=ACE_FIFO%E7%9A%84%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E6%9C%BA%E5%88%B6">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/sejie?utm_source=blogbus&utm_medium=rss&utm_campaign=sejie" target="_blank">色界频道——这里有顶尖的摄影大师，也有摄影爱好者，他们用相机收纳大千世界。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360129.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 22:00:51 +0800</pubDate>
  </item>
  <item>
   <title>libnet介绍与分析（下）</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源码的分析</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore">★<span style="FONT: 7pt 'Times New Roman'">     </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整体设计思想</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">       </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对每个要发送的包，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护一个</span><span lang="EN-US"><font face="Times New Roman">libnet­_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构，这个结构是理解整个</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关键，也是</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得以实现它强大功能的关键。让我们先从它入手，从整体到细节地揭开</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的面纱。下面左图是</span><span lang="EN-US"><font face="Times New Roman">libnet_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个结构的示例。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter" /><formulas><f eqn="if lineDrawn pixelLineWidth 0" /><f eqn="sum @0 1 0" /><f eqn="sum 0 0 @1" /><f eqn="prod @2 1 2" /><f eqn="prod @3 21600 pixelWidth" /><f eqn="prod @3 21600 pixelHeight" /><f eqn="sum @0 0 1" /><f eqn="prod @6 1 2" /><f eqn="prod @7 21600 pixelWidth" /><f eqn="sum @8 21600 0" /><f eqn="prod @7 21600 pixelHeight" /><f eqn="sum @10 21600 0" /></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" /><lock aspectratio="t" v:ext="edit" /></shapetype></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中的</span><span lang="EN-US"><font face="Times New Roman">fd</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是发送数据包将要用到的</span><span lang="EN-US"><font face="Times New Roman">socket</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">套接字，</span><span lang="EN-US"><font face="Times New Roman">injection_type</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将会被设置成</span><span lang="EN-US"><font face="Times New Roman">libnet_init()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的第一个参数，即你选择发送的方式，是基于</span><span lang="EN-US"><font face="Times New Roman">link_layer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的链路层数据包？还是基于</span><span lang="EN-US"><font face="Times New Roman">IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层的</span><span lang="EN-US"><font face="Times New Roman">raw</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据包？后一种情况又分为</span><span lang="EN-US"><font face="Times New Roman">IP4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">IP6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两种。</span><span lang="EN-US"><font face="Times New Roman">protocol_blocks </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">protocol_end</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是指针，指向一个</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自定义的</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构，由此管理一个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的链表。而</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则表述各个协议，维护各个协议给发送的数据包添加的数据块，它的具体选项下面再说。</span><span lang="EN-US"><font face="Times New Roman">link_type</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示链路层的类型，</span><span lang="EN-US"><font face="Times New Roman">link_offset</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则指向链路层也就是最底层协议包头的偏移地址。</span><span lang="EN-US"><font face="Times New Roman">aligner</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是为了维护最后的数据包的字对齐而设置的，字符串指针</span><span lang="EN-US"><font face="Times New Roman">device</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则指向通讯所用的设备，比如</span><span lang="EN-US"><font face="Times New Roman">eth0.state</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个结构，与</span><span lang="EN-US"><font face="Times New Roman">ptag_state</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一起，记录包在建立过程中的一些信息。</span><span lang="EN-US"><font face="Times New Roman">label</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个字符数组。每当有错误发生的时候，</span><span lang="EN-US"><font face="Times New Roman">errbuf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组就被用来记录错误信息。全部的数据包长度和保存于</span><span lang="EN-US"><font face="Times New Roman">total_size</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span><span lang="EN-US"><font face="Times New Roman">libnet_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经大概可以看出</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计思想了：程序员决定一些参数，并且通过函数调用中的参数把相关的数据交给</span><span lang="EN-US"><font face="Times New Roman">libnet.libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则在程序员每要求购建一个协议包头的时候，为其创建一个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构保存这些数据，并将该结构入链表。当所有的准备工作完成，程序员一声令下，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就将协议块链（由</span><span lang="EN-US"><font face="Times New Roman">protocol_blocks</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始，终于</span><span lang="EN-US"><font face="Times New Roman">pblock_end</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中的协议包头以及数据组合成一个合乎规格的包，通过硬件发送出去。如果任何一个步骤出了差错，程序员都可以从</span><span lang="EN-US"><font face="Times New Roman">errbuf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中获取出错信息。最后，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从程序员手中接过一个指令，进行所有的善后工作。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每种协议的包头将在前期被实现为一个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构。</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为它所支持的协议都定义了相应的数据结构，例如</span><span lang="EN-US"><font face="Times New Roman">TCP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包头的定义：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">struct libnet_tcp_hdr</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int16_t th_sport;<span style="mso-spacerun: yes">       </span>/* source port */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int16_t th_dport;<span style="mso-spacerun: yes">       </span>/* destination port */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int32_t th_seq;<span style="mso-spacerun: yes">          </span>/* sequence number */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int32_t th_ack;<span style="mso-spacerun: yes">          </span>/* acknowledgement number */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">#if (LIBNET_LIL_ENDIAN)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int8_t th_x2:4,<span style="mso-spacerun: yes">         </span>/* (unused) */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">           </span>th_off:4;<span style="mso-spacerun: yes">        </span>/* data offset */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">#endif</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">#if (LIBNET_BIG_ENDIAN)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int8_t th_off:4,<span style="mso-spacerun: yes">        </span>/* data offset */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">           </span>th_x2:4;<span style="mso-spacerun: yes">         </span>/* (unused) */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">#endif</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int8_t<span style="mso-spacerun: yes">  </span>th_flags;<span style="mso-spacerun: yes">       </span>/* control flags */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>…….</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int16_t th_win;<span style="mso-spacerun: yes">         </span>/* window */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int16_t th_sum;<span style="mso-spacerun: yes">         </span>/* checksum */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int16_t th_urp;<span style="mso-spacerun: yes">         </span>/* urgent pointer */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它的长度是：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">#define<span style="mso-tab-count: 2">           </span>LIBNET_TCP_H<span style="mso-spacerun: yes">      </span>0x14<span style="mso-spacerun: yes">    </span>/**&lt; TCP header:<span style="mso-spacerun: yes">          </span>20 bytes */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当程序员调用</span><span lang="EN-US"><font face="Times New Roman">libnet_built_tcp()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构建一个</span><span lang="EN-US"><font face="Times New Roman">TCP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包头时，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会分配一个这样的结构，并且按照程序员的意愿填充这个结构的各个字段。并且生成一个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构，使它的</span><span lang="EN-US"><font face="Times New Roman">buf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指针指向这个数据包头结构，并用</span><span lang="EN-US"><font face="Times New Roman">b_len</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存这个包头的长度（</span><span lang="EN-US"><font face="Times New Roman">20</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节）。这个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的其它相关字段将会被按规则填充。之后，这个</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会被加入到</span><span lang="EN-US"><font face="Times New Roman">libnet_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构所维护的协议块链的适当位置。所谓“适当位置”，将会在后面加以说明。下图是进程中一种可能出现的情形：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利益于这种精巧的整体架构，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的具体实现就不显得困难了，而我们对它的理解也因此受益。剩下来的只是一些细节性的东西需要去把握，这一点显然更适合亲自去阅读代码。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面是大概的处理流程。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在开始之前，需要插入一点说明：</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用条件编译的方式消除平台间的差异，由此产生了很多同名的函数（当然它们都在内部被调用），比如</span><span lang="EN-US"><font face="Times New Roman">libnet_open_link</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（）有五个。程序在运行时选择哪一个调用取决于你使用的平台或者你强加于编译器的预编译选项。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般情况下事情会从</span><span lang="EN-US"><font face="Times New Roman">libnet_init()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始。</span><span lang="EN-US"><font face="Times New Roman">libnet_init()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先开启系统的网络功能：在</span><span lang="EN-US"><font face="Times New Roman">linux</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面，它会验证是否具有超级用户权限（这也就意味着低权限的用户不能使用成功）</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而如果是在</span><span lang="EN-US"><font face="Times New Roman">windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面，则会调用大名鼎鼎的</span><span lang="EN-US"><font face="Times New Roman">WSAStartup()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数。之后分配一块内存区域建立</span><span lang="EN-US"><font face="Times New Roman">libnet_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构。在简单的初始化后，根据程序员传入的发送类型参数，进行相应的操作：如果是基于链路层的发送方式（</span><span lang="EN-US"><font face="Times New Roman">LIBNET_LINK,LIBNET_LINK_ADV</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则会向操作系统申请设备，并开启底层的</span><span lang="EN-US"><font face="Times New Roman">socket</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务。如果是基于</span><span lang="EN-US"><font face="Times New Roman">IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层的发送方式，则开启该层的</span><span lang="EN-US"><font face="Times New Roman">socket</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备工作做好之后，转入直接的建包工作</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这一工作实际表现为建一系列的协议包头。程序员需要按照自顶向下的顺序建协议包头，而要发送的正文数据往往被作为第一个协议包头的“有效荷载（</span><span lang="EN-US"><font face="Times New Roman">payload</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）”被加载。此外，某些协议可能具有可选数据项，这一部分被</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">独立出来，由一个单独的</span><span lang="EN-US"><font face="Times New Roman">libnet_pblock_t</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来负责，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同时也为此提供相应的功能函数，其名称被定为</span><span lang="EN-US"><font face="Times New Roman">libnet_build_*_options().</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会自动调整这些协议块在链表中的位置，使</span><span lang="EN-US"><font face="Times New Roman">payload</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数据块在前面，中间是</span><span lang="EN-US"><font face="Times New Roman">options</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块，其后跟随着该层协议的固定包头。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在合适的时候，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会把计算校验和这样的繁琐的工作优雅地完成，你甚至感觉不到它已经为你这样做了。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样，只要程序员的使用正确，数据以及协议包头已经在链表中按顺序排列了，这为简化后面的工作极为有益。在</span><span lang="EN-US"><font face="Times New Roman">libnet_write()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">过程中，链表中的数据被按顺序地拷贝到一个大的缓冲内。拷贝虽然是按照从高层协议到低层协议的顺序进行，但是却是从缓冲的后部向前部拷贝，从这里，我们可以看到“协议栈”的思想在闪光。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当一切工作完成之后，程序员简单地调用</span><span lang="EN-US"><font face="Times New Roman">libnet_destroy()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数，关闭使用的网络通讯设备，释放占用的内存。程序员的工作是如此地简单：他甚至仅仅需要传递一个参数给这个简短的函数。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了完成这样一些最直接的工作以外，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还提供了一组丰富实用的功能。它提供的地址解析功能能够实现</span><span lang="EN-US"><font face="Times New Roman">IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址在网络字节顺序、域名、点分形式之间的转换，它也提供了一套完整的随机数生成方案供你使用，如此等等。这一些功能使得它得以从一套单纯的库跃升为一个完整的系统。</span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360074.html">ACE安装（VC/LINUX)</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360115.html&title=libnet%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8B%EF%BC%89">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://tuijian.blogbus.com/" target="_blank">推荐：让我们寻找最优秀的Blogger！</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360115.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:58:51 +0800</pubDate>
  </item>
  <item>
   <title>libnet介绍与分析(上）</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前，基于</span><span lang="EN-US"><font face="Times New Roman">socket</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的网络编程已成为当今不可替代的编程方法，它将网络通讯当作文件描述符进行处理，把对这个“网络文件”（即</span><span lang="EN-US"><font face="Times New Roman">socket</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">套接字）的操作抽象成一种类似于文件操作的方式进行。从实现细节上，这种工作方式根据</span><span lang="EN-US"><font face="Times New Roman">TCP/IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的网络通讯模型，封装了一系列的实现，使得我们只需要使用一个指定的参数，就可以实现在基于所需协议的数据的发送和接收。</span><font face="Times New Roman">&nbsp;</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是，如果我们对那些系统自动给我们做的工作感兴趣，希望与发送的数据作“面对面”的接触，</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则会是一个不错的选择。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang="EN-US"><font face="Times New Roman">UNIX</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统同台上网络安全工具开发的重要的库，它和</span><span lang="EN-US"><font face="Times New Roman">libpcap</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US"><font face="Times New Roman">libnids</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一起，给网络安全工具的开发人员提供了一组丰富而且完全的武器，使之得以很方便地编写出结构化强、健壮性好、可移植性高等特点的程序。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供一系列的接口函数，实现和封装了数据包的构造和发送过程。利用它可以亲自构造从应用层到链路层的各层协议的数据包头，并将这些包头与有效数据有序地组合在一起发送出去。当然，它也是基于</span><span lang="EN-US"><font face="Times New Roman">tcp/ip</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">协议族模型的。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前的版本是</span><chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US"><font face="Times New Roman">1.1.2</font></span></chsdate><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，相对于</span><span lang="EN-US"><font face="Times New Roman">1.0.*</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本有比较大的变化。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全部源代码包括</span><span lang="EN-US"><font face="Times New Roman">18,000 </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行代码，</span><span lang="EN-US"><font face="Times New Roman">109</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个导出函数，其中包括</span><span lang="EN-US"><font face="Times New Roman">67</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个建包函数。这使得它支持现有的</span><span lang="EN-US"><font face="Times New Roman">TCP/IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">族的所有协议。此外，它支持多平台，</span><span lang="EN-US"><font face="Times New Roman">Windows,OS X,BSD,Linux, Solaris,HPUX</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都能使用。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下图是它支持的协议：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter" /><formulas><f eqn="if lineDrawn pixelLineWidth 0" /><f eqn="sum @0 1 0" /><f eqn="sum 0 0 @1" /><f eqn="prod @2 1 2" /><f eqn="prod @3 21600 pixelWidth" /><f eqn="prod @3 21600 pixelHeight" /><f eqn="sum @0 0 1" /><f eqn="prod @6 1 2" /><f eqn="prod @7 21600 pixelWidth" /><f eqn="sum @8 21600 0" /><f eqn="prod @7 21600 pixelHeight" /><f eqn="sum @10 21600 0" /></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" /><lock aspectratio="t" v:ext="edit" /></shapetype></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库可以被划分为</span><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个功能部分：内存管理、地址解析、包处理、以及其他一些支持函数。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">★</span><font face="Times New Roman">&nbsp;</font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内存管理函数</span><font face="Times New Roman">&nbsp;</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">单数据包内存初始化及环境建立：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 58.5pt; mso-char-indent-count: 5.57"><span lang="EN-US"><font face="Times New Roman">libnet_t *libnet_init(int injection_type, char *device, char *err_buf);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes"> </span></font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">资源释放：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>void libnet_destroy(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">★</span><font face="Times New Roman">&nbsp;</font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址解析函数</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址解析：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 53.25pt; mso-char-indent-count: 5.07"><span lang="EN-US"><font face="Times New Roman">char *libnet_addr2name4(u_int32_t in, u_int8_t use_name);<span style="mso-spacerun: yes">  </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 53.25pt; mso-char-indent-count: 5.07"><span lang="EN-US"><font face="Times New Roman">libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name);<span style="mso-spacerun: yes">  </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 231.75pt; TEXT-INDENT: -178.5pt; mso-para-margin-left: 5.07gd; mso-char-indent-count: -17.0"><span lang="EN-US"><font face="Times New Roman">struct libnet_in6_addr libnet_name2addr6(libnet_t *l, char *host_name, u_int8_t use_name);<span style="mso-spacerun: yes">  </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 231.75pt; TEXT-INDENT: -178.5pt; mso-para-margin-left: 5.07gd; mso-char-indent-count: -17.0"><span lang="EN-US"><font face="Times New Roman">void libnet_addr2name6_r(struct libnet_in6_addr addr, u_int8_t use_name,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 231.75pt; TEXT-INDENT: -21pt; mso-para-margin-left: 20.07gd; mso-char-indent-count: -2.0"><span lang="EN-US"><font face="Times New Roman">char *host_name, int host_name_len);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取接口设备</span><span lang="EN-US"><font face="Times New Roman">IP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int32_t libnet_get_ipaddr4(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>struct libnet_in6_addr libnet_get_ipaddr6(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取接口设备硬件地址：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>struct libnet_ether_addr *libnet_get_hwaddr(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">★</span><font face="Times New Roman">&nbsp;</font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据包构造函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（这一部分函数较多，都以</span><span lang="EN-US"><font face="Times New Roman">libnet_build_*()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的形式出现，在此略过）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">★</span><font face="Times New Roman">&nbsp;</font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据包发送函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_write(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">★</span><font face="Times New Roman">&nbsp;</font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相关的支持函数</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">随机数种子生成器：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_seed_prand(libnet_t *l);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取随机数：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>u_int32_t libnet_get_prand(int mod);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 32.25pt; mso-char-indent-count: 3.07"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端口列表链初始化：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_plist_chain_new(libnet_t *l, libnet_plist_t **plist, char *token_list);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取端口列表链的下一项</span><span lang="EN-US"><font face="Times New Roman">(</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端口范围</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_plist_chain_next_pair(libnet_plist_t *plist, u_int16_t *bport, </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 195pt; mso-char-indent-count: 18.57"><span lang="EN-US"><font face="Times New Roman">u_int16_t *eport); </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端口列表链输出显示：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_plist_chain_dump(libnet_plist_t *plist);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取端口列表链：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>char *libnet_plist_chain_dump_string(libnet_plist_t *plist); </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端口列表链内存释放：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>int libnet_plist_chain_free(libnet_plist_t *plist);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对它的使用也非常简单，只要你了解自己要做什么事情、应该把哪些参数放在什么位置。利用</span><span lang="EN-US"><font face="Times New Roman">libnet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数库开发应用程序的基本步骤非常简单：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、数据包内存初始化；</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、构造数据包；</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、发送数据；</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、释放资源；</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例：</span><font face="Times New Roman"> <span lang="EN-US">libnet</span></font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的发行包里提供了很多示例程序，其中</span><span lang="EN-US"><font face="Times New Roman">/libnet/sample/tcp1.c</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果省略掉一些参数的设置和错误处理，则程序简化为：</span><span lang="EN-US" style="COLOR: blue"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#if (H***E_CONFIG_H)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;../include/config.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#endif</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;libnet_test.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#ifdef __WIN32__</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &quot;../include/win32/getopt.h&quot;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#endif</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">int</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">main(int argc, char *argv[])</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span>//…….</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: black"><span style="mso-spacerun: yes"> </span></span><span style="COLOR: blue"><span style="mso-spacerun: yes"> </span>l = libnet_init(</span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: black"><span style="mso-spacerun: yes"> </span></span><span style="COLOR: blue"><span style="mso-spacerun: yes">         </span>LIBNET_LINK,</span><span style="COLOR: black"><span style="mso-spacerun: yes">   </span></span><span style="mso-spacerun: yes">                         </span>/* injection type */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: black"><span style="mso-spacerun: yes"> </span></span><span style="COLOR: blue"><span style="mso-spacerun: yes">         </span>NULL,<span style="mso-spacerun: yes">       </span></span><span style="COLOR: black"><span style="mso-spacerun: yes">   </span></span><span style="mso-spacerun: yes">                         </span>/* network interface */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: black"><span style="mso-spacerun: yes"> </span></span><span style="COLOR: blue"><span style="mso-spacerun: yes">         </span>errbuf);<span style="mso-spacerun: yes">       </span></span><span style="COLOR: black"><span style="mso-spacerun: yes">   </span></span><span style="mso-spacerun: yes">                      </span>/* error buffer */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>//……</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span><span style="COLOR: blue"><span style="mso-spacerun: yes"> </span>t = libnet_build_tcp_options(<p /></span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><span lang="EN-US" style="COLOR: blue"><font face="Times New Roman">&quot;\003\003\012\001\002\004\001\011\010\012\077\077\077\077\000\000\000\000\000\000&quot;,<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: blue"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>20,<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: blue"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>l,<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: blue"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>0);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>//……</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span><span style="COLOR: blue"><span style="mso-spacerun: yes">   </span>t = libnet_build_tcp(src_prt, dst_prt, 0x01010101, 0x02020202, TH_SYN, 32767, 0,<span style="mso-spacerun: yes">  </span>10,<span style="mso-spacerun: yes">                                </span></span><span style="mso-spacerun: yes">       </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span><span style="COLOR: blue"><span style="mso-spacerun: yes">       </span>LIBNET_TCP_H + 20 + payload_s, payload, payload_s, l, 0);<span style="mso-spacerun: yes">                                </span></span><span style="mso-spacerun: yes">       </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: blue"><span style="mso-spacerun: yes">  </span>t = libnet_build_ipv4(LIBNET_IPV4_H + LIBNET_TCP_H</span> <span style="COLOR: blue">+ 20 + payload_s,</span> <span style="COLOR: blue">0, 242, 0, 64,<span style="mso-spacerun: yes">                             </span></span><span style="mso-spacerun: yes">        </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span><span style="COLOR: blue"><span style="mso-spacerun: yes">      </span>IPPROTO_TCP, 0,<span style="mso-spacerun: yes">  </span>src_ip, dst_ip, NULL, 0, l,<span style="mso-spacerun: yes">  </span>0);<span style="mso-spacerun: yes">                    </span><span style="mso-spacerun: yes">         </span></span><span style="mso-spacerun: yes">        </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font face="Times New Roman"><span lang="EN-US" style="COLOR: blue"><span style="mso-spacerun: yes">    </span>t = libnet_build_ethernet(enet_dst, enet_src, ETHERTYPE_IP, NULL, 0, l, 0);<span style="mso-spacerun: yes">                     </span></span><span lang="EN-US"><span style="mso-spacerun: yes">            </span></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span><span style="COLOR: blue"><span style="mso-spacerun: yes">   </span>c = libnet_write(l);<p /></span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span><span style="COLOR: blue"><span style="mso-spacerun: yes"> </span>libnet_destroy(l);<p /></span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>return (EXIT_SUCCESS);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">bad:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span><span style="COLOR: blue">libnet_destroy(l);<p /></span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>return (EXIT_FAILURE);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#if defined(__WIN32__)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &lt;../include/win32/getopt.h&gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &lt;winsock2.h&gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">＃i nclude &lt;ws2tcpip.h&gt;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">#endif<span style="mso-spacerun: yes">  </span>/* __WIN32__ */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">/* EOF */</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360074.html">ACE安装（VC/LINUX)</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360106.html&title=libnet%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%88%86%E6%9E%90%28%E4%B8%8A%EF%BC%89">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://icity.cn" target="_blank">《城客》：第一本中文互动杂志！</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360106.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:56:17 +0800</pubDate>
  </item>
  <item>
   <title>ACE Service Configurator框架</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">概述</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">框架是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Component Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">模式的一种实现。使用它可以在运行时动态地配置服务和流，无论它们是动态地链接进你的程序的，还是其对象是从共享库中动态加载的。你既可以配置服务（对象），也可以配置流（基于配置文件而非在编译时装配模块）。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><h2 style="MARGIN: 13pt 0cm"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">配置静态服务</span></h2><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态服务是代码已经链接进可执行的服务。</span><span lang="EN-US"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使我们能把服务构建成静态链接的、可配置的服务：将所有代码都链接进可执行程序中，但是在框架显式地激活服务之前，服务不会实例化或者激活。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置静态服务牺牲了一定的灵活性换取更好的安全性。对于某些服务来说――它们必须只含有受信任的、静态链接的服务（代码）――这是非常有用的。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">激活静态服务可以从代码中设置激活方法，也可以在配置文件中进行配置。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务要求被设计成为一个</span><span lang="EN-US"><font face="Times New Roman">ACE_Service_Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的子类。我们将会实现一个最简单地服务：它什么都不做，除了在激活、挂起、恢复、移除时打印出一行消息。</span></p><h3 style="MARGIN: 13pt 0cm"><span lang="EN-US" style="FONT-WEIGHT: normal; mso-bidi-font-weight: bold"><font size="5"><font face="Times New Roman">class MyStaticObj : public ACE_Service_Object<span style="mso-spacerun: yes">  </span><p /></font></font></span></h3><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">public:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>MyStaticObj(ACE_Reactor *r = ACE_Reactor::instance())</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>:ACE_Service_Object(r){;}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual ~MyStaticObj(){;}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化。服务激活时调用。若返回－</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示出错，此时服务会被移除。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int init (int argc, ACE_TCHAR *argv[])</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;---MyStaticObj::init\n&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务结束。移除时</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int fini()</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;---MyStaticObj::fini\n&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int suspend(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;---MyStaticObj::suspend\n&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int resume(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;---MyStaticObj::resume\n&quot;);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_FACTORY_DEFINE (ACE_Local_Service, MyStaticObj)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_STATIC_SVC_DEFINE (<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>MyStaticObj-Discriptor,<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>ACE_TEXT (&quot;MyStaticObj&quot;),<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>ACE_SVC_OBJ_T,<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>&amp;ACE_SVC_NAME (MyStaticObj),<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>ACE_Service_Type::DELETE_THIS<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>| ACE_Service_Type::DELETE_OBJ,<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">  </span>0 // This object is not initially active.<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_STATIC_SVC_REQUIRE (MyStaticObj-Discriptor)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说明</span><span lang="EN-US"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后面三行是</span><span lang="EN-US"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计的一些宏。</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把已知的、可配置的静态服务放在一个内部仓库中。每个静态服务都必须用</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的一些宏把一些薄记信息插入这个仓库。这样框架就能实例化一个</span><span lang="EN-US"><font face="Times New Roman">MyStaticObj</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，以在服务激活时执行服务。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_FACTORY_DEFINE (CLS,SERVICE_CLASS)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它生成不依赖于编译器的工厂方法，并且一致地管理动态内存</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">CLS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是我们的程序</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库用来导入</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">导出声明的标识符，如果服务工厂不需要导出到</span><span lang="EN-US"><font face="Times New Roman">DLL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外部，可以使用特殊符号</span><span lang="EN-US"><font face="Times New Roman">ACE_Local_Service</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">SERVICE_CLASS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是从</span><span lang="EN-US"><font face="Times New Roman">ACE_Service_Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">派生的类的名称。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_STATIC_SVC_DEFINE (SERVICE_VAR,NAME,TYPE, FACTORY,FLAGS,ACTIVE)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个宏利用上一个宏展开的工厂方法创建一个类的实例，并且向</span><span lang="EN-US"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">仓库登记服务的相关消息，这样我们可以在需要的时候对服务进行管理。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">SERVICE_VAR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是将被创建的对象的名称，即实例名。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">NAME</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一个不包含空格的文本串，在服务配置文件中将用该名称来标识这个服务。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">TYPE.</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正在登记的对象类型。构建服务使用</span><span lang="EN-US"><font face="Times New Roman">ACE_SVC_OBJ_T</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">FACTORY</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一个指针，指向用于创建服务对象的工厂函数。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">FLAGS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。指定在服务关闭时，怎样处置与服务相关的对象。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">ACTIVE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果为</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则服务会在程序启动时激活，但不能传给它任何参数。如果是</span><span lang="EN-US"><font face="Times New Roman">0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，服务就会根据服务配置文件中的指令进行初始化。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><b style="mso-bidi-font-weight: normal"><span lang="EN-US"><font face="Times New Roman">ACE_STATIC_SVC_REQUIRE (SERVICE_VAR)<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">确保在程序启动时，创建服务对象的一个实例。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动程序</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们在</span><span lang="EN-US" style="FONT-SIZE: 16pt"><font face="Times New Roman">main()</font></span><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数中开始。</span><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span lang="EN-US" style="FONT-SIZE: 16pt"><font face="Times New Roman">main.cpp<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) <p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">{<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_STATIC_SVC_REGISTER (MyStaticObj-Discriptor);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_Service_Config::open<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>(argc, argv, ACE_DEFAULT_LOGGER_KEY, 0);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_Reactor::instance ()-&gt;run_reactor_event_loop ();<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>return 0;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">}<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_STATIC_SVC_REGISTER (MyStaticObj-Discriptor);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">这个宏是为了获得最好的移植性而调用的，在有的平台上不需要。但是建议使用它。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">会视情况把它处理成一些有效操作或者空操作。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">ACE_Service_Config</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">类</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">：配置服务必须调用。在默认情况下，</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">会尝试处理当前目录下的名为</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc.conf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">的文件，读取其中的指令进行操作。第四个参数</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">ignore_static_svcs</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">默认定义为</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">。如果配置了静态服务，则需要把</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">传递过去。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置文件</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><font face="Times New Roman">svc.conf<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">如果现在编译运行这个程序，由于没有配置文件，程序将不会激活我们已经定义的静态服务。要激活这个服务，需要编辑配置文件。默认的文件是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc.conf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">。编辑内容（如下）之后，再运行就可以发现服务已经激活、挂起、恢复、移除了。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">static MyStaticObj &quot;&quot;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">suspend MyStaticObj<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">resume MyStaticObj<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">remove MyStaticObj<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">可以写入以下格式的命令对程序进行控制：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">初始化静态服务：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">static svc-name [ “argc/argv options” ]</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc-name</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">为我们为静态服务配置的服务名称，后面跟随着</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">argc/argv</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">风格的参数。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">动态链接和初始化服务：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">dynamic svc-name svc-type DLL-name:factory_func() [ “argc/argv options”]<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc-name</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">为服务名称</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc-type</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">指定服务的类型，可以是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Service_Object*</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Module*</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">或者是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Stream*</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">DLL-name</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">是含有</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">factory_fun()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">符号的动态链接库的名称。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">factory_func()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">是一个创建</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc-type</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">的对象的工厂方法。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">完全移除服务：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">remove svc-name<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">挂起服务：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">suspend svc-name<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">恢复先前挂起的服务：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">resume svc-name<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">初始化一系列有序的层次相关的模块：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">stream svc-name ‘{‘module-list’};<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置动态服务</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架更强大的功能表现在配置动态服务上。如果在运行时收到指示，动态服务器可以从共享库（</span><span lang="EN-US"><font face="Times New Roman">DLL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中动态加载。这种能力允许你在运行时替换服务，从而提供极大的灵活性。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">ACE Service Configurator</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架简化了全部的冗余工作。我们只需要按照设计规格实现我们需要的服务，把它载入到一个动态链接库中，编辑配置文件即可。换句话说：我们只需要创建一个合乎规格的动态链接库，然后在上例的</span><span lang="EN-US"><font face="Times New Roman">svc.conf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面添加一两行指令，再次运行该程序即可加载此动态服务，我们甚至不需要对该程序进行重新编译。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动态链接库</span><span lang="EN-US"><font face="Times New Roman">Mydll</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">确定我们将要设计的动态链接库名字为</span><span lang="EN-US"><font face="Times New Roman">Mydll</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行</span><span lang="EN-US"><font face="Times New Roman">$ACE_ROOT/bin/generate_export_file.pl Mydll,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将输出写入</span><span lang="EN-US"><font face="Times New Roman">Mydll_Export.h</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中去。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计我们的服务的类，在类的源文件中包含该文件，并将关键字</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">＃i nclude “Mydll_Export.h”<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">class<span style="mso-spacerun: yes">  </span>Mydll_Export MyDynamicObj : public ACE_Service_Object<span style="mso-spacerun: yes">  </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">{<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">public:<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>MyDynamicObj();<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual ~MyDynamicObj();<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int init (int argc, ACE_TCHAR *argv[])<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>{<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;MyDynamicObj::init------\n&quot;);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int fini()<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>{<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>printf(&quot;MyDynamicObj::fini-----\n&quot;);<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return 0;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span><p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">};<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">ACE_FACTORY_DEFINE(Mydll,MyDynamicObj)<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">编译，并在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">svc.conf</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'">里面加入如下指令，再运行，发现动态服务已被加载、移除。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">dynamic MyDynamicObj Service_Object* Mydll:_make_MyDynamicObj() &quot;&quot;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">remove MyDynamicObj<p /></font></span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360074.html">ACE安装（VC/LINUX)</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360094.html&title=ACE+Service+Configurator%E6%A1%86%E6%9E%B6">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/sejie?utm_source=blogbus&utm_medium=rss&utm_campaign=sejie" target="_blank">色界频道——这里有顶尖的摄影大师，也有摄影爱好者，他们用相机收纳大千世界。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360094.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:55:57 +0800</pubDate>
  </item>
  <item>
   <title>ACE Streams框架介绍</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、概述</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><font face="Times New Roman"><span style="mso-tab-count: 4">                      </span><p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">ACE Streams</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架是</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的“流”概念解决方案，实现了</span><span lang="EN-US"><font face="Times New Roman">Pipes and Filters(</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管道与过滤器</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式。对于由一组有序步骤组成的过程而言，这个框架是一种极好的建模方式。过程中的每个步骤都被实现成</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的派生类。当每个步骤完成时，数据会通过</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的消息队列，交给下一个步骤继续进行处理。如果数据能进行并行处理，则各个步骤可以是多线程的，从而增加吞吐量。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">ACE Streams</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架允许你把一组模块灵活地装配进一个流中，并且可以对其进行动态配置：信息将在这个流中移动。每个模块都有机会操纵流中的数据，并可以在把数据传给下一个模块之前对其进行修改、移动或增加内容。数据在流中双向流动，，流中的每个模块都有</span><span lang="EN-US"><font face="Times New Roman">reader</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">writer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任务――每个数据方向上有一个。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">流的工作方式包括“顺流”（</span><span lang="EN-US"><font face="Times New Roman">down-stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和“溯流”</span><span lang="EN-US"><font face="Times New Roman">(up-stream)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两种。当顺流任务向下游移动时，你可以认为它们是在移出你的主应用。溯流任务则正好相反。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">ACE Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式要求将流动于流中的数据装入</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Block </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这样就能够使用</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所设计的</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Queue</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的高效设施。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 32.15pt; mso-char-indent-count: 2.0; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、工作方式</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span><span lang="EN-US"><font face="Times New Roman">ACE_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理流式事件重点使用三个类：</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的子类用于处理各个分离的业务，</span><span lang="EN-US"><font face="Times New Roman">ACE_Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将这些处理方法包装成模块，置入</span><span lang="EN-US"><font face="Times New Roman">ACE_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（或其子类）中。可以认为：</span><span lang="EN-US"><font face="Times New Roman">ACE_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代表了整个地“流”，而</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是流的各个段落，</span><span lang="EN-US"><font face="Times New Roman"> ACE_Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则用于做接合工作。因此，一个程序中会有一个</span><span lang="EN-US"><font face="Times New Roman">ACE_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、多个</span><span lang="EN-US"><font face="Times New Roman">ACE_Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及与之等量的</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（或者它们的子类），而每个</span><span lang="EN-US"><font face="Times New Roman">ACE_Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以派生多个进程来处理它任内的事务，只要它需要而且愿意这么做。一看到多线程就免不了要考虑令人头痛的并发控制，但是不用担心，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的信号机制已经完全承接了这些痛苦，我们要做的，仅仅是选择一下用哪一种方式而已。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般都使用如下的一些模板类</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">typedef ACE_Stream&lt;ACE_MT_SYNCH&gt; MT_Stream; </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">typedef ACE_Module&lt;ACE_MT_SYNCH&gt; MT_Module; </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">typedef ACE_Task&lt;ACE_MT_SYNCH&gt; MT_Task;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了方便说明，下面统一用</span><span lang="EN-US"><font face="Times New Roman">Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来表述</span><span lang="EN-US"><font face="Times New Roman">ACE_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者是自定义的派生自它的类。与此类似，</span><span lang="EN-US"><font face="Times New Roman">Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也具有同样的意义。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作流程如下：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">1、<span style="FONT: 7pt 'Times New Roman'">  </span></font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建一系列的</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例，开启多个线程等待处理事务。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">2、<span style="FONT: 7pt 'Times New Roman'">  </span></font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将这些</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“装”入</span><span lang="EN-US"><font face="Times New Roman">Module</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">3、<span style="FONT: 7pt 'Times New Roman'">  </span></font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将这些</span><span lang="EN-US"><font face="Times New Roman">Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">依序压入</span><span lang="EN-US"><font face="Times New Roman">Stream</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">4、<span style="FONT: 7pt 'Times New Roman'">  </span></font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把要处理的数据以</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的形式置入队列。刚才派生出来的多线程会依次处理它们</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">5、<span style="FONT: 7pt 'Times New Roman'">  </span></font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作完成，移出各个模块，关闭各个线程。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-outline-level: 3"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 32.15pt; mso-char-indent-count: 2.0; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三、示例</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面，我们通过一个示例来看一下</span><span lang="EN-US"><font face="Times New Roman">ACE Streams</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的使用方法。这个示例选自《</span><span lang="EN-US"><font face="Times New Roman">The ACE Programmer’s Guide</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">》</span><span lang="EN-US"><font face="Times New Roman">p312.</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了简化，我把操作进行了改写。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">示例的总体思路是：把一个已经接受了连接的</span><span lang="EN-US"><font face="Times New Roman">ACE_SOCK_Stream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传给流，流中的模块依次接收数据、解析数据、获取连接对端方的地址名、进行应答，并把解析好的数据返还给上层。我们把前面一部分的任务配置成顺流任务，而把后面的返还过程配置成溯流任务，由此实现一个完整的双向流。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter" /><formulas><f eqn="if lineDrawn pixelLineWidth 0" /><f eqn="sum @0 1 0" /><f eqn="sum 0 0 @1" /><f eqn="prod @2 1 2" /><f eqn="prod @3 21600 pixelWidth" /><f eqn="prod @3 21600 pixelHeight" /><f eqn="sum @0 0 1" /><f eqn="prod @6 1 2" /><f eqn="prod @7 21600 pixelWidth" /><f eqn="sum @8 21600 0" /><f eqn="prod @7 21600 pixelHeight" /><f eqn="sum @10 21600 0" /></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f" /><lock aspectratio="t" v:ext="edit" /></shapetype><shape id="_x0000_i1025" style="WIDTH: 415.5pt; HEIGHT: 88.5pt" type="#_x0000_t75"><imagedata src="file:///C:\DOCUME~1\chen\LOCALS~1\Temp\msohtml1\01\clip_image001.png" /></shape></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">示例中，</span><span lang="EN-US"><font face="Times New Roman">CommandStream</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护整个的流，这个流由四个</span><span lang="EN-US"><font face="Times New Roman">Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构成：</span><span lang="EN-US"><font face="Times New Roman">RecordMessageModule, PlayMessageModule, RetrieveCallerIDModule, AnswerCallModule,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每个</span><span lang="EN-US"><font face="Times New Roman">Module</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护两个</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：一个顺流方向的</span><span lang="EN-US"><font face="Times New Roman">writer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US"><font face="Times New Roman">*DownstreamTask</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和一个溯流方向的</span><span lang="EN-US"><font face="Times New Roman">reader</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端</span><span lang="EN-US"><font face="Times New Roman">Task(*UpstreamTask).</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 32.15pt; mso-char-indent-count: 2.0; mso-outline-level: 2"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">四、实现</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 16pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.1pt; mso-char-indent-count: 2.0; mso-outline-level: 3"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt"><font face="Times New Roman">Command<p /></font></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-outline-level: 4"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个类是我们返还给上层的数据结构的载体。之所以将它设计成一个类，是为了利用</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的自动析构功能。在更健壮地应用中，我们可以进一步创建它的派生对象，而非像这里这样：将成员变量设置成为</span><span lang="EN-US"><font face="Times New Roman">public</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">class Command : public ACE_Data_Block<span style="mso-spacerun: yes">  </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">public:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>enum {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>PASS<span style="mso-tab-count: 1">      </span>= 1,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>SUCCESS<span style="mso-tab-count: 1">      </span>= 0,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>FAILURE = -1</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>enum {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>UNKNOWN<span style="mso-tab-count: 4">                        </span>= -1,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>ANSWER_CALL<span style="mso-tab-count: 3">                  </span>= 10,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>RETRIEVE_CALLER_ID<span style="mso-tab-count: 1">      </span>= 8,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>PLAY_MESSAGE<span style="mso-tab-count: 2">         </span><span style="mso-spacerun: yes">    </span>= 4,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>RECORD_MESSAGE<span style="mso-tab-count: 2">           </span>= 2</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}commands;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>int flags_;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>int command_;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>char *extra_data_;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>int numeric_result_;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>char name[MAXHOSTNAMELEN];</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>char cmd[16];</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>char param[16];</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>Command()</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>extra_data_ = NULL;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>memset(name,0,MAXHOSTNAMELEN);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>memset(cmd,0,16);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>memset(param,0,16);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang="EN-US"><font face="Times New Roman">};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 3"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt"><font face="Times New Roman">CommandTask</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">族</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 14pt"><p /></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-outline-level: 4"><span lang="EN-US"><font face="Times New Roman">CommandTask</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">派生自</span><span lang="EN-US"><font face="Times New Roman">ACE_Task&lt;ACE_MT_SYNCH&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，构成示例中全部</span><span lang="EN-US"><font face="Times New Roman">Task</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的基类。用于实现各个任务的默认处理方式。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-outline-level: 5"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">声明</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman">class CommandTask : public ACE_Task&lt;ACE_MT_SYNCH&gt;<span style="mso-spacerun: yes">  </span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman">public:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>typedef ACE_Task&lt;ACE_MT_SYNCH&gt; inherited;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int open(void * = 0);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>int put(ACE_Message_Block *message,ACE_Time_Value *timeout);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int svc(void);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int close(u_long flags);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman">protected:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>int command_;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>CommandTask(int command);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>virtual int process(Command *message);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt"><span lang="EN-US"><font face="Times New Roman">};</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 5"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作方式：可以实现为两种工作方式：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果本任务接收到数据之后直接处理数据，只需在</span><span lang="EN-US"><font face="Times New Roman">int put()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面添加代码即可，因为这个函数将会在传递数据给本任务时被调用。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果我们需要使用主动对象模式的子线程来处理数据，则可以在</span><span lang="EN-US"><font face="Times New Roman">int open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法里面开启多线程，子线程将运行</span><span lang="EN-US"><font face="Times New Roman">int svc()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面的代码。</span><span lang="EN-US"><font face="Times New Roman">int put()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法将数据交给已经被</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">置入的</span><span lang="EN-US"><font face="Times New Roman">ACE_Message_Queue</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，之后各个子线程即可从其中取中数据进行处理。在关闭时，要注意协调与各个子线程的退出。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 5"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现：我们演示后一种工作方式</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span lang="EN-US"><font face="Times New Roman">CommandTask::CommandTask(int command)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">:inherited(),command_(command)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span lang="EN-US"><font face="Times New Roman">int CommandTask::open(void *)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>return this-&gt;activate();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span lang="EN-US"><font face="Times New Roman">int CommandTask::put(ACE_Message_Block *message, ACE_Time_Value *timeout)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>return this-&gt;putq(message,timeout);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span lang="EN-US"><font face="Times New Roman">int CommandTask::svc()</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_Message_Block *message;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>for(;;){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>if( -1 == this-&gt;getq(message) )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>return -1;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>if(message-&gt;msg_type() == ACE_Message_Block::MB_HANGUP ){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>ACE_DEBUG((LM_DEBUG,ACE_TEXT(&quot;(%P|%t)%s thread close\n&quot;),this-&gt;module()-&gt;name()));</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>this-&gt;putq(message-&gt;duplicate());</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>message-&gt;release();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>Command *command = (Command*)message-&gt;data_block();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>if( command-&gt;command_ != this-&gt;command_ )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>this-&gt;put_next(message-&gt;duplicate());</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>else {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>int result = this-&gt;process(command);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3"><font face="Times New Roman">                     </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">          </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理失败？丢弃</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>if( result == Command::FAILURE )</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>command-&gt;numeric_result_ = -1;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">           </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理后需要下一个模块任务处理？</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>else if( result == Command::PASS){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>this-&gt;put_next(message-&gt;duplicate());</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">          </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理完成？</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>else {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">              </span>//</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在顺流方向？转向溯流方向</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>if(this-&gt;is_writer())</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span><span style="mso-spacerun: yes"> </span><span style="mso-tab-count: 1">     </span>this-&gt;sibling()-&gt;putq(message-&gt;duplicate());</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>else</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>this-&gt;put_next(message-&gt;duplicate());</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>message-&gt;release();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-outline-level: 6"><span lang="EN-US"><font face="Times New Roman">int CommandTask::close(u_long flags)</font></span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360074.html">ACE安装（VC/LINUX)</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360081.html&title=ACE+Streams%E6%A1%86%E6%9E%B6%E4%BB%8B%E7%BB%8D">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://icity.cn" target="_blank">《城客》：第一本中文互动杂志！</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360081.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:53:29 +0800</pubDate>
  </item>
  <item>
   <title>ACE安装（VC/LINUX)</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">自适配通信环境（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ADAPTIVE Communication Environment</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">）是可以自由使用、开放源码的面向对象（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">OO</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">）构架（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Framework</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">），在其中实现了许多用于并发通信软件的核心模式。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">提供了一组丰富的可复用</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">C++</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">包装外观（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Wrapper Façade</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">）和构架组件，可跨越多种平台完成通用的通信软件任务，其中包括：事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态（重）配置、并发执行和同步，等等。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">OO</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">网络应用和服务的开发。此外，通过服务在运行时与应用的动态链接，</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">还使系统的配置和重配置得以自动化。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">正在进行持续的改进。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Riverace</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">公司（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><a href="http://www.riverace.com/">http://www.riverace.com</a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">）采用开放源码商业模式对</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">进行商业支持。此外，</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">开发组的许多成员目前正在进行</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">The ACE ORB</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">（</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TAO</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">，</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><a href="http://www.cs.wustl.edu/~schmidt/TAO.html">http://www.cs.wustl.edu/~schmidt/TAO.html</a></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">）的开发工作。</span><span lang="EN-US" style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">可以从以下地址下载</span><span lang="EN-US" style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体"><font face="Times New Roman">ACE</font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">的安装包：</span><span lang="EN-US" style="COLOR: black"><a href="http://deuce.doc.wustl.edu/Download.html"><font face="Times New Roman">http://deuce.doc.wustl.edu/Download.html</font></a></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这里提供有</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的多个版本的集成包，这里以</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE-5.4+TAO-1.4+CIAO-0.4.tar.gz</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为例。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">VC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的安装</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">１．</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解压后放在</span><span lang="EN-US"><font face="Times New Roman">D</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">盘（或者自定义也可）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">２．在</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers\ace</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下新建文件</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">config.h</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加入一行</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">    ＃i nclude &quot;ace/config-win32.h&quot;<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">３．编译：用</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">VC6.0</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打开</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers\ace\ace.dsw<br />    </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">左侧显示</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">    ACE DLL classes<br />               ACE LIB classes<br />    </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">1</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、从菜单上选择</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">“</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">“</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">放置可远行配置</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，选择你需要的工程配置</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">        “</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">“</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重建全部</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（或任一，如</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE DLL - Win32 MFC Debug</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">        </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此过程可能持续半小时至一个小时不等</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">    </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">2</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、从菜单上选择</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">“</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">“</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">批构建</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">”</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，选择你需要的工程配置</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">        </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">此过程可能持续二至四个钟头</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">        <br />    </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">.lib</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件位于</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers\ace\</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，</span><span lang="EN-US" style="COLOR: black"><br /><font face="Times New Roman">    </font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">.dll</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件位于</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers\bin\</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">4</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．为系统变量</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">PATH</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加上</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers\bin<br />   <p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">VC</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">１．</font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立工程</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><span lang="EN-US" style="mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">２．</font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改配置</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman">project--&gt;settings…--&gt;C/C++ </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Category:Code Generation </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Use run-time library</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置为“</span><span lang="EN-US"><font face="Times New Roman">Debug Multithreaded DLL”</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman">project--&gt;settings…--&gt;C/C++ </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Category:Preprocessor </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Additional include directories</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中添加</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">D:\ACE_wrappers<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman">project--&gt;settings…</font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Link </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Category:Input </font></span><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</span></span><span lang="EN-US"><font face="Times New Roman">Object/library modules:</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中添加</span><span lang="EN-US"><font face="Times New Roman">aced.lib,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并在下面的</span><span lang="EN-US"><font face="Times New Roman">Additional library path</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面添加路径</span><span lang="EN-US"><font face="Times New Roman">D:\ACE_wrappers\ace</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><span lang="EN-US" style="mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">３．</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新建文件编辑代码</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><span lang="EN-US" style="mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">４．</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译运行</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><span lang="EN-US" style="mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">５．</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">若不能编译</span><span lang="EN-US"><font face="Times New Roman">release</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本，需在工程首处定义宏</span><span lang="EN-US"><font face="Times New Roman"> _WIN32_WINNT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang="EN-US"><font face="Times New Roman">0x0400</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">Linux</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的安装</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">１</span><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先设置</span><span lang="EN-US"><font face="Times New Roman">ACE_ROOT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境，命令：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span>“vi /etc/profile” </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">   </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在其中加入</span><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes">  </span>ACE_ROOT=/opt/ACE </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span>export ACE_ROOT </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span>LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">   </span>export LD_LIBRARY_PATH</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以加在“</span><span lang="EN-US"><font face="Times New Roman">export PATH USER</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">…</span><span lang="EN-US"><font face="Times New Roman">.</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”后的。完成后将</span><span lang="EN-US"><font face="Times New Roman">/etc/profile</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行一次，命令：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">         </span>“/etc/profile” </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样我们的</span><span lang="EN-US"><font face="Times New Roman">ACE_ROOT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就设置好了，可以用如下命令查看</span><span lang="EN-US"><font face="Times New Roman">ACE_ROOT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否设置好了：</span><span lang="EN-US"><font face="Times New Roman">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">               </span><span style="mso-spacerun: yes">   </span>“echo $ACE_ROOT” </font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个时候最好</span><span lang="EN-US"><font face="Times New Roman">reboot</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动一次</span><span lang="EN-US"><font face="Times New Roman">linux</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">２．</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设安装文件的位置如下：</span><span lang="EN-US"><font face="Times New Roman">/home/my/ACE/<span style="COLOR: black">ACE-5.4+TAO-1.4+CIAO-0.4.tar.gz<p /></span></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从其中解压出单个文件</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE-install.sh</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman"> <p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span>“tar –zxvf ACE-5.4+TAO-1.4+CIAO-0.4.tar.gz ACE_wrappers/ACE-install.sh”<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解好后，会出来一个新的子目录“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE_wrappers</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。修改其中的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE-install.sh</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的如下选项：</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo3; tab-stops: list 45.0pt"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">(1)<span style="FONT: 7pt 'Times New Roman'">        </span></font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先找到“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACEDIR=${HOME}/aceconfig</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”，将其改成“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACEDIR=/home/my/ACE</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”，就是改成我们自己建的、放有</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE-5.4+TAO-1.4+CIAO-0.4.tar.gz</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的目录，之后去掉前面的注释“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">#</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”号。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo3; tab-stops: list 45.0pt"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">(2)<span style="FONT: 7pt 'Times New Roman'">        </span></font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">找到“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACE_CONFIG=config-sunos5.4-sunc++-4.x.h</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”，将其修改成“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACE_CONFIG=config-linux.h</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -24pt; mso-list: l0 level1 lfo3; tab-stops: list 45.0pt"><span lang="EN-US" style="COLOR: black; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman">(3)<span style="FONT: 7pt 'Times New Roman'">        </span></font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">找到“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACE_GNU_MACROS=platform_sunos5_sunc++.GNU</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”，将其改成“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MY_ACE_GNU_MACROS=platform_linux.GNU</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">３．</font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行该文件</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">./ACE-install.sh<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">４．</font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">$ACE_ROOT/ace</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">libACE.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">5.4.0</chsdate></font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">拷贝到</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">/lib/</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo1; tab-stops: list 21.0pt"><span lang="EN-US" style="COLOR: black; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">５．</font></span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述编译方法得到的为</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">debug</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本，若需获得</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">release</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本的，可在</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">$ACE_ROOT/ace</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下重新</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">make,</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令：“</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">#make debug=0”.<p /></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">Linux</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的使用</span><span lang="EN-US" style="COLOR: black"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">Linux</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">ACE</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">项目往往需要使用</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">makefile,</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相关问题参考书上教程或者示例的</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">Makefile</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件。也可以使用</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">MW</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">CMPC</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具生成，在此不再累述。</span><span lang="EN-US" style="COLOR: black"><p /></span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360074.html&title=ACE%E5%AE%89%E8%A3%85%EF%BC%88VC%2FLINUX%29">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/sejie?utm_source=blogbus&utm_medium=rss&utm_campaign=sejie" target="_blank">色界频道——这里有顶尖的摄影大师，也有摄影爱好者，他们用相机收纳大千世界。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360074.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:52:46 +0800</pubDate>
  </item>
  <item>
   <title>网络编程的利器：ACE</title>
   <description><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网络部分的编程往往是搞得人一个头两个大，各种千奇百怪的问题像土行孙一样从没有防备的地方不断地冒出来，如果碰巧还要还要移植到多平台下――那还不得熬到对影成三人？</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高手当然不用愁了：多看看资料了解一下什么</span><span lang="EN-US"><font face="Times New Roman">VxWorks</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US"><font face="Times New Roman">Solaris</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下的</span><span lang="EN-US"><font face="Times New Roman">API</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数几下就搞定了。对于咱们这种手没有那么高的一般人，对还远远没有达到草木竹石均可为剑境界的凡人来说，难道非要熬上</span><span lang="EN-US"><font face="Times New Roman">N</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个通宵再加上</span><span lang="EN-US"><font face="Times New Roman">N</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US"><font face="Times New Roman">N</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次方的调试？</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非也！</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">牛顿告诉我们：若能站在巨人的肩上，岂不是能做得更好？我国古人则说：工欲善其事，必先利其器。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果能够觅得传说中的巨人，寻到那传说中的利器，一切还不迎刃而解？</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就在这个伟大的时刻，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">横空出世！</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的全名是</span><span lang="EN-US"><font face="Times New Roman">ADAPTIVE Communication Environment</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，是一组可以自由使用的（免费？）、开放源码的面向对象（</span><span lang="EN-US"><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）的构架。使用它可以藐视各个平台间的差异，大大地简化网络编程，减少出错的机会，而且更可以――打住！且先把这茬儿说清楚。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对各个操作系统的接口函数</span><span lang="EN-US"><font face="Times New Roman">API</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行封装，并且用统一的接口形式提供给程序员。换句话说，你只需要简单地调用</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的函数形式（这些形式和常见的系统</span><span lang="EN-US"><font face="Times New Roman">API</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非常相像），</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会自动地把它转换成你所在的平台上的函数：</span><span lang="EN-US"><font face="Times New Roman">VxWorks</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，或者</span><span lang="EN-US"><font face="Times New Roman">Solaris</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当然更不用说大名鼎鼎的</span><span lang="EN-US"><font face="Times New Roman">WINDOWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">Linux</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了。实现方式么，用脚指头都能想出来：使用了非常多的条件编译，把不同系统上的功能相似的</span><span lang="EN-US"><font face="Times New Roman">API</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数统一起来，如果没有则模拟实现，如果有则简单地</span><span lang="EN-US"><font face="Times New Roman">inline</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以了，还可以不折损效率。此其一也！</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">想不到还有其二吧？</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将面向对象的思想运用到这些函数里面，对网络编程等部分的功能进行改造，建立起面向对象的模型。比如，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将连接的一方处理成为一个对象，将一个连接处理成为一个对象，先前的操作则被封装成为对象的功能。切不可小觑这一点。要知道，这样就可以运用面向对象的思想来构建应用，而且</span><span lang="EN-US"><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的类型保护机制可以把一大批错误从运行时提前到编译阶段。当然，如果有谁特别有个性，特别喜欢用那种</span><span lang="EN-US"><font face="Times New Roman">C</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言的函数方式的，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也提供有那样的形式的函数来满足这种不一般的胃口。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">光说不练是没有用的，且让我用一个小例子来镇一镇那些不服的眼睛。（限于篇幅，我只在这里列出最核心的代码：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">int main(int, char *[])</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_INET_Addr port_to_listen (9999);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>ACE_SOCK_Acceptor acceptor;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>acceptor.open (port_to_listen, 1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>while (1)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>ACE_SOCK_Stream peer;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>ACE_INET_Addr peer_addr;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>ACE_Time_Value timeout (10, 0);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>if( 0 == acceptor.accept (peer, &amp;peer_addr, &amp;timeout, 0))</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 3"><font face="Times New Roman">                     </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>char buffer[4096];</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>ssize_t bytes_received;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 3"><font face="Times New Roman">                     </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>while ((bytes_received = peer.recv (buffer, sizeof(buffer))) != -1)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>{</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>peer.send_n (buffer, bytes_received);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>peer.close ();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">        </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">       </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>return 0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">寥寥数行代码，就已经实现了一个完整的服务器：它在</span><span lang="EN-US"><font face="Times New Roman">9999</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端口上开始侦听，接受一个</span><span lang="EN-US"><font face="Times New Roman">TCP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接，把它发过来的数据返还回去。如果业务完成，则断开连接，接受下个连接，开始下一个循环。只要给这段代码包含进需要的头文件，加上几句错误处理，放到</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的编译环境下――无论是</span><span lang="EN-US"><font face="Times New Roman">WINDOWS, Linux</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，还是</span><span lang="EN-US"><font face="Times New Roman">UNIX</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的――都可以编译运行。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能仅限于此，可能还不足以支持它取得如此大的成就：</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在西方的应用已经遍及电信、航空、保险、军事、天文、游戏等众多的领域。事实上，上面所说的功能仅仅占据了</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码的</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">％左右。剩下的部分，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了更为了不起的功能。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">融合通讯领域的各个优秀的模式，利用它已经建立起来的可移植到多平台的</span><span lang="EN-US"><font face="Times New Roman">OS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层函数（就是上面所说的那一部分），建立起一个个精巧的框架。这些模式都是作者等众多的工程师在实践中积累起来的优秀经验。实际上，利益于开源的思想，现在全世界有一千七百多位工作者和数百人的核心团队进行</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的进一步开发。可以这么说，使用</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，你不是站在一位巨人的肩膀上，而是站在全世界一千七百多人的肩膀上。由此你只需对现有框架进行扩展，大大缩短开发的过程，并且极大地提高程序对硬件的使用效率――而这是已经被证明的。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要提供以下几种框架供网络程序的开发：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">事件多路分离组件：</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE Reactor(</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">反应堆</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">)</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">和</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Proactor</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">（前摄器）是可扩展的面向对象多路分离器，它们分派应用特有的处理器，以响应多种类型的基于</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">I/O</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">、定时器、信号和同步的事件。</span><span lang="EN-US" style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">服务初始化组件：</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE Acceptor</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">（接受器）和</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Connector</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">（连接器）组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用特有的任务去耦合。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="FONT-SIZE: 7pt; mso-font-kerning: 0pt"><span style="mso-spacerun: yes"><font face="Times New Roman"> </font></span></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">进程和线程管理：</span></b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold">提供多进程和多线程的派生和管理方法，消除了平台的差异性。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><span lang="EN-US" style="FONT-SIZE: 7pt; mso-font-kerning: 0pt"><font face="Times New Roman">   </font></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">服务配置组件：</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE Service Configurator</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">（服务配置器）支持应用的配置，这些应用的服务可在安装时和</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">/</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">或运行时动态装配。</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">分层的流组件：</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ACE Stream</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。</span><span lang="EN-US" style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体"><p /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">      </span></span></span><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">命名服务：</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体"><font face="Times New Roman">ACE NamingService</font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-hansi-font-family: 宋体">提供了单进程命名上下文、同一节点共享命名上下文和在网络上命名上下文的服务设施。</span><font face="Times New Roman"><b><span style="FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-fareast-font-family: 楷体_GB2312; mso-hansi-font-family: 宋体">&nbsp;</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><p /></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除此以外，</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还提供了信号、线程安全与同步、内存管理等等多种丰富的功能。</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经成长成为一个完善的系统，在网络编程方面，能够提供非常丰富的服务。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会因此而满足吗？当然不，那样它只能逐渐被淘汰。当前</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正在完善它的高级分布式计算中间件组件，并且制定了多个项目计划进一步扩充和发展</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能。所以，使用</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不用担心所学的知识会因时间而贬值，而事实上正好与此相反。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><p><font face="Times New Roman"> </font></p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利剑在手，当然要学会怎么运用才能发挥它的最大功用了。</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的创建者为我们写好了三本教材，一套两卷的《</span><span lang="EN-US"><font face="Times New Roman">C++</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网络编程》和一本《</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序员指南》，都有中译本发行。此外，网上有大量的资料可供查询。如果对</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计感兴趣，那再简单不过了：你可以阅读它的全部的源代码：</span><span lang="EN-US"><font face="Times New Roman">ACE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是完全开源的！</span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/2360129.html">ACE_FIFO的进程间通信机制</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360106.html">libnet介绍与分析(上）</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="http://wolfkiller.blogbus.com/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360062.html&title=%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%9A%84%E5%88%A9%E5%99%A8%EF%BC%9AACE">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/fengshang?utm_source=blogbus&utm_medium=rss&utm_campaign=fengshang" target="_blank">风尚频道——国内顶尖的时尚族群汇聚于此，未必是流行，但一定要有品位。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360062.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:50:14 +0800</pubDate>
  </item>
  <item>
   <title>MPI Program</title>
   <description><![CDATA[COMPILING: <br /><br /><br />Compiling an MPI program: <br />1) Create a project for Visual Studio 2003, or Intel Fortran 8.0 <br />2) Add mpich2\include to the include path <br />3) Add mpich2\lib to the library path <br />4) For C applications add mpi.lib to your target link command. <br />5) For Fortran applications add fmpich2.lib to the link command. <br />6) Compile <br />7) Place your application and all the dlls it depends on in a shared location or copy them to all the nodes. <br />8) Run the application using mpiexec <br /><br />For Visual Fortran 6 use fmpich2s.lib: <br />• fmpich2.lib contains all caps cdecl: MPI_INIT <br />• fmpich2s.lib contains all caps stdcall: MPI_INIT@4 <br />• fmpich2g.lib or fmpich2g.a contain lowercase cdecl: mpi_init__ <br />For gcc/g77 <br />1) create a makefile <br />2) add –I…mpich2\include <br />3) add –L…mpich2\lib <br />4) add –lmpi (for g77: -lfmpich2g) <br />5) add the rules for your source files <br />6) same as 6,7,8 above <br /><br /><br />RUNNING MPI JOBS: <br /><br /><br />mpiexec is a command line application used to launch MPI jobs. Bring up a command prompt to run it. Execute &quot;mpiexec&quot; to see the available options. <br /><br />The simplest mpiexec command is like this: <br />mpiexec -n 3 myapp.exe <br />我找不到支持windows下的javampi，那位朋友帮帮我啊 <br /><br /><br />哈哈,我的MPICH安装编译成功,我将详细的安装编译方法贴出来(本来有贴图的,显示不出来): <br />4.1 MPICH安装 <br />4.1.1 系统要求 <br />安装MPICH for Microsoft Windows时，计算机系统有要求如下： <br /> Windows NT/2000/XP 的Professional 或Server 版（不支持Windows 95/98） <br /> 所有主机必须能够建立TCP/IP 连接 <br />MPICH支持的编译器有：MS VC++ 6.0，MS VC++.NET， Compaq Visual Fortran 6.0， Intel Fortran，gcc，以及g77。注意安装MPICH，必须以管理员的身份登录。 <br />4.1.2 下载 <br />MPICH 的下载地址是：<a href="http://www-unix.mcs.anl.gov/mpi/mpich/download.html" target="_blank">http://www-unix.mcs.anl.gov/mpi/mpich/download.html</a> <br />Windows版本的mpich.nt.1.2.5.exe 的下载地址是：<a href="http://www-unix.mcs.anl.gov/" target="_blank">http://www-unix.mcs.anl.gov/</a> ~ashton/ mpich.nt/ <br />4.1.3 安装 <br />以管理员的身份登录每台主机，在所有主机上建立一个同样的账户（当然也可以使用不同的用户名和账户，然后建立一个配置文件，使用命令行的方式运行程序），然后，运行下载的安装文件，将MPICH 安装到每台主机上。本文推荐使用同一个账户。 <br />打开“任务管理器”中的“进程”选项卡，查看是否有一个mpd.exe 的进程。如果有的话说明安装成功。以后每次启动系统，该进程将自动运行。另外，特别注意的一点是，MPICH在运行时，要关掉防火墙。 <br />4.2 注册与配置 <br />安装好MPICH 之后还必须对每台计算机进行注册和配置才能使用。其中注册必须每台计算机都要进行，配置只要在主控的计算机执行就行了。 <br />注册的目的是，将先前在每台计算机上申请的账号与密码注册到MPICH 中去，这样MPICH 才能在网络环境中访问每台主机。配置方法：运行“mpich\mpd\bin\ MPI- Register.exe”首先会提示输入用户账号，然后会提示输入两边密码，之后会问你是否保持上面的设定。如果选择是，则上面的信息将写入硬盘，否则保存在内存中，再重新启动之后就不存在了。注意在输入密码的时候，屏幕居然无任何指示，其实系统已经读入了你输入的数字。 <br /><br />图4-1 MPIRegister <br />为了让程序在许多主机上执行，而不需建立配置文件来给出相应的各个主机的信息，主控机必须得到当前可用的主机的信息。这时就需要运行MPICH的配置程序来进行配置了。MPICH提供的配置程序是一个图形界面的程序，可以从“开始-&gt;程序-&gt;MPICH -&gt;mpd-&gt;MPICH Configuration tool”启动。启动之后的界面如图4-2所示： <br /><br />图4-2 MPICH Configuration tool <br />整个界面分为三栏，在第一栏中点击Select（①号按钮），然后在跳出的对话框中选择安装了MPICH的主机名。之后在第一栏的编辑框中会显示出所有选择的主机。检查无误后，点击第二栏的Apply（②号按钮），这时下方的进度条会显示对各主机核查的情况，如果没问题整个进度条会变为蓝色。最后点击OK（③号按钮）。整个配置就完成了。 <br />4.3 MPICH编译[12] <br />MPICH提供了C语言和Fortran语言的接口。要编译一个MPI+C或MPI+ Fortran的程 <br /><br />图4-3 Visual C++设置（1） <br />序必须对编译器进行设置。下面对Visual C++ 6.0的设置进行详细说明。 <br />在Visual C++ 6中编译一个MPI+C的程序的步骤如下： <br />1.打开Visual C++ 6的Develop Studio。 <br />2.新建一个工程，通常为Win32 Console Application。 <br />3.在新的工程的编辑界面下，按Alt+F7打开工程设置对话框。 <br />4.切换到C/C++选项卡。（如图4-3）首先选择“Win32 Debug”（①的下拉框），再选择 “Code Generation”（②的下拉框），再选择“Debug Multithreaded”（③的下拉框）。这时在“Project Options”的文本框中显示“/MT”表示设置成功。然后选择“Win32Release”（①的下拉框）重复上述步骤。（图4-4） <br /><br />图4-4 Visual C++设置（2） <br />5.在C/C++选项卡中，选择“All Configurations”。（①的下拉框）选择“Preprocessor”（②的下拉框），在“Additional include directories”的文本框中输入MPICH所附带的头文件的目录。（如图4-5） <br /><br />图4-5 Visual C++设置（3） <br />6.在Link选项卡中，选择“All Configurations”。（①的下拉框）然后再选择“Input”（②的下拉框），在“Additional library path”的文本框中输入MPICH所附带的库文件的目录。（如图4-6） <br /><br />图4-6 Visual C++设置（4） <br />7.在Link选项卡中，选择“All Configurations”。（①的下拉框）然后再选择“General”（②的下拉框），然后在“Object/library modules”（③）的文本框中添加“ws2_32.lib”。点击“OK”。这时在“Common Options”（④）中会出现“ws2_32.lib”。（如图4-7） <br /><br />图4-7 Visual C++设置（5） <br />8.在Link选项卡中，选择“Win32 Debug”。（①的下拉框）然后再选择“General”（②的下拉框），然后在“Object/library modules”（③）的文本框中添加“mpichd.lib”。点击“OK”。这时在“Project Options”（④）中会出现“mpichd.lib”。（如图4-8） <br />9.在Link选项卡中，选择“Win32 Release”。（①的下拉框）然后再选择“General”（②的下拉框），然后在“Object/library modules”（③）的文本框中添加“mpich.lib”。点击“OK”。这时在“Project Options”（④）中会出现“mpich.lib”。（如图4-9） <br />10.关闭工程设置对话框，对源程序进行调试、编译和试运行，编译完成。 <br /><br />图4-8 Visual C++设置（6） <br /><br />图4-9 Visual C++设置（7） <!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/1825545.html">Winodws下IIS/Apache+PHP+MySQL的安装配置</a> 2006-01-15</div><div><a href="http://wolfkiller.blogbus.com/logs/1712473.html">Windows APIs</a> 2005-12-16</div><div><a href="http://wolfkiller.blogbus.com/logs/1703893.html">关于动态链接库DLL</a> 2005-12-14</div><div><a href="/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="/logs/1938239.html">使用c#+(datagrid控件)编辑xml文件</a> 2006-02-17</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2360045.html&title=MPI+Program">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://icity.cn" target="_blank">《城客》：第一本中文互动杂志！</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2360045.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Wed, 26 Apr 2006 21:47:59 +0800</pubDate>
  </item>
  <item>
   <title>GDI+基础</title>
   <description><![CDATA[<p>System.Drawing 命名空间提供了对 GDI+ 基本图形功能的访问<br />System.Drawing.Drawing2D 命名空间提供高级的二维和矢量图形功能。此命名空间包含梯度型画刷、Matrix 类（用于定义几何变换）和 GraphicsPath 类<br />System.Drawing.Imaging 命名空间提供高级 GDI+ 图像处理功能<br />System.Drawing.Text 命名空间提供高级 GDI+ 排版功能<br /><br />Bitmap类封装 GDI+ 位图，此位图由图形图像及其属性的像素数据组成。Bitmap 对象是用于处理由像素数据定义的图像的对象<br /><br />常用属性和方法<br /><br />1.属性:<br />Height 获取此 Image 对象的高度 <br />PixelFormat 获取此 Image 对象的像素格式 <br />Size 获取此图像的以像素为单位的宽度和高度 <br />Width 获取此 Image 对象的宽度 <br /><br />2.方法<br />Dispose 释放由此 Image 对象使用的所有资源<br />Save 将此图像以指定的格式保存到指定的流中<br />SetPixel 设置 Bitmap 对象中指定像素的颜色 </p><p><br /><br />Graphics 类表示封装 GDI+ 绘图面,比如画长方形,圆形等更加复杂的图形.<br /><br />常用属性和方法:<br /><br />属性 说明 <br />Clip 获取或设置Region对象，该对象限定此Graphics对象的绘图区域。 <br />ClipBounds 获取RectangleF结构，该结构限定此Graphics对象的剪辑区域。 <br />DpiX 获取此Graphics对象的水平分辨率。 <br />DpiY 获取此Graphics对象的垂直分辨率。 <br />PageScale 获取或设置此Graphics对象的全局单位和页单位之间的比例。 <br />PageUnit 获取或设置用于此Graphics对象中的页坐标的度量单位。 <br />PixelOffsetMode 获取或设置一个值，该值指定在呈现此Graphics对象的过程中像素如何偏移。 <br />RenderingOrigin 为抵色处理和阴影画笔获取或设置此Graphics对象的呈现原点。 <br />SmoothingMode 获取或设置此Graphics对象的呈现质量。 <br />TextRenderingHint 获取或设置与此Graphics对象关联的文本的呈现模式。 <br />Transform 获取或设置此Graphics对象的全局变换。 <br />VisibleClipBounds 获取或设置此Graphics对象的可见剪辑区域的边框。 <br /><br />方法 说明 <br />Clear 清除整个绘图面并以指定背景色填充。 <br />Dispose 释放由此Graphics对象使用的所有资源。 <br />DrawArc 绘制一段弧线，它表示由一对坐标、宽度和高度指定的椭圆部分。 <br />DrawEllipse 绘制一个由边框定义的椭圆。 <br />DrawIcon 在指定坐标处绘制由指定的Icon对象表示的图像。 <br />DrawIconUnstretched 绘制指定的Icon对象表示的图像，而不缩放该图像。 <br />DrawImage 在指定位置并且按原始大小绘制指定的Image对象。 <br />DrawImageUnscaled 在坐标对所指定的位置并且按其原始大小绘制指定的Image对象。 <br />DrawLine 绘制一条连接由坐标对指定的两个点的线条。 <br />DrawLines 绘制一系列连接一组Point结构的线段。 <br />DrawPie 绘制一个扇形，该扇形由一个坐标对、宽度和高度以及两条射线所指定的椭圆定义。 <br />DrawPolygon 绘制由一组Point结构定义的多边形。 <br />DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。 <br />DrawRectangles 绘制一系列由Rectangle结构指定的矩形。 <br />DrawString 在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串。 <br />FillClosedCurve 填充由Point结构数组定义的闭合基数样条曲线的内部。 <br />FillEllipse 填充边框所定义的椭圆的内部，该边框由一对坐标、一个宽度和一个高度指定。 <br />FillPie 填充由一对坐标、一个宽度、一个高度以及两条射线指定的椭圆所定义的扇形区的内部。 <br />FillPolygon <br />填充Point结构指定的点数组所定义的多边形的内部。 <br />FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形的内部。 <br />FillRectangles 填充由Rectangle结构指定的一系列矩形的内部。 <br />FillRegion 填充Region 对象的内部。 <br />Flush 强制执行所有挂起的图形操作并立即返回而不等待操作完成。 <br />FromHdc 从设备上下文的指定句柄创建新的Graphics对象。 <br />FromHwnd 从窗口的指定句柄创建新的Graphics对象。 <br />FromImage 从指定的Image对象创建新Graphics对象。 <br />GetHdc 获取与此Graphics对象关联的设备上下文的句柄。 <br />ReleaseHdc 释放通过以前对此Graphics对象GetHdc方法的调用获得的设备上下文句柄。 <br />ResetClip 将此Graphics对象的剪辑区域重置为无限区域。 <br />ResetTransform 将此Graphics对象的全局变换矩阵重置为单位矩阵。 <br /><br />　　　　　　　　　　　<br />画一个矩形<br />DrawRectangle 绘制由坐标对、宽度和高度指定的矩形<br /><br />public void DrawRectangle(Pen, int, int, int, int);<br /><br />绘制由坐标对、宽度和高度指定的矩形<br /></p><p><br />使用颜色<br /><br />Color 结构表示 ARGB 颜色<br /><br />颜色包含a,R,G,B<br /><br />Color mycolor;<br />mycolor = Color.FromName(&quot;blue&quot;);<br />//FromName方法把颜色字符串换成GDI+颜色<br />mycolor = Color.FromArgb(255, 0, 0);<br />//FromArgb方法设置RGB值<br />mycolor = Color.FromArgb(100,255, 0, 0); <br />//FromArgb方法设置a,RGB值<br /><br />用ColorTranslator类在HTML颜色和GDI+颜色之间转换<br />mycolor = ColorTranslator.FromHtml(&quot;#00FF00&quot;);<br /><br />使用画笔<br /><br />Brush 类用于填充图形形状（如矩形、椭圆形、扇形、多边形和封闭路径）内部的对象<br /><br />System.Drawing.Drawing2D.HatchBrush 用阴影样式、前景色和背景色定义矩形画笔<br />System.Drawing.Drawing2D.LinearGradientBrush 使用线性渐变封装 Brush 对象<br />System.Drawing.Drawing2D.<a name="1"></a><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">PathGradientBrush</b> 封装 Brush 对象，它通过渐变填充 GraphicsPath 对象的内部<br />System.Drawing.SolidBrush 定义单色画刷<br />System.Drawing.TextureBrush 使用图像来填充形状的内部<br /></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="/logs/2360094.html">ACE Service Configurator框架</a> 2006-04-26</div><div><a href="/logs/1938314.html">C#中使用XML——编写XML</a> 2006-02-17</div><div><a href="/logs/1895424.html">Visual C++ .NET编程：托管C++概述</a> 2006-02-07</div><div><a href="/logs/1712473.html">Windows APIs</a> 2005-12-16</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F2010123.html&title=GDI%2B%E5%9F%BA%E7%A1%80">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/shenghuo?utm_source=blogbus&utm_medium=rss&utm_campaign=shenghuo" target="_blank">生活频道——笑谈生活，坐看人生，这里有着小人物的健康生活。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/2010123.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Sun, 05 Mar 2006 21:38:36 +0800</pubDate>
  </item>
  <item>
   <title>C#中使用XML——编写XML</title>
   <description><![CDATA[在我的上一篇文章《C#中使用XML——读取XML》中和大家讨论了如何使用.NET Framework中提供的类在C#中读取XML以及读取的一些相关概念，那么今天就说一说如何在C#中编写XML文档，起初我觉得用编程的方式去编写XML简直就是自讨苦吃，后来想想还是觉得挺有用的，我想Microsoft那班家伙能编出这些类来应该不是仅仅为了向比尔i盖茨交差吧！至于它的用处嘛……比如说做安装程序啊！我们可以根据在安装过程中用户所选的选项以及一些设置来生成相应的XML文档再根据XML文档来初始化我们的应用程序。空洞的话不说那么多了，下面我们来了解一下具体的实现细节。 <br /><br />要编写XML同样是采用流的概念，在.NET中编写XML的细节是作为XmlWriter类来实现的，但该类是抽象类不能够实例化，为此，我们要想在程序中访问它的方法以实现编写XML的愿望，必需使用它的派生类XmlTextWriter，该类提供了一系列的属性和方法为我们编写XML做准备，下面将详细的介绍这个类： <br /><br />构造函数： <br /><br />public XmlTextWriter(TextWriter); <br /><br />public XmlTextWriter(Stream, Encoding); <br /><br />public XmlTextWriter(string, Encoding); <br /><br />第一个构造函数是把现有的TextWriter实例传递过去，System.IO.TextWriter类是一个有序的字符流 <br /><br />第二个构造函数是把要写入的流作为第一个参数，第二个参数是指定XML文档的编码方式，默认是UTF8，可取Encoding的枚举值，流可以是FileStream，MemoryStream，NetworkStream等等 <br /><br />第三个构造函数是把希望写入的文件名当作一个字符串（如果存在，就重写该文件）传递给第一个参数，第二个参数指定编码方式 <br /><br /><br /><br />常用的方法： <br /><br />WriterStartDocument()和WriterEndDocument()方法： <br /><br />第一个方法用来编写XML声明部分，如：&lt;?xml version=”1.0” encoding=”UTF-8” ?&gt; <br /><br />第二个方法用来关闭任何打开的元素或属性并将编写器重新设置为 Start 状态。 <br /><br /><br /><br />WriterStartElement()和WriteEndElement()方法： <br /><br />第一个方法用来写出指定的开始标记，该方法有以下几个重载： <br /><br />WriterStartElement(string localname) <br /><br />使用传递的字符串作为元素的本地名称 <br /><br />WriterStartElement(string localname,string namespace) <br /><br />第一个参数指定元素的本地名称，第二个参数指定元素所在的命名空间 <br /><br />WriterStartElement(string prefix,string localname,string namespace) <br /><br />第一个参数指定元素的前缀，第二个参数指定元素的本地名称，第三个参数指定元素所在的命名空间 <br /><br />第二个方法用来写出与开始元素对应的关闭元素，如果开始元素不包含任何内容，将用一个”/&gt;”做为关闭元素 <br /><br /><br /><br />WriterStartAttribute()和WriterEndAttribute()方法： <br /><br />第一个方法用于编写一个属性的开头，该方法有两个重载： <br /><br />WriterStartAttribute(string localname,string namespace) <br /><br />第一个参数指定属性的本地名称，第二个参数指定属性所在的命名空间 <br /><br />WriterStartAttribute(string prefix,string localname,string namespace) <br /><br />第一个参数指定属性的前缀，第二个参数指定属性的本地名称，第三个参数指定属性所在的命名空间 <br /><br />第二个方法用于关闭WriterStartAttribute创建的属性 <br /><br /><br /><br />WriterElementString()方法： <br /><br />该方法可以创建一个包含字符串值的元素，它有以下重载： <br /><br />WriterElementString(string localname,string value) <br /><br />如果编写这样的代码：WriterElementString(“para”,”Some text”) 将输出：&lt;para&gt;Some text&lt;/para&gt; <br /><br />WriterElementString(string localname,string namespace,string value) <br /><br />如果编写这样的代码：WriterElementString(“para”,”http://www.w3.org/ns”,”Some text”) 将输出：&lt;para xmlns=”http://www.w3.org/ns”&gt;Some text&lt;/para&gt; <br /><br />如果编写嵌套几级的元素可使用WriterStartElement()和WriterEndElement()方法，如果编写直接包含内容的元素可以使用该方法 <br /><br /><br /><br />WriterAttributeString()方法： <br /><br />类似与WriterElementString()方法，在使用上如果属性的值当中不包含实体可直接使用该方法来写出属性，如果属性值包含实体可使用WriterStartAttribute()和WriterEndAttribute()方法，例如要写出这样的XML——&lt;para author=”Do&amp;0241;a&amp;amp;L.Perez”/&gt;,可编写以下代码： <br /><br />WriterStartElement(“para”); <br /><br />WriterStartAttribute(“author”,null); <br /><br />WriterString(“Do”); <br /><br />WriterCharEntiry(“~n”); <br /><br />WriterString(“a”); <br /><br />WriterCharEntiry(“&amp;”); <br /><br />WriterString(“L.Perez”); <br /><br />WriterEndAttribute(); <br /><br />WriterEndElement(); <br /><br />该方法有以下重载： <br /><br />WriterAttributeString(string localname,string value); <br /><br />WriterAttributeString(string localname,string namespace,string value); <br /><br />WriterAttributeString(string prefx, string localname,string namespace,string value); <br /><br /><br /><br />WriterNode(XmlReader reader,bool defattr)方法： <br /><br />该方法可以从XmlReader读取器中复制节点并把它们写入XmlWriter流中，第一个参数是XmlReader的实例，第二个参数接受一个布尔值，决定是否复制元素中的属性，考虑下面XML片段： <br /><br />&lt;para&gt; <br /><br />&lt;sent&gt; <br /><br />The&lt;b&gt;XmlWriter&lt;/b&gt;class writes XML content to a Stream. <br /><br />&lt;/sent&gt; <br /><br />&lt;/para&gt; <br /><br />以下代码复制其中的片段，reader代表XmlReader的实例writer代表XmlWriter类的实例： <br /><br />while(reader.Read()) <br /><br />{ <br /><br />if (reader.Name == ”sent” &amp;&amp; reader.NodeType == XmlNodeType.Element) <br /><br />{ <br /><br />writer.WriterNode(reader,true); <br /><br />} <br /><br />} <br /><br />得到以下输出： <br /><br />&lt;sent&gt; <br /><br />The&lt;b&gt;XmlWriter&lt;/b&gt;class writes XML content to a Stream. <br /><br />&lt;/sent&gt; <br /><br /><br /><br />WriterComment(string text)方法：用于写出注释 <br /><br />WriterString(string text)方法：用于写出文本 <br /><br />WriterCData(string text)方法：写出CDATA数据块 <br /><br />WriterBase64(byte[] buffer,int index,int count)方法：将指定的二进制字节编码为 Base64 并写出结果文本 <br /><br />Flush()：将缓冲区中的所有内容刷新到基础流，并同时刷新基础流 <br /><br />Close()：关闭此流和基础流 <br /><br /><br /><br />以上对XmlTextWriter类的一些重要方法做了简单介绍，下面我们就来看一个例程，看看在程序中如何使用这些方法，照样还是先来看下运行效果图： <br /><br /><br />Example1按纽将向一个文件写出XML声明和一个元素节点以及节点内的文本，Example2按纽将在Example1的基础上添加属性节点，嵌套元素以及文本，WriteNode按纽使用WriterNode()方法在现有读取器中复制该读取器中的所有元素及属性并写到一个新的XML文档中，Example3按纽将写一份完整的XML文档，Example4按纽在Example3按纽的基础上另外生成一份文档并向该文档中追加CDATA部分，Example5按纽将使用WriterBase64()方法对一幅图片进行编码并将编码后的数据写到XML文档中，Example6按纽将使用Example5按纽中生成的XML读取其中数据并对其中编码数据进行解码最后生成一张图片。 <br /><br />以下是功能实现代码： <br /><br /><br />namespace XMLWriting <br /><br />{ <br /><br />using System; <br /><br />using System.IO; <br /><br />using System.Text; <br /><br />using System.Xml; <br /><br />using System.Drawing; <br /><br />using System.Collections; <br /><br />using System.ComponentModel; <br /><br />using System.Windows.Forms; <br /><br />using System.Data; <br /><br /><br /><br />/// &lt;summary&gt; <br /><br />/// Form1 的摘要说明。 <br /><br />/// &lt;/summary&gt; <br /><br />public class Form1 : System.Windows.Forms.Form <br /><br />{ <br /><br />private System.Windows.Forms.TextBox textBox1; <br /><br />private System.Windows.Forms.Button button1; <br /><br />private System.Windows.Forms.Button button2; <br /><br />private System.Windows.Forms.Button button3; <br /><br />private System.Windows.Forms.Button button4; <br /><br />private System.Windows.Forms.Button button5; <br /><br />private System.Windows.Forms.Button button6; <br /><br />private System.Windows.Forms.Button button7; <br /><br />/// &lt;summary&gt; <br /><br />/// 必需的设计器变量。 <br /><br />/// &lt;/summary&gt; <br /><br />private System.ComponentModel.Container components = null; <br /><br /><br /><br />public Form1() <br /><br />{ <br /><br />// <br /><br />// Windows 窗体设计器支持所必需的 <br /><br />// <br /><br />InitializeComponent(); <br /><br /><br /><br />// <br /><br />// TODO: 在 InitializeComponent 调用后添加任何构造函数代码 <br /><br />// <br /><br />} <br /><br /><br /><br />/// &lt;summary&gt; <br /><br />/// 清理所有正在使用的资源。 <br /><br />/// &lt;/summary&gt; <br /><br />protected override void Dispose( bool disposing ) <br /><br />{ <br /><br />if( disposing ) <br /><br />{ <br /><br />if (components != null) <br /><br />{ <br /><br />components.Dispose(); <br /><br />} <br /><br />} <br /><br />base.Dispose( disposing ); <br /><br />} <br /><br /><br /><br />#region Windows 窗体设计器生成的代码 <br /><br />/// &lt;summary&gt; <br /><br />/// 设计器支持所需的方法 - 不要使用代码编辑器修改 <br /><br />/// 此方法的内容。 <br /><br />/// &lt;/summary&gt; <br /><br />private void InitializeComponent() <br /><br />{ <br /><br />this.textBox1 = new System.Windows.Forms.TextBox(); <br /><br />this.button1 = new System.Windows.Forms.Button(); <br /><br />this.button2 = new System.Windows.Forms.Button(); <br /><br />this.button3 = new System.Windows.Forms.Button(); <br /><br />this.button4 = new System.Windows.Forms.Button(); <br /><br />this.button5 = new System.Windows.Forms.Button(); <br /><br />this.button6 = new System.Windows.Forms.Button(); <br /><br />this.button7 = new System.Windows.Forms.Button(); <br /><br />this.SuspendLayout(); <br /><br />// <br /><br />// textBox1 <br /><br />// <br /><br />this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) <br /><br />| System.Windows.Forms.AnchorStyles.Left) <br /><br />| System.Windows.Forms.AnchorStyles.Right))); <br /><br />this.textBox1.Location = new System.Drawing.Point(0, 8); <br /><br />this.textBox1.Multiline = true; <br /><br />this.textBox1.Name = &quot;textBox1&quot;; <br /><br />this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; <br /><br />this.textBox1.Size = new System.Drawing.Size(784, 332); <br /><br />this.textBox1.TabIndex = 0; <br /><br />this.textBox1.Text = &quot;&quot;; <br /><br />// <br /><br />// button1 <br /><br />// <br /><br />this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); <br /><br />this.button1.Location = new System.Drawing.Point(0, 344); <br /><br />this.button1.Name = &quot;button1&quot;; <br /><br />this.button1.TabIndex = 1; <br /><br />this.button1.Text = &quot;Example1&quot;; <br /><br />this.button1.Click += new System.EventHandler(this.button1_Click); <br /><br />// <br /><br />// button2 <br /><br />// <br /><br />this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); <br /><br />this.button2.Location = new System.Drawing.Point(88, 344); <br /><br />this.button2.Name = &quot;button2&quot;; <br /><br />this.button2.TabIndex = 2; <br /><br />this.button2.Text = &quot;Example2&quot;; <br /><br />this.button2.Click += new System.EventHandler(this.button2_Click); <br /><br />// <br /><br />// button3 <br /><br />// <br /><br />this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); <br /><br />this.button3.Location = new System.Drawing.Point(176, 344); <br /><br />this.button3.Name = &quot;button3&quot;; <br /><br />this.button3.TabIndex = 3; <br /><br />this.button3.Text = &quot;WriteNode&quot;; <br /><br />this.button3.Click += new System.EventHandler(this.button3_Click); <br /><br />// <br /><br />// button4 <br /><br />// <br /><br />this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); <br /><br />this.button4.Location = new System.Drawing.Point(264, 344); <br /><br />this.button4.Name = &quot;button4&quot;; <br /><br />this.button4.TabIndex = 4; <br /><br />this.button4.Text = &quot;Example3&quot;; <br /><br />this.button4.Click += new System.EventHandler(this.button4_Click); <br /><br />// <br /><br />// button5 <br /><br />// <br /><br />this.button5.Location = new System.Drawing.Point(352, 344); <br /><br />this.button5.Name = &quot;button5&quot;; <br /><br />this.button5.TabIndex = 5; <br /><br />this.button5.Text = &quot;Example4&quot;; <br /><br />this.button5.Click += new System.EventHandler(this.button5_Click); <br /><br />// <br /><br />// button6 <br /><br />// <br /><br />this.button6.Location = new System.Drawing.Point(440, 344); <br /><br />this.button6.Name = &quot;button6&quot;; <br /><br />this.button6.TabIndex = 6; <br /><br />this.button6.Text = &quot;Example5&quot;; <br /><br />this.button6.Click += new System.EventHandler(this.button6_Click); <br /><br />// <br /><br />// button7 <br /><br />// <br /><br />this.button7.Location = new System.Drawing.Point(528, 344); <br /><br />this.button7.Name = &quot;button7&quot;; <br /><br />this.button7.TabIndex = 7; <br /><br />this.button7.Text = &quot;Example6&quot;; <br /><br />this.button7.Click += new System.EventHandler(this.button7_Click); <br /><br />// <br /><br />// Form1 <br /><br />// <br /><br />this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); <br /><br />this.ClientSize = new System.Drawing.Size(784, 373); <br /><br />this.Controls.Add(this.button7); <br /><br />this.Controls.Add(this.button6); <br /><br />this.Controls.Add(this.button5); <br /><br />this.Controls.Add(this.button4); <br /><br />this.Controls.Add(this.button3); <br /><br />this.Controls.Add(this.button2); <br /><br />this.Controls.Add(this.button1); <br /><br />this.Controls.Add(this.textBox1); <br /><br />this.Name = &quot;Form1&quot;; <br /><br />this.Text = &quot;XMLWriting&quot;; <br /><br />this.ResumeLayout(false); <br /><br /><br /><br />} <br /><br />#endregion <br /><br /><br /><br />/// &lt;summary&gt; <br /><br />/// 应用程序的主入口点。 <br /><br />/// &lt;/summary&gt; <br /><br />[STAThread] <br /><br />static void Main() <br /><br />{ <br /><br />Application.Run(new Form1()); <br /><br />} <br /><br /><br /><br />private void button1_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />this.textBox1.Text = string.Empty; <br /><br />const string fileName = &quot;WriteXml.xml&quot;; <br /><br /><br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(fileName,Encoding.UTF8); <br /><br /><br /><br />// 写XML文档声明 <br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />// 写XML起始元素 <br /><br />xmlTxtWt.WriteStartElement(&quot;ct&quot;,&quot;ContactDetails&quot;,&quot;http://www.deltabis.com/Contact&quot;); <br /><br />// 写文本 <br /><br />xmlTxtWt.WriteString(&quot;This is a XML file&quot;); <br /><br />// 写XML结束元素 <br /><br />xmlTxtWt.WriteEndElement(); <br /><br />// 写关闭文档元素 <br /><br />xmlTxtWt.WriteEndDocument(); <br /><br /><br /><br />xmlTxtWt.Flush(); //刷新 <br /><br />xmlTxtWt.Close(); <br /><br /><br /><br />this.textBox1.Text = ReadXml(fileName); <br /><br />} <br /><br /><br /><br />/// &lt;summary&gt; <br /><br />/// 读取经过编写的XML文件的所有内容 <br /><br />/// &lt;/summary&gt; <br /><br />/// &lt;param name=&quot;xmlPath&quot;&gt;文件路径&lt;/param&gt; <br /><br />/// &lt;returns&gt;表示内容的字符串&lt;/returns&gt; <br /><br />private string ReadXml(string xmlPath) <br /><br />{ <br /><br />string xmlStr = string.Empty; <br /><br />XmlTextReader xmlTxtRd = new XmlTextReader(xmlPath); <br /><br /><br /><br />xmlTxtRd.MoveToContent(); <br /><br />xmlStr = xmlTxtRd.ReadOuterXml(); <br /><br /><br /><br />xmlTxtRd.Close(); <br /><br />return xmlStr; <br /><br />} <br /><br /><br /><br />private void button2_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />this.textBox1.Text = string.Empty; <br /><br />const string fileName = &quot;WriteXml1.xml&quot;; <br /><br /><br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(fileName,Encoding.UTF8); <br /><br /><br /><br />// 设置XML的输出格式，这里使用缩进 <br /><br />xmlTxtWt.Formatting = Formatting.Indented; <br /><br />// 设置缩进的数量，这里是4个空格，IndentChar属性默认是空格 <br /><br />xmlTxtWt.Indentation = 4; <br /><br /><br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />xmlTxtWt.WriteStartElement(&quot;ct&quot;,&quot;ContactDetails&quot;,&quot;http://www.deltabis.com/Contact&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;Date&quot;,&quot;20050121 14:00&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;contact&quot;,&quot;abcd&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;contact&quot;,&quot;efgh&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;contact&quot;,&quot;ijkl&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;contact&quot;,&quot;mnop&quot;); <br /><br />xmlTxtWt.WriteEndElement(); <br /><br />xmlTxtWt.WriteEndDocument(); <br /><br /><br /><br />xmlTxtWt.Flush(); <br /><br />xmlTxtWt.Close(); <br /><br /><br /><br />this.textBox1.Text = ReadXml(fileName); <br /><br />} <br /><br /><br /><br />// 从读取器中复制节点及其内容 <br /><br />private void button3_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />XmlTextReader xmlTxtRd = new XmlTextReader(&quot;唐诗.xml&quot;); <br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(&quot;WriteXml2.xml&quot;,Encoding.UTF8); <br /><br /><br /><br />xmlTxtWt.Formatting = Formatting.Indented; <br /><br />xmlTxtWt.Indentation = 4; <br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />xmlTxtWt.WriteComment(&quot;以下是从读取器中拷贝的节点&quot;); <br /><br /><br /><br />try <br /><br />{ <br /><br />while(xmlTxtRd.Read()) <br /><br />{ <br /><br />if (xmlTxtRd.NodeType == XmlNodeType.Element) <br /><br />xmlTxtWt.WriteNode(xmlTxtRd,true); <br /><br />} <br /><br />} <br /><br />catch(Exception exp) <br /><br />{ <br /><br />MessageBox.Show(exp.ToString()); <br /><br />} <br /><br />finally <br /><br />{ <br /><br />xmlTxtWt.Flush(); <br /><br />xmlTxtWt.Close(); <br /><br />xmlTxtRd.Close(); <br /><br />} <br /><br /><br /><br />this.textBox1.Text = ReadXml(&quot;WriteXml2.xml&quot;); <br /><br />} <br /><br /><br /><br />// 编写一份完整的XML <br /><br />private void button4_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />this.textBox1.Text = string.Empty; <br /><br />string fileName = &quot;WriteXml3.xml&quot;; <br /><br /><br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(fileName,Encoding.UTF8); <br /><br /><br /><br />xmlTxtWt.Formatting = Formatting.Indented; <br /><br />xmlTxtWt.Indentation = 4; <br /><br /><br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />xmlTxtWt.WriteStartElement(&quot;ct&quot;,&quot;ContactDetails&quot;,&quot;http://www.deltabis.com/Contact&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;Date&quot;,&quot;20050121 16:00&quot;); <br /><br />xmlTxtWt.WriteComment(&quot;This document contains contact information.&quot;); <br /><br />xmlTxtWt.WriteStartElement(&quot;contact&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;title&quot;,string.Empty); <br /><br />xmlTxtWt.WriteStartElement(&quot;name&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;firstname&quot;,&quot;Steven&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;middle&quot;,string.Empty); <br /><br />xmlTxtWt.WriteElementString(&quot;lastname&quot;,&quot;LivingStone-Perez&quot;); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteEndDocument(); <br /><br /><br /><br />xmlTxtWt.Flush(); <br /><br />xmlTxtWt.Close(); <br /><br /><br /><br />this.textBox1.Text = ReadXml(fileName); <br /><br />} <br /><br /><br /><br />// 添加CDATA数据块 <br /><br />private void button5_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />this.textBox1.Text = string.Empty; <br /><br />string fileName = &quot;WriteXml4.xml&quot;; <br /><br /><br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(fileName,Encoding.UTF8); <br /><br /><br /><br />xmlTxtWt.Formatting = Formatting.Indented; <br /><br />xmlTxtWt.Indentation = 4; <br /><br /><br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />xmlTxtWt.WriteStartElement(&quot;ct&quot;,&quot;ContactDetails&quot;,&quot;http://www.deltabis.com/Contact&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;Date&quot;,&quot;20050121 16:00&quot;); <br /><br />xmlTxtWt.WriteComment(&quot;This document contains contact information.&quot;); <br /><br />xmlTxtWt.WriteStartElement(&quot;contact&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;title&quot;,string.Empty); <br /><br />xmlTxtWt.WriteStartElement(&quot;name&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;firstname&quot;,&quot;Steven&quot;); <br /><br />xmlTxtWt.WriteElementString(&quot;middle&quot;,string.Empty); <br /><br />xmlTxtWt.WriteElementString(&quot;lastname&quot;,&quot;LivingStone-Perez&quot;); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteStartElement(&quot;notes&quot;,&quot;http://www.deltabis.com/Contact&quot;); // 该节点的命名空间与上面一样，该节点将使用上面的前缀 <br /><br />xmlTxtWt.WriteCData(&quot;&lt;securityAlogrithm&gt;88hshshhhdd8*^&amp;@^*^#*&amp;!%~~~(ghj*(**&amp;%^){}^(*&amp;7*(9$%###$@!&quot;); <br /><br />xmlTxtWt.WriteEndElement(); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteFullEndElement(); <br /><br />xmlTxtWt.WriteEndDocument(); <br /><br /><br /><br />xmlTxtWt.Flush(); <br /><br />xmlTxtWt.Close(); <br /><br /><br /><br />this.textBox1.Text = ReadXml(fileName); <br /><br />} <br /><br /><br /><br />// 对图片进行编码，并写出 <br /><br />private void button6_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />int readByte = 0; <br /><br />int bytesToRead = 100; <br /><br />string fileName = &quot;WriteXml5.xml&quot;; <br /><br />this.textBox1.Text = string.Empty; <br /><br /><br /><br />// 打开图片文件，利用该图片构造一个文件流 <br /><br />FileStream fs = new FileStream(@&quot;D:\03.jpg&quot;,FileMode.Open); <br /><br />// 使用文件流构造一个二进制读取器将基元数据读作二进制值 <br /><br />BinaryReader br = new BinaryReader(fs); <br /><br /><br /><br />XmlTextWriter xmlTxtWt = new XmlTextWriter(fileName,Encoding.UTF8); <br /><br />xmlTxtWt.Formatting = Formatting.Indented; <br /><br />xmlTxtWt.Indentation = 4; <br /><br /><br /><br />xmlTxtWt.WriteStartDocument(); <br /><br />xmlTxtWt.WriteStartElement(&quot;ct&quot;,&quot;ContactDetails&quot;,&quot;http://www.deltabis.com/Contact&quot;); <br /><br />xmlTxtWt.WriteStartElement(&quot;image&quot;); <br /><br />xmlTxtWt.WriteAttributeString(&quot;imageName&quot;,&quot;03.jpg&quot;); <br /><br /><br /><br />byte[] base64buffer = new byte[bytesToRead]; <br /><br />do <br /><br />{ <br /><br />readByte = br.Read(base64buffer,0,bytesToRead); //将数据读入字节数组 <br /><br />xmlTxtWt.WriteBase64(base64buffer,0,readByte); //将数组中二进制值编码为Base64并写出到XML文件 <br /><br />}while(bytesToRead &lt;= readByte); <br /><br /><br /><br />xmlTxtWt.WriteEndElement(); <br /><br />xmlTxtWt.WriteEndElement(); <br /><br />xmlTxtWt.WriteEndDocument(); <br /><br /><br /><br />xmlTxtWt.Flush(); <br /><br />xmlTxtWt.Close(); <br /><br /><br /><br />this.textBox1.Text = ReadXml(fileName); <br /><br />} <br /><br /><br /><br />// 解码并生成图片 <br /><br />private void button7_Click(object sender, System.EventArgs e) <br /><br />{ <br /><br />int readByte = 0; <br /><br />int bytesToRead = 100; <br /><br /><br /><br />XmlTextReader xmlTxtRd = new XmlTextReader(&quot;WriteXml5.xml&quot;); <br /><br /><br /><br />FileStream fs = new FileStream(&quot;newimage.jpg&quot;,FileMode.Create); <br /><br />BinaryWriter bw = new BinaryWriter(fs); <br /><br /><br /><br />byte[] base64buffer = new byte[bytesToRead]; <br /><br /><br /><br />while(xmlTxtRd.Read()) <br /><br />{ <br /><br />if (xmlTxtRd.NodeType == XmlNodeType.Element &amp;&amp; xmlTxtRd.Name == &quot;image&quot;) <br /><br />{ <br /><br />do <br /><br />{ <br /><br />readByte = xmlTxtRd.ReadBase64(base64buffer,0,bytesToRead); <br /><br />bw.Write(base64buffer,0,readByte); <br /><br />}while(readByte &lt;= bytesToRead); <br /><br />} <br /><br />} <br /><br /><br /><br />bw.Flush(); <br /><br />bw.Close(); <br /><br />fs.Close(); <br /><br /><br /><br />xmlTxtRd.Close(); <br /><br />} <br /><br />} <br /><br />} <br /><br />以下是在WriteNode按纽中要使用到的XML文件： <br /><br />唐诗.xml <br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt; <br /><br />&lt;唐诗&gt; <br /><br />&lt;五言绝句&gt; <br /><br />&lt;作者 字号=&quot;太白&quot;&gt;李白&lt;/作者&gt; <br /><br />&lt;标题&gt;静夜思&lt;/标题&gt; <br /><br />&lt;内容&gt;床前明月光，疑是地上霜。举头望明月，低头思故乡。&lt;/内容&gt; <br /><br />&lt;/五言绝句&gt; <br /><br />&lt;五言绝句&gt; <br /><br />&lt;作者 字号=&quot;太白&quot;&gt;李太白&lt;/作者&gt; <br /><br />&lt;标题&gt;春晓&lt;/标题&gt; <br /><br />&lt;内容&gt;春眠不觉晓，处处闻啼鸟。夜来风雨声，花落知多少。&lt;/内容&gt; <br /><br />&lt;/五言绝句&gt; <br /><br />&lt;五言绝句&gt; <br /><br />&lt;作者 字号=&quot;季凌&quot;&gt;王之涣&lt;/作者&gt; <br /><br />&lt;标题&gt;登鹤雀楼&lt;/标题&gt; <br /><br />&lt;内容&gt;白日依山尽，黄河入海流。欲穷千里目，更上一层楼&lt;/内容&gt; <br /><br />&lt;/五言绝句&gt; <br /><br />&lt;五言绝句&gt; <br /><br />&lt;作者&gt;李清照&lt;/作者&gt; <br /><br />&lt;标题&gt;如梦令&lt;/标题&gt; <br /><br />&lt;内容&gt;昨夜风疏雨骤，浓睡不消残酒，试问卷帘人，却道海棠依旧，知否，知否，应是绿肥红瘦。&lt;/内容&gt; <br /><br />&lt;/五言绝句&gt; <br /><br />&lt;/唐诗&gt; <br /><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://wolfkiller.blogbus.com/logs/1938239.html">使用c#+(datagrid控件)编辑xml文件</a> 2006-02-17</div><div><a href="/logs/2360115.html">libnet介绍与分析（下）</a> 2006-04-26</div><div><a href="/logs/2360081.html">ACE Streams框架介绍</a> 2006-04-26</div><div><a href="/logs/2360045.html">MPI Program</a> 2006-04-26</div><div><a href="/logs/1712473.html">Windows APIs</a> 2005-12-16</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fwolfkiller.blogbus.com%2Flogs%2F1938314.html&title=C%23%E4%B8%AD%E4%BD%BF%E7%94%A8XML%E2%80%94%E2%80%94%E7%BC%96%E5%86%99XML">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/fengshang?utm_source=blogbus&utm_medium=rss&utm_campaign=fengshang" target="_blank">风尚频道——国内顶尖的时尚族群汇聚于此，未必是流行，但一定要有品位。</a></b></div><br /><br />]]></description>
   <link>http://wolfkiller.blogbus.com/logs/1938314.html</link>
   <author>宝刀屠浪</author>
   <pubDate>Fri, 17 Feb 2006 12:53:37 +0800</pubDate>
  </item>
 </channel>
</rss>
