<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[转]epoll 的主动式连接代码。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 17 Oct 2012 03:22:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>&nbsp;&nbsp; 大多数的epoll 代码例子是 被动连接的。&nbsp;&nbsp;但是我的例子不一样。我是一个主动连接的代码。 因为类似爬虫这样的程序是需要主动连接服务器的。&nbsp;&nbsp;现在我的代码很郁闷的地方 是连接数上不去，只能保持在100左右。这是个非常低的值。 我认为至少要在2000 以上才行。<br/><br/>代码编译正常，运行正常。也没有发现所谓的连接数变大的现象。 但就是同时的连接数很少 我这里只有140 左右。<br/>而 如果apache 服务器在本地的话可以达到400 左右，这样的话，我仍然认为偏少。 我认为如果是局域网达到2000 应该没问题，可惜我这里上不去。&nbsp;&nbsp;上不去的原因&nbsp;&nbsp;第一 apache 服务器 accept 速度不够？&nbsp;&nbsp;我认为这不太可能，不少服务同时在线4000-5000人。那么同时连接数&gt;&gt;400 才差不多。&nbsp;&nbsp;第二 是代码某个地方有瓶颈？ 我认为是的。 但找不到。 能给电建议吗？<br/><br/>要测试自己的服务器 只需要把那段http request 改成自己的就可以了。 修改一下 也可以变为灌水机，但技术含量就太低了。<br/><br/><textarea name="code" class="C" rows="15" cols="100">
#include &lt;pthread.h&gt;

#include &lt;sys/epoll.h&gt;

#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;netdb.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;errno.h&gt;
#include &lt;time.h&gt;

#define maxevents 500
#define numthreads&nbsp;&nbsp; 1
#define max_thread 6000
#define MAXLINE&nbsp;&nbsp; 1024
#define max_connect 6000

void *work(void *arg);
void setnonblocking(int sock);
void do_use_fd(struct epoll_event&nbsp;&nbsp; *events);

pthread_mutex_t lock_mutex = PTHREAD_MUTEX_INITIALIZER;

int lines&nbsp;&nbsp; = 0;
int epollfd = 0;

int main()&#123;

&nbsp;&nbsp;pthread_t pid_t[100];
&nbsp;&nbsp;struct epoll_event ev, events[maxevents]=&#123;0&#125;;

&nbsp;&nbsp;int nfds&nbsp;&nbsp; = 0;
&nbsp;&nbsp;int n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0;
&nbsp;&nbsp;int status = 0;
&nbsp;&nbsp;int i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 0;
&nbsp;&nbsp;time_t a,b;
&nbsp;&nbsp;time(&amp;a);
&nbsp;&nbsp;//lock_mutex = PTHREAD_MUTEX_INITIALIZER;

for ( i = 0 ; i &lt; numthreads ; i++) &#123;
&nbsp;&nbsp;status = pthread_create(&amp;pid_t[i], NULL, work, NULL);&nbsp;&nbsp;// 起一个线称建立连接

&nbsp;&nbsp;if (0 == status) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; pthread created &#92;n&quot;);
&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot; pthread create fail&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&#125;

&#125;
&nbsp;&nbsp;epollfd&nbsp;&nbsp;= epoll_create(maxevents);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 建立epoll

&nbsp;&nbsp;if (-1 == epollfd)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;error cannot epoll_create&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;epollfd = %d&nbsp;&nbsp;&#92;n&quot;, epollfd);
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;printf(&quot; begin epoll_wait &#92;n&quot;);

&nbsp;&nbsp;for (;;) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;befor epoll_wait %d &#92;n&quot;, &amp;(events[0]));
&nbsp;&nbsp;&nbsp;&nbsp;nfds = epoll_wait(epollfd, events, maxevents, 500); // 开始抓回复
&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot; after&nbsp;&nbsp;epoll_wait nfds = %d&#92;n&quot;, nfds);
&nbsp;&nbsp;&nbsp;&nbsp;if(nfds == -1)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;nfds == -1 &quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;nfds = %d &#92;n&quot;, nfds);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;for(n = 0; n &lt; nfds; ++n) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do_use_fd(&amp;(events[n]));
&nbsp;&nbsp;&nbsp;&nbsp;&#125; // end for
&nbsp;&nbsp;&#125; // end for
&nbsp;&nbsp;return 0;
&#125;



void *work(void *arg)&#123;&nbsp;&nbsp;// 这个就是工作线称主要发起连接

&nbsp;&nbsp;int i = 0 ;
&nbsp;&nbsp;int create_conn = 1;
&nbsp;&nbsp;struct sockaddr_in clientadd;
&nbsp;&nbsp;int client;
&nbsp;&nbsp;time_t a,b;

&nbsp;&nbsp;struct epoll_event ev;
&nbsp;&nbsp;int len = 0;
&nbsp;&nbsp;struct timeval timeo = &#123;3, 10&#125;;
&nbsp;&nbsp;pthread_detach(pthread_self());&nbsp;&nbsp;// this


&nbsp;&nbsp;for (;;)&#123;

&nbsp;&nbsp;&nbsp;&nbsp;create_conn = 1;
&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&amp;lock_mutex);
&nbsp;&nbsp;&nbsp;&nbsp;if (lines &gt; max_connect)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create_conn = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;++lines;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; now lines = %d &#92;n&quot;, lines);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&amp;lock_mutex);

