LoveUnix » 编程开发 & Rational » 拜球各位大哥指导(网络多客户编程)
让LU留住您的每

一天 让LU博客留住您的每一天
2005-4-28 22:35 zp_liang
小弟我最近要用C编一个多客户的并行程序,可现在手头上的资料要不就是基于LINUX的,要不就是基于C++的,仿照linux编了一个,可好象不是并行的,如果两个客户同时访问一个数据库的情况也不行,我把它简化了一下(这里放不下,我就把它对齐了),请各位多多指导&#33;如果各位有相似的例子的话,还请参考一下.<br />#include &quot;stdafx.h&quot;<br />#include &quot;SOEHead.h&quot;<br /><br /> <br />int main(int argc, char* argv[])<br />{        <br />    WSADATA WSAData;<br />        WORD version=MAKEWORD(2,0);<br />        int ret=WSAStartup(version,&amp;WSAData);<br />        if(ret&#33;=0)<br />        printf(&quot;Initilize Error&#33;\n&quot;);<br />    int error=0;<br />    //SOCKET acp;<br />    qutype buffer;//队列<br />    SOCKET ClientSocket;<br />        SOCKET SeverSocket;<br />    SOCKADDR_IN local_addr;<br />        SOCKADDR sockaddr;<br />        int fd;<br />        fd_set readfds;<br />        //int soc;<br />        char msg[]=&quot;hi,I am server&quot;;<br />        char buf[256];<br />        SeverSocket=socket(AF_INET,SOCK_STREAM,0);<br />          int socklen=sizeof(sockaddr);<br />    local_addr.sin_family=AF_INET;<br />        //local_addr.sin_addr.S_un.S_addr=INADDR_ANY;<br />        local_addr.sin_addr.S_un.S_addr = inet_addr(&quot;127.0.0.1&quot;);<br />        local_addr.sin_port=htons(PORTNUM);<br />        <br />        ret=bind(SeverSocket,(LPSOCKADDR)&amp;local_addr,sizeof(local_addr));<br />        if(ret==SOCKET_ERROR)<br />        {<br />                return FALSE;<br />        }<br />        if(listen(SeverSocket,5)&lt;0)<br />        {<br />                perror(&quot;listen&quot;);<br />                exit(1);<br />        }<br />        <br />        InitiateQueue(&amp;buffer);<br />    AppendQueue(&amp;buffer,SeverSocket);<br />        <br />    while(1)<br />                {<br />                   FD_ZERO(&amp;readfds);<br />                   FD_SET (SeverSocket,&amp;readfds);<br />                   for(fd=1;fd&lt;MAXNUM;fd++)<br />                   {<br />                           if(buffer.queue[fd]&gt;0)<br />                                   FD_SET(buffer.queue[fd],&amp;readfds);<br />                   }<br />                   if(&#33;select(MAXNUM,&amp;readfds,NULL,NULL,NULL))<br />                           continue;<br />                  for(fd=0;fd&lt;MAXNUM;fd++)<br />                  {<br />                          if(FD_ISSET(buffer.queue[fd],&amp;readfds))<br />                          {<br />                                  if(SeverSocket==buffer.queue[fd])<br />                                  {<br />                if((ClientSocket=accept(SeverSocket,&amp;sockaddr,&amp;socklen))&lt;0)<br />                perror(&quot;accept&quot;);<br />                 printf(&quot;%d is a servesocket\n&quot;,buffer.queue[fd]);<br />                if(buffer.rear&lt;(MAXNUM-1))<br />                {<br />                 AppendQueue(&amp;buffer,ClientSocket);<br />                }<br />                else<br />                printf(&quot;sorry,the queue is full&#33;\n&quot;);<br />                                         <br />                }<br />                else<br />                {<br />                 memset(buf,0,256);<br />                if(recv(buffer.queue[fd],buf,sizeof(buf),NULL)&lt;=0)<br />                {<br />                 printf(&quot;connect closed\n&quot;);<br />                 buffer.queue[fd]=-1;<br />                }<br />                 else<br />                printf(&quot;%s&quot;,buf);<br />                if(send(buffer.queue[fd],buf,strlen(buf),0)&lt;0)<br />                {<br />                 perror(&quot;send&quot;);<br />                exit(1);<br />                }<br />                printf(&quot;close the socket\n&quot;);<br />                close(buffer.queue[fd]);<br />                DeleteQueue(&amp;buffer,fd);          <br />                                  }<br />                          }        <br />                  }<br />        }<br />        close(SeverSocket);<br />}<br />其中队列的定义在下面:<br />#include &quot;stdafx.h&quot;<br />#include &quot;SOEHead.h&quot;<br />typedef struct <br />        {<br />                elemtype queue[MAXNUM];<br />                int front;<br />                int rear;<br />        }qutype;<br />int AppendQueue(qutype *q,elemtype x)<br />        {<br />                if(q-&gt;rear&gt;=MAXNUM-1)<br />                {<br />                        printf(&quot;queue is full&#33;\n&quot;);<br />                        return 0;<br />                }<br />                q-&gt;queue[++q-&gt;rear]=x;<br />                return 0;<br />        }<br />int  DeleteQueue(qutype *q,int fd)<br />        {<br />            int i;<br />                if(q-&gt;front==q-&gt;rear)<br />                {<br />                        printf(&quot;queue is empty\n&quot;);<br />                        return NULL;<br />                }<br />                else<br />                {<br />                        for(i=fd;i&lt;MAXNUM;i++)<br />                                q-&gt;queue[fd]=q-&gt;queue[fd+1];<br />                        q-&gt;rear=q-&gt;rear-1;<br /><br />                }<br />                return 0;<br />        }<br /><br />void InitiateQueue(qutype *q)<br />        {<br />                q-&gt;front=-1;<br />                q-&gt;rear=-1;<br />                for(int i=0;i&lt;MAXNUM-1;i++)<br />                {<br />                        q-&gt;queue[i]=-1;<br />                }<br />        }<br />

2005-4-29 09:34 jxppp
看的头大.... <!--emo&:wacko:--><img src='style_emoticons/default/wacko.gif' border='0' style='vertical-align:middle' alt='wacko.gif' /><!--endemo-->

2005-4-29 09:36 carol
楼主编辑一下,用Code功能把代码圈起来,就可以缩进了

2005-4-29 11:34 wuhu
你说下思想吧,我想愿意看code的人不是太多哦&#33;

2005-11-13 15:46 jackyzhu_001
看看,学习!顶一下

2005-11-14 09:22 zhangxiangod
你这队列是不是有问题
1。怎么看的总那么向栈,添加时++q->rear,删除时q->rear=q->rear-1;
2。能解释下               
                 for(i=fd;i<MAXNUM;i++)
               q->queue[fd]=q->queue[fd+1];
               q->rear=q->rear-1;
是怎么回事吗/

还有,你怎么没有对进程的fork操作,如果要是并行的执行不多进程或多线程可以吗 /

[[i] 本帖最后由 zhangxiangod 于 2005-11-14 09:31 编辑 [/i]]

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.