﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-steven-ma</title><link>http://www.blogjava.net/steven-ma/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 00:59:38 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 00:59:38 GMT</pubDate><ttl>60</ttl><item><title>Socket工作模式</title><link>http://www.blogjava.net/steven-ma/archive/2006/04/13/40823.html</link><dc:creator>steven's home</dc:creator><author>steven's home</author><pubDate>Thu, 13 Apr 2006 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/steven-ma/archive/2006/04/13/40823.html</guid><wfw:comment>http://www.blogjava.net/steven-ma/comments/40823.html</wfw:comment><comments>http://www.blogjava.net/steven-ma/archive/2006/04/13/40823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/steven-ma/comments/commentRss/40823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/steven-ma/services/trackbacks/40823.html</trackback:ping><description><![CDATA[关于linux socket编程的lecture<br /><font color="#ff0000">http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/index.htm</font><br /><br /><b><u><font color="#ff1493" size="5">阻塞模式</font></u></b><br /><table border="0" cellpadding="0" cellspacing="0" height="2710" width="1026"><tbody><tr><td valign="top" width="24"><font face="宋体"><font size="+2"><blockquote><p><font size="3">socket的缺省方式，也是最常用的方式，即函数阻塞直到调用完毕。</font></p><p><font size="3">可能造成阻塞的函数有：recvfrom() 、connect()、accept()、读写函数、select()、poll()、gethostbyname()等。</font></p><p><font><font><font face="宋体"><font size="+2"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">                 <img src="http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/images/new_pa6.jpg" v:shapes="_x0000_i1025" height="358" width="517" /></span></font></font></font></font><font size="+1"><br /></font></p><font face="宋体" size="2"></font><p><font size="+1"></font><font face="宋体" size="2">#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;errno.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;sys/types.h&gt;<br />#include &lt;netinet/in.h&gt;<br />#include &lt;sys/socket.h&gt;<br />#include &lt;sys/wait.h&gt;<br />#define MYPORT 3490                  
/* 监听的端口 */<br />#define BACKLOG 10                   
/* listen的请求接收队列长度 *<br /><br />void main() {</font></p><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><p><font face="宋体" size="2">int sockfd, new_fd;            /* 监听端口，数据端口 */<br />struct sockaddr_in sa;         /* 
  自身的地址信息 */<br />struct sockaddr_in their_addr; /* 连接对方的地址信息 */<br />int sin_size;<br /><br />if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {    <br />    perror("socket");<br />    exit(1);<br />}<br />sa.sin_family = AF_INET;<br />sa.sin_port = htons(MYPORT);         
  /* 网络字节顺序 */<br />sa.sin_addr.s_addr = INADDR_ANY;     /* 自动填本机IP 
  */<br />bzero(&amp;(sa.sin_zero), 8);             
  /* 其余部分置0 */<br />if (bind(sockfd, (struct sockaddr *)&amp;sa, sizeof(sa)) == -1) {    <br />    perror("bind");<br />    exit(1);<br />}<br />if (listen(sockfd, BACKLOG) == -1) {    <br />    perror("listen");<br />    exit(1);<br />}<br />/* 主循环 */</font></p><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font><font face="宋体" size="2"></font></blockquote><font face="宋体" size="2"></font><p><font face="宋体" size="2">while(1) {<br />    sin_size = sizeof(struct sockaddr_in);<br />    new_fd = accept(sockfd, (struct sockaddr *)&amp;their_addr, 
    &amp;sin_size));<br />    if (new_fd == -1) {<br />        perror("accept");<br />        continue;<br />    }<br />    printf(”Got connection from %s\n", 
    inet_ntoa(their_addr.sin_addr));<br />    if (fork() == 0) {    /* 子进程 */        <br />        if (send(new_fd, "Hello, world!\ n", 14, 0) == -1)        <br />            perror("send");<br />            close(new_fd);<br />            exit(0);<br />    }<br />    close(new_fd);    /*清除所有子进程 */<br />    while(waitpid(-1,NULL,WNOHANG) &gt; 0);<br /> }<br />}</font></p></blockquote><p></p><br /></blockquote></font></font><p><font color="#ff1493"><b><u><font face="宋体" size="5">非阻塞模式</font></u></b></font></p><font face="宋体"><font size="+2"></font></font><font face="宋体"><font size="+2"><blockquote><div align="justify"></div><p align="left"><font size="3">程序调用可能造成阻塞的函数时：<br />如果会<font color="#ff6600">发生阻塞</font>，这些<font color="#ff6600">函数返回-1</font>并将<font color="#ff6600">errno设置为EAGAIN或EWOULDBLOCK</font>，程序可继续向下运行。可能阻塞<br />的函数对应的<font color="#ff6600">任务完成</font>，则<font color="#ff6600">再次调用该函数时就返回0表示运行结束</font>。</font></p><p><font size="3">非
