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