|
|
|
|
|
用winsock就成了,便一个简单的程序还是没问题的
|
|
|
是的,我用的,一个服务器和一个客户端的通信已经可以了,可是我想多开两个客户端同时连接到服务器上并能同时往服务器上发消息,感觉就是要一个个的来才行,不能同时进行。
哪个高手能指点一下啊 |
|
|
不用多线程,采用SELECT IO 模型是可以的,类似于重叠IO操作。
你看看SELECT 的设置有没有问题。FD_SET()等函数的使用是不是正确呀? |
|
|
这个是我从unix书上改下来的,请大家看看,也感觉这思路不怎么对,我估计是不是处理客户端消息上有问题。 几个同时能连接上,就是不能同时的发消息。 //server #include <stdio.h> #include <stdlib.h> #include <Winsock2.h> #include <string.h> #include <io.h> #define MAXLINE 100 #define SERV_PORT 7001 #define LISTENQ 10 #define FD_SETSIZE 20 //int writen(int fd,const void *vptr,size_t n); //int readline(int fd,void *vptr,size_t n); int main(int argc,char * aregv) { int i,maxi,maxfd;//listenfd,connfd,sockfd; SOCKET listenfd,connfd,sockfd; int nready,client[FD_SETSIZE]; int n; int testl; // int iLength; int flag=1; char line[MAXLINE]; int clilen; struct sockaddr_in cli_addr,serv_addr; struct timeval timeout; //char msg[]="hello"; fd_set rset,allset,wset,excset; WSADATA wsaData; timeout.tv_sec=0; timeout.tv_usec=5; if (WSAStartup (WINSOCK_VERSION, &wsaData) != 0) { printf("init failure!\n"); return 1; } listenfd=socket(AF_INET,SOCK_STREAM,0);//Greate socket if(listenfd<0) { printf("socket error\n"); exit(1); } memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERV_PORT); /* if (ioctlsocket(listenfd, FIONBIO, &flag) != 0) { printf("set Error"); closesocket(listenfd); } */ if(bind(listenfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)//bind { printf("bind error\n"); exit(0); } if(listen(listenfd,LISTENQ)==-1) { printf("listen error\n"); exit(0); } maxfd=listenfd; maxi=-1; for(i=0;i<FD_SETSIZE;i++) client[i]=-1; FD_ZERO(&allset); FD_SET(listenfd,&allset); for(;;) { //line[0]='\0'; rset=allset; nready=select(maxfd+1,&rset,NULL,NULL,&timeout);//wait event occur if(nready<0) { printf("select error\n"); exit(0); } // printf("--->%d\n",nready); //FD_SET(listenfd,&rset); if(FD_ISSET(listenfd,&rset)) { clilen=sizeof(cli_addr); //new clinet connection connfd=accept(listenfd,(struct sockaddr *)&cli_addr,&clilen); if(connfd<0) { printf("connect error\n"); return -1; } printf("recevied a connetion from %s\n",inet_ntoa(cli_addr.sin_addr)); for(i=1;i<FD_SETSIZE;i++) { if(client[i]<0) { client[i]=connfd; break; } } printf("%d\n",client[1]); printf("%d\n",client[2]); printf("%d\n",client[3]); printf("%d\n",client[4]); if(i==FD_SETSIZE) { printf("too many clients\n"); exit(1); } FD_SET(connfd,&rset); if(connfd>maxfd) maxfd=connfd; if(i>maxi) maxi=i; } //for(i = 0;i <= 9;i++) if(--nready <= 0) //不停的等待连接 continue; for(i =0;i <= maxi;i++) { if((sockfd = client[i])<0) continue; FD_SET(sockfd,&rset); if(FD_ISSET(sockfd,&rset)){//sockfd 有没有被设置 if((n = recv(sockfd,line,MAXLINE,0))!=-1) { for(i = 0;i < n;i++) { if(line[i]!= '\0') printf("%c",line[i]); } line[i]='\0'; printf("\n"); testl=send(sockfd,line,strlen(line),0); } else{ closesocket(sockfd); FD_CLR(sockfd,&allset); client[i] = -1; } // printf("\n"); /* else writen(sockfd,line,n); */ } //closesocket(sockfd); //服务器关闭了连接,等待下一个连接。 /* if(--nready <=0) break; */ } } WSACleanup(); return 0; } /* int readline(int fd,void *vptr,size_t n) { size_t nleft; size_t nread; char *ptr; ptr=vptr; nleft=n; while(nleft>0) { if((nread=read(fd,ptr,nleft))<0) { if(errno==EINTR) nread=0; else return-1; } else if(nread==0) break; nleft-=nread; ptr+=nread; } return (n-nleft); } int writen(int fd,const void *vptr,size_t n) { const char *ptr; size_t nleft; size_t nwritten; ptr=vptr; nleft=n; while(nleft>0){ if((nwritten=write(fd,ptr,nleft))<=0){ if(errno==EINTR) nwritten=0; else return -1; } nleft-=nwritten; ptr+=nwritten; } return n; }*/ |
|
|
up:(
|
|
|
请不要把代码弄上去
可以简明说说的 |
|
|
up
|
|
|
客户端多个能同时连而服务器端不能同时处理
|
|
|
帮你up
|
|
|
如果你是多cpu的机器当然可以同时进行。否则,肯定是一个一个的来处理。
如果你想更具体的了解,请看操作系统原理。 |
|
|
服务器要多cpu?不会吧,一个cpu只能满足一个申请?别人的聊天室程序是怎么做的呢,装一下不是就能大家聊的吗?
|
|