阻塞模式可以避免程序死锁，但是需要程序不断检查各个可能阻塞的函数的状态，当一个应用程序使用了<br />非阻塞模式的套接字，它需要使用一个循环来不听的测试是
否一个文件描述符有数据可读（称做polling）。<br />应用程序不停的polling内核来检查是否I/O操作已经就绪。这将是一个极浪费CPU资源的操
作，因此不能实际<br />应用。一般非阻塞模式是与同步I/O模式共同使用的。</font></p><p><font><font><font face="宋体"><font size="+2"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><img src="http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/images/new_pa4.jpg" v:shapes="_x0000_i1025" height="355" width="511" /></span></font></font></font></font></p><p><font size="3"><br /></font></p></blockquote></font></font><div align="left"><p><font face="宋体"><font size="+2"><p align="center"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
 o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
 stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:366pt;
 height:252.75pt' o:ole="" fillcolor="window">
 <v:imagedata src="file:///C:/tmp/msoclip1/09/clip_image001.png" o:title=""/>
</v:shape><![endif]-->  <!--[if gte mso 9]><xml>
 <o:OLEObject Type="Embed" ProgID="Paint.Picture" ShapeID="_x0000_i1025"
  DrawAspect="Content" ObjectID="_1036892040">
 </o:OLEObject>
</xml><![endif]--></span></p></font></font></p></div><font face="宋体"><font size="+2"><blockquote><p align="center"></p></blockquote></font></font><p><font size="3">获得或改变socket的I/O属性：</font></p><font size="3"><blockquote><p><font color="#800080">int ioctl(int sockfd,long cmd,unsigned long* argp);</font></p><blockquote><p>cmd属性类型，argp属性的参数。<br />常用的有：<br />FIONREAD，返回socket缓冲区中未读数据的字节数<br />FIONBIO，argp为零时为阻塞模式，非零时为非阻塞模式<br />SIOCATMARK ，判断是否有未读的带外数据（仅用于TCP协议），返回true或false</p></blockquote><p><font color="#800080">int fcntl(int fd, int cmd, long arg);</font></p><blockquote><p>F_SETFL，arp为O_NONBLOCK时进入非阻塞模式，为0时进入阻塞模式。<br />F_GETFL，获得属性。</p></blockquote></blockquote></font><font face="宋体"><font size="+2"><p><font size="5"><u><font color="#ff1493" face="宋体"><br /></font></u></font></p><p><font size="5"><u><b><font color="#ff1493" face="宋体">I/O多路复用（同步I/O模式）</font></b></u></font></p></font></font><font face="宋体"><font size="+2"><p><font size="3">     使用<font color="#ff1493">select()、poll()</font>等函数实现对多个socket的同步I/O操作。它能同时等待多个 <br />socket描述符，而这些socket描述符其中的任意一个进入读就绪/写就绪/出错状态，select()<br />函数就可以返回。</font></p><p><font size="3">        </font><font><font><font face="宋体"><font size="+2"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><img src="http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/images/new_pa5.jpg" v:shapes="_x0000_i1025" height="356" width="510" /></span></font></font></font></font></p><p align="center"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
 o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
 stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:366pt;
 height:252.75pt' o:ole="" fillcolor="window">
 <v:imagedata src="file:///C:/tmp/msoclip1/09/clip_image001.png" o:title=""/>