&nbsp;&nbsp;&nbsp;&nbsp;if (0 == create_conn)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;// else
&nbsp;&nbsp;&nbsp;&nbsp;client = socket(AF_INET , SOCK_STREAM, 0);
&nbsp;&nbsp;&nbsp;&nbsp;if (client &lt; 0)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;begin memset &#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;clientadd, 0, sizeof(clientadd));
&nbsp;&nbsp;&nbsp;&nbsp;len = sizeof(timeo);
&nbsp;&nbsp;&nbsp;&nbsp;clientadd.sin_family = AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;//clientadd.sin_addr.s_addr&nbsp;&nbsp;=&nbsp;&nbsp;inet_addr(&quot;61.172.203.140&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientadd.sin_addr.s_addr&nbsp;&nbsp;=&nbsp;&nbsp;inet_addr(&quot;192.168.1.100&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;clientadd.sin_port&nbsp;&nbsp;= htons(80);
&nbsp;&nbsp;&nbsp;&nbsp;setsockopt(client, SOL_SOCKET, SO_SNDTIMEO, &amp;timeo, len);

&nbsp;&nbsp;&nbsp;&nbsp;//setnonblocking(client);

&nbsp;&nbsp;&nbsp;&nbsp;ev.events&nbsp;&nbsp;=&nbsp;&nbsp;EPOLLOUT&nbsp;&nbsp;&#124; EPOLLET &#124;&nbsp;&nbsp;EPOLLERR &#124; EPOLLHUP &#124; EPOLLPRI;
&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd =&nbsp;&nbsp;client;


&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;begin connect &#92;n&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;if (connect(client, (struct sockaddr*)&amp;clientadd, sizeof(clientadd)) == -1)&#123;

&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot; connect failed&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp; --lines;
&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, &quot;timeout&#92;n&quot;);

&nbsp;&nbsp;&nbsp;&nbsp; close(client);
&nbsp;&nbsp;&nbsp;&nbsp; continue;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;time(&amp;a);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%s &quot;, ctime(&amp;a));

&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(client);
&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;begin connect &#92;n&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;/*
&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&amp;lock_mutex);
&nbsp;&nbsp;&nbsp;&nbsp;++lines;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; now lines = %d &#92;n&quot;, lines);
&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&amp;lock_mutex);
&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot; begin epoll_ctl &#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, client, &amp;ev) &lt; 0) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; fd = %d &quot;, client);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;epoll set insertion error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;

&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot; add to %d epoll pool&#92;n&quot;, epollfd);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&#125; // end for
&#125;

void setnonblocking(int sock)&#123;
&nbsp;&nbsp;int opts;
&nbsp;&nbsp;opts=fcntl(sock,F_GETFL);
&nbsp;&nbsp;if(opts&lt;0)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;fcntl(sock,GETFL)&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;opts = opts&#124;O_NONBLOCK;
&nbsp;&nbsp;if(fcntl(sock,F_SETFL,opts)&lt;0)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;fcntl(sock,SETFL,opts)&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&#125;
&#125;

void do_use_fd(struct epoll_event&nbsp;&nbsp; *events)&#123;


&nbsp;&nbsp;struct epoll_event ev;
&nbsp;&nbsp;int n&nbsp;&nbsp;=&nbsp;&nbsp;0;

