<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://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://jackxiang.com/post//</link>
<title><![CDATA[[个人原创]C++学习之多进程并发服务器实例学习]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Fri, 19 Aug 2011 09:14:53 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; 近来学习了一下C++在Linux下的多进程并发服务器的模型，听专搞C++服务器的兄弟们说这个也不行，需要Epoll，Select模型，还需要FiFo队列的结合，链表，共享内存等同时起多个进程后循环去共享内存里去取数据，去循环的读FIFO才会高效更有效形成一个更高更强更快的多并发的服务器，本质就是异步服务。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我也想学，但苦于基础不好，于是否给我顺手抓了一本Unix网络编程 实用技术与实例分析，这一章节，代码错误较多，还好有兄弟帮忙调试，在此感谢，看来还是需要把书写好才能省下不少时间啊，写书的人或排版的也许太匆忙罢，和兄弟沟通后说错误多是为了让初学者多调试，写错了也有理由，我倒。<br/>近来事情不多也就了解了下他们的架构，画画图什么的，其实Mysql长连接这块我觉得应该做进PHP中，现在PHP都FastCGI开自己的端口了，长连接也做进去不是难事哇，期待加到下一个PHP扩展中，直接整成可配置的连接池得了，上图：<br/><br/><a href="http://jackxiang.com/attachment.php?fid=193" target="_blank"><img src="http://jackxiang.com/attachment.php?fid=193" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>原始Edraw Max 源文件：<a href="attachment.php?fid=194">点击这里下载文件</a><br/><br/>multiproserver.cpp<br/><textarea name="code" class="html" rows="15" cols="100">

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;sys/wait.h&gt;
#include &lt;string.h&gt;

#define&nbsp;&nbsp;PORT&nbsp;&nbsp;1234
#define&nbsp;&nbsp;BACKLOG&nbsp;&nbsp;10
#define MAXDATASIZE&nbsp;&nbsp;1000
void process_cli(int connectfd, struct sockaddr_in client);
int main(void)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; listenfd, connectfd;
&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;&nbsp;pid;
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in server,client;
&nbsp;&nbsp;&nbsp;&nbsp;int sin_size;

&nbsp;&nbsp;&nbsp;&nbsp;/* Create TCP Socket */
&nbsp;&nbsp;&nbsp;&nbsp;if((listenfd=socket(AF_INET, SOCK_STREAM, 0))==-1)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;Create socket failed&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;int opt = SO_REUSEADDR;
&nbsp;&nbsp;&nbsp;&nbsp;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof(opt));

&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;server, sizeof(server));
&nbsp;&nbsp;&nbsp;&nbsp;server.sin_family = AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;server.sin_port = htons(PORT);
&nbsp;&nbsp;&nbsp;&nbsp;server.sin_addr.s_addr = htonl(INADDR_ANY);

&nbsp;&nbsp;&nbsp;&nbsp;if (bind(listenfd, (struct sockaddr *)&amp;server, sizeof(struct sockaddr)) == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;Bind error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;if (listen(listenfd, BACKLOG) == -1) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;listen error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;sin_size = sizeof(struct sockaddr_in);

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

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((connectfd = accept(listenfd, (struct sockaddr *)&amp;client, (socklen_t *)&amp;sin_size)) == -1) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;accept error&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((pid=fork())&gt;0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* parent process */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(connectfd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (pid==0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*child process*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(listenfd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process_cli(connectfd, client);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;fork error&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;/*while()*/
&nbsp;&nbsp;&nbsp;&nbsp;close(listenfd);&nbsp;&nbsp; /* close listenfd */
&#125;

void process_cli(int connectfd, struct sockaddr_in client) 
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; num;
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp; recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[MAXDATASIZE];
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;You got a connection from %s.&#92;n&quot;, inet_ntoa(client.sin_addr));
&nbsp;&nbsp;&nbsp;&nbsp;num = recv(connectfd, cli_name, MAXDATASIZE, 0);
&nbsp;&nbsp;&nbsp;&nbsp;if (num == 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(connectfd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;cllient disconnected.&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;cli_name[num - 2] = &#039;&#92;0&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Client name is %s.&#92;n&quot;,cli_name);
&nbsp;&nbsp;&nbsp;&nbsp;while (num = recv(connectfd, recvbuf, MAXDATASIZE,0)) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recvbuf[num] = &#039;&#92;0&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Received client (%s) message: %s&quot;, cli_name, recvbuf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i &lt; num ; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendbuf[i] = recvbuf[num - i - 1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendbuf[num] = &#039;&#92;0&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send(connectfd, sendbuf, strlen(sendbuf), 0);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;close(connectfd);
&#125;



</textarea><br/><br/>测试情况，就是把输入字符倒置后发送给客户端：<br/><textarea name="code" class="html" rows="15" cols="100">
/home/jackxiang/muti_study# make multiproserver&nbsp;&nbsp;
 ./multiproserver 
Client name is jackxiang.
Received client (jackxiang) message: helo server!
telnet连接：
telnet localhost 1234
jackxiang
helo server!&nbsp;&nbsp;
!revres oleh
</textarea><br/><br/>PPT下载，来自百度文库：<br/><a href="attachment.php?fid=191">点击这里下载文件</a><br/>按这个PPT编写的代码下载：<br/><a href="attachment.php?fid=190">点击这里下载文件</a><br/><br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [个人原创]C++学习之多进程并发服务器实例学习]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>