</v:shape><![endif]-->       <!--[if gte mso 9]><xml>
 <o:OLEObject Type="Embed" ProgID="Paint.Picture" ShapeID="_x0000_i1025"
  DrawAspect="Content" ObjectID="_1036891996">
 </o:OLEObject>
</xml><![endif]--></span></p><p><font face="宋体" size="3">socket轮询选择：</font><font face="宋体" size="3"></font></p></font></font><blockquote><font face="宋体" size="3"></font><p><font color="#800080" face="宋体" size="3">int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set 
  *exceptfds, struct timeval *timeout);</font></p><font face="宋体" size="3"></font><p><font face="宋体" size="3">应用于多路同步I/O模式</font></p><p><font face="宋体"><font size="5"><fs_set是表示socket集合的数据类型，具有以下运算宏：></fs_set是表示socket集合的数据类型，具有以下运算宏：></font></font></p><!--mstheme--><!--msthemelist--><table border="0" cellpadding="0" cellspacing="0" width="100%"><!--msthemelist--><tbody><tr><td valign="top" width="42"><br /></td><td valign="top" width="100%"><!--mstheme--><font face="宋体" size="3">FD_ZERO(*set) 清空socket集合<!--mstheme--></font><!--msthemelist--></td></tr><!--msthemelist--><tr><td valign="baseline" width="42"><br /></td><td valign="top" width="100%"><!--mstheme--><font face="宋体" size="3">FD_SET(s, *set) 将s加入socket集合<!--mstheme--></font><!--msthemelist--></td></tr><!--msthemelist--><tr><td valign="baseline" width="42"><br /></td><td valign="top" width="100%"><!--mstheme--><font face="宋体" size="3">FD_CLR(s, *set) 从socket集合去掉s<!--mstheme--></font><!--msthemelist--></td></tr><!--msthemelist--><tr><td valign="baseline" width="42"><br /></td><td valign="top" width="100%"><!--mstheme--><font face="宋体" size="3">FD_ISSET(s, *set) 判断s是否在socket集合<!--mstheme--></font><!--msthemelist--></td></tr><!--msthemelist--></tbody></table><!--mstheme--><font face="宋体"></font></blockquote><p><font face="宋体"><font size="5"><font size="3">     常数FD_SETSIZE：集合元素的最多个数</font></font></font></p><font face="宋体"><font size="+2"><p><font size="3">等待选择机制：</font></p></font></font><blockquote><font face="宋体" size="3"></font><font face="宋体" size="3"></font><font face="宋体" size="3"></font><p><font face="宋体" size="3"><font color="#800080">i</font><font color="#800080">nt poll(struct pollfd *ufds, unsigned int nfds, int 
  timeout);</font><br />是select机制的一个变种，应用于多路同步I/O模式<br />ufds是pollfd结构的数组，数组元素个数为nfds。</font></p><font face="宋体" size="3"><!--mstheme--></font><pre><font size="3">struct pollfd {<br />           int fd;           /* file descriptor */<br />           short events;     /* requested events */<br />           short revents;    /* returned events */<br />       };<br /></font><font><font face="宋体" size="3">程序段节选</font></font><font size="3"><font face="宋体"></font></font>int listenfd, connfd, maxfd=0; <font size="3"><font face="宋体"><br /></font></font>int nready; <font size="3"><font face="宋体"><br /></font></font><font color="#800080">fd_set rset, allset;</font><font size="3"><font face="宋体"><br /></font></font>struct sockaddr_in cliaddr, servaddr; <font size="3"><font face="宋体"><br /></font></font>int clilen;<font size="3"><font face="宋体"><br /></font></font>listenfd = socket(AF_INET, SOCK_STREAM, 0); <font size="3"><font face="宋体"><br /></font></font>if (listenfd &gt; maxfd) maxfd = listenfd;<font size="3"><font face="宋体"><br /></font></font>memset(&amp;servaddr, 0, sizeof(servaddr)); <font size="3"><font face="宋体"><br /></font></font>servaddr.sin_family = AF_INET; <font size="3"><font face="宋体"><br /></font></font>servaddr.sin_addr.s_addr = htonl(INADDR_ANY); <font size="3"><font face="宋体"><br /></font></font>servaddr.sin_port = htons(4321);<font size="3"><font face="宋体"><br /></font></font>bind(listenfd, (struct sockaddr *) &amp;servaddr, sizeof(servaddr));<font size="3"><font face="宋体"><br /></font></font><font color="#800080">FD_ZERO(&amp;allset); </font><font size="3"><font face="宋体"><br /></font></font><font color="#800080">FD_SET(listenfd, &amp;allset)</font>; <font size="3"><font face="宋体"><br /></font></font>listen(listenfd, 10);<font size="3"><font face="宋体"><br /></font></font>/* main loop */<font size="3"><font face="宋体"><br /></font></font>while (1) { <font size="3"><font face="宋体"><br /></font></font><font color="#800080">rset = allset; </font><font size="3"><font face="宋体"><br /></font></font><font color="#800080">nready = select(maxfd+1, &amp;rset, NULL, NULL, NULL);</font><font size="3"><font face="宋体"><br /></font></font><font color="#800080">	if (FD_ISSET(listenfd, &amp;rset)) {</font><font size="3"><font face="宋体"><br /></font></font>/* 有新的客户端连接请求<font size="3"><font face="宋体"><br /></font></font>clilen = sizeof(cliaddr); <font size="3"><font face="宋体"><br /></font></font>connfd = accept(listenfd, (struct sockaddr*)&amp;cliaddr,&amp;clilen);<font size="3"><font face="宋体"><br /></font></font>if (client_num == FD_SETSIZE) {<br />			fprintf(stderr, "too many clients\n");       <font size="3"><font face="宋体"><br /></font></font>exit(-1); <br />		}    <font size="3"><font face="宋体"><br /></font></font>	FD_SET(connfd, &amp;allset); <font size="3"><font face="宋体"><br /></font></font>if (connfd &gt; maxfd) maxfd = connfd; <font size="3"><font face="宋体"><br /></font></font>if (--nready &lt;= 0) continue; <br />	}<font size="3"><font face="宋体"><br /></font></font> //以下依次判断FD_ISSET(某个socket, &amp;rset) 并做相应处理 <font size="3"><font face="宋体"><br /></font></font>}<font face="宋体" size="3"><br /></font></pre></blockquote><font face="宋体"><font size="+2"><p><font color="#ff1493" face="宋体" size="3"></font><b><u><font color="#ff1493" face="宋体" size="5">信号驱动I/O</font></u></b></p><font color="#ff1493"><font size="5"><u><b></b></u></font></font></font></font><p><font face="宋体"><font size="6"><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
 o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
 stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:366pt;
 height:252.75pt' o:ole="" fillcolor="window">
 <v:imagedata src="file:///C:/tmp/msoclip1/09/clip_image001.png" o:title=""/>
</v:shape><![endif]-->                   
<img src="http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/images/new_pa7.jpg" v:shapes="_x0000_i1025" height="352" width="506" /></span></font></font></p><p><b><font color="#ff1493" size="5"><u><font face="宋体">异步I/O</font></u></font></b></p><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
 o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
 stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:366pt;
 height:252.75pt' o:ole="" fillcolor="window">
 <v:imagedata src="file:///C:/tmp/msoclip1/09/clip_image001.png" o:title=""/>
</v:shape><![endif]--></span><blockquote><blockquote><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><font face="宋体"><img src="http://www.aka.org.cn/Lectures/002/Lecture-2.1.8/Lecture-2.1.8/images/new_pa8.jpg" v:shapes="_x0000_i1025" height="363" width="523" /></font></span></blockquote></blockquote></td><!--msnavigation--><td style="vertical-align: top;"><br /></td><td valign="top"><!--mstheme--><font face="宋体"></font><br /></td></tr></tbody></table><img src ="http://www.blogjava.net/steven-ma/aggbug/40823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/steven-ma/" target="_blank">steven's home</a> 2006-04-13 10:29 <a href="http://www.blogjava.net/steven-ma/archive/2006/04/13/40823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>