&nbsp;&nbsp;//http request command
&nbsp;&nbsp;static char buff[5000] =&quot;&#92;x47&#92;x45&#92;x54&#92;x20&#92;x2F&#92;x32&#92;x2E&#92;x70&#92;x68&#92;x70&#92;x20&#92;x48&#92;x54&#92;x54&#92;x50&#92;x2F&#92;x31&#92;x2E&#92;x31&#92;x0D&#92;x0A&#92;x41&#92;x63&#92;x63&#92;x65&#92;x70&#92;x74&#92;x3A&#92;x20&#92;x69&#92;x6D&#92;x61&#92;x67&#92;x65&#92;x2F&#92;x67&#92;x69&#92;x66&#92;x2C&#92;x20&#92;x69&#92;x6D&#92;x61&#92;x67&#92;x65&#92;x2F&#92;x78&#92;x2D&#92;x78&#92;x62&#92;x69&#92;x74&#92;x6D&#92;x61&#92;x70&#92;x2C&#92;x20&#92;x69&#92;x6D&#92;x61&#92;x67&#92;x65&#92;x2F&#92;x6A&#92;x70&#92;x65&#92;x67&#92;x2C&#92;x20&#92;x69&#92;x6D&#92;x61&#92;x67&#92;x65&#92;x2F&#92;x70&#92;x6A&#92;x70&#92;x65&#92;x67&#92;x2C&#92;x20&#92;x61&#92;x70&#92;x70&#92;x6C&#92;x69&#92;x63&#92;x61&#92;x74&#92;x69&#92;x6F&#92;x6E&#92;x2F&#92;x78&#92;x2D&#92;x73&#92;x68&#92;x6F&#92;x63&#92;x6B&#92;x77&#92;x61&#92;x76&#92;x65&#92;x2D&#92;x66&#92;x6C&#92;x61&#92;x73&#92;x68&#92;x2C&#92;x20&#92;x2A&#92;x2F&#92;x2A&#92;x0D&#92;x0A&#92;x41&#92;x63&#92;x63&#92;x65&#92;x70&#92;x74&#92;x2D&#92;x4C&#92;x61&#92;x6E&#92;x67&#92;x75&#92;x61&#92;x67&#92;x65&#92;x3A&#92;x20&#92;x7A&#92;x68&#92;x2D&#92;x63&#92;x6E&#92;x0D&#92;x0A&#92;x41&#92;x63&#92;x63&#92;x65&#92;x70&#92;x74&#92;x2D&#92;x45&#92;x6E&#92;x63&#92;x6F&#92;x64&#92;x69&#92;x6E&#92;x67&#92;x3A&#92;x20&#92;x67&#92;x7A&#92;x69&#92;x70&#92;x2C&#92;x20&#92;x64&#92;x65&#92;x66&#92;x6C&#92;x61&#92;x74&#92;x65&#92;x0D&#92;x0A&#92;x55&#92;x73&#92;x65&#92;x72&#92;x2D&#92;x41&#92;x67&#92;x65&#92;x6E&#92;x74&#92;x3A&#92;x20&#92;x4D&#92;x6F&#92;x7A&#92;x69&#92;x6C&#92;x6C&#92;x61&#92;x2F&#92;x34&#92;x2E&#92;x30&#92;x20&#92;x28&#92;x63&#92;x6F&#92;x6D&#92;x70&#92;x61&#92;x74&#92;x69&#92;x62&#92;x6C&#92;x65&#92;x3B&#92;x20&#92;x4D&#92;x53&#92;x49&#92;x45&#92;x20&#92;x36&#92;x2E&#92;x30&#92;x3B&#92;x20&#92;x57&#92;x69&#92;x6E&#92;x64&#92;x6F&#92;x77&#92;x73&#92;x20&#92;x4E&#92;x54&#92;x20&#92;x35&#92;x2E&#92;x30&#92;x3B&#92;x20&#92;x2E&#92;x4E&#92;x45&#92;x54&#92;x20&#92;x43&#92;x4C&#92;x52&#92;x20&#92;x31&#92;x2E&#92;x31&#92;x2E&#92;x34&#92;x33&#92;x32&#92;x32&#92;x29&#92;x0D&#92;x0A&#92;x48&#92;x6F&#92;x73&#92;x74&#92;x3A&#92;x20&#92;x31&#92;x39&#92;x32&#92;x2E&#92;x31&#92;x36&#92;x38&#92;x2E&#92;x31&#92;x2E&#92;x31&#92;x30&#92;x30&#92;x0D&#92;x0A&#92;x43&#92;x6F&#92;x6E&#92;x6E&#92;x65&#92;x63&#92;x74&#92;x69&#92;x6F&#92;x6E&#92;x3A&#92;x20&#92;x4B&#92;x65&#92;x65&#92;x70&#92;x2D&#92;x41&#92;x6C&#92;x69&#92;x76&#92;x65&#92;x0D&#92;x0A&#92;x0D&#92;x0A&quot;;
&nbsp;&nbsp;char inbuff[MAXLINE] =&#123;0&#125;;
&nbsp;&nbsp;int client = events-&gt;data.fd;
&nbsp;&nbsp;int closeit = 1;

&nbsp;&nbsp;//printf(&quot; in do user fd &#92;n&quot;);

&nbsp;&nbsp;if (events-&gt;events &amp; EPOLLIN)&#123; // 可以读了

&nbsp;&nbsp;&nbsp;&nbsp;if ( (client = events-&gt;data.fd) &lt; 0) return;

&nbsp;&nbsp;&nbsp;&nbsp;while (1) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( (n = read(client, inbuff, MAXLINE)) &lt; 0) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (errno == ECONNRESET) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;readline error&nbsp;&nbsp;errno == ECONNRESET&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;readline error no data %d&#92;n&quot;, client);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeit = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (n == 0) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;readline == 0 &#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;i get %d byte form %d &#92;n&quot;, n ,client);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; // end while (1)

&nbsp;&nbsp;&nbsp;&nbsp;if (1 == closeit) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;close socket %d now &#92;n&quot;, client);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events = EPOLLIN &#124; EPOLLET &#124;&nbsp;&nbsp;EPOLLERR &#124; EPOLLHUP &#124; EPOLLPRI;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd = client;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epollfd, EPOLL_CTL_DEL, client, &amp;ev);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(client);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(&amp;lock_mutex);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--lines;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot; now lines = %d &#92;n&quot;, lines);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(&amp;lock_mutex);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;&nbsp;&nbsp;else if (events-&gt;events &amp; EPOLLOUT) // end if

&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;if ( (client = events-&gt;data.fd) &lt; 0) return;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot; now write %d &#92;n&quot;,events-&gt;data.fd);
&nbsp;&nbsp;&nbsp;&nbsp;n = write(events-&gt;data.fd, buff, strlen(buff));

&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%d&nbsp;&nbsp;write = %d &#92;n&quot;, lines, n);
&nbsp;&nbsp;&nbsp;&nbsp;ev.events = EPOLLIN &#124;EPOLLERR;
&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd = client;
&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epollfd, EPOLL_CTL_MOD, client, &amp;ev);
&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events = EPOLLIN &#124;EPOLLERR;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd = client;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(epollfd, EPOLL_CTL_DEL, client, &amp;ev);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(client);
&nbsp;&nbsp;&#125;
&#125;
</textarea><br/><br/>原理是启动一个线称不断的建立连接 ，connect 用了阻塞的， 我认为这里效率比较低。但如果是非阻塞的话， 那么在select 同时 再建立第二个连接 是不是可以呢？ 能给点代码和意见吗？<br/><br/>如果这个模型稳定而成功， 一个网页蜘蛛就有了个网络基础了。<br/>root@192.168.98.128:/data0/htdocs/tmp# g++ epoll.cpp -o thread -lpthread<br/><br/>root@192.168.98.128:/data0/htdocs/tmp# ./thread <br/> pthread created <br/> now lines = 1 <br/>begin connect <br/>epollfd = 3&nbsp;&nbsp;<br/> begin epoll_wait <br/> connect failed<br/>timeout<br/><br/>EOF<br/>以上来自：http://bbs.chinaunix.net/thread-950204-1-1.html<br/><br/>最后：<br/>该代码在编译时出现问题的解决：<br/> undefined reference to &#039;pthread_create&#039;问题解决<br/>由于是Linux新手，所以现在才开始接触线程编程，照着GUN/Linux编程指南中的一个例子输入编译，结果出现如下错误：<br/>undefined reference to &#039;pthread_create&#039;<br/>undefined reference to &#039;pthread_join&#039;<br/><br/>问题原因：<br/>&nbsp;&nbsp;&nbsp;&nbsp;pthread 库不是 Linux 系统默认的库，连接时需要使用静态库 libpthread.a，所以在使用pthread_create()创建线程，以及调用 pthread_atfork()函数建立fork处理程序时，需要链接该库。<br/><br/>问题解决：<br/>&nbsp;&nbsp;&nbsp;&nbsp;在编译中要加 -lpthread参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;gcc thread.c -o thread -lpthread<br/>&nbsp;&nbsp;&nbsp;&nbsp;thread.c为你些的源文件，不要忘了加上头文件#include&lt;pthread.h&gt;
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [转]epoll 的主动式连接代码。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>