读书人

关于在同一台机子上运行聊天室的服务器

发布时间: 2012-04-22 18:34:46 作者: rapoo

关于在同一台机子上运行聊天室的服务器和客户端程序(急求!!)
我用C和SOCKET写了一个简单的多人聊天室(参考了网上别人的源代码),然后我在同一台机子上先运行服务器程序,然后运行客户端程序,结果发现客户端发送的信息没有发送的服务器上,也就导致服务器接受到的信息无法转发给各个客户端,求高手解释,现在上源码(我在2个源程序里面都附加了写没意思的语句printf主要是用来确定客户端的信息有没有发送到服务器)

/* 服务器 */

C/C++ code
#include <stdio.h>#include <sys/socket.h>#include <sys/types.h>#include <pthread.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/ioctl.h>#include <sys/wait.h>//person number who is chating   #define CHATNUM 8int sd[CHATNUM];// server send message that one client send to every client that online  void sendMsgToClient(int clientSocket){  char name[30];  char buffer[2048];  char temp[3000];  int i=0;  int returnValue=-1;  //get client's name  if((returnValue=recv(clientSocket,name,20,0))==-1)  {      perror("recv");      exit(1);  }  name[returnValue]=':';  name[returnValue]='\0';  printf("%s\n",name);  while(1)  {     //get the imformation that client send     returnValue=recv(clientSocket,buffer,1024,0);     if(returnValue==-1)     {       perror("recv");       exit(1);     }     //the client was offline     else if( returnValue==0)     {         printf("%sbye",name);         break;     }     /*      * find a socket that attact to client onlin      * send message to client online      */     for(i=0;i<CHATNUM;i++)     {         if(sd[i]!=-1)         {           temp[0]='\0';           strcat(temp,name);           strcat(temp,buffer);           printf("%s\n",temp);           if(send(sd[i],temp,strlen(temp),0)==-1)           {              perror("send");              exit(1);           }         }      }  }  close(clientSocket);  for(i=0;i<CHATNUM;i++)  {      if(sd[i]==clientSocket)      {         sd[i]=-1;      }  }  pthread_exit(NULL);}int main(){  int i=0;  int localSocket=0;  int clientSocket=0;  pthread_t pd;  struct sockaddr_in server_ip;  struct sockaddr_in client_ip;  socklen_t client_addr_size=0;  //init socket  memset(sd,-1,sizeof(sd));  if((localSocket=socket(AF_INET,SOCK_STREAM,0))==-1)  {      perror("socket");      exit(1);  }  //set IP imformation  server_ip.sin_family=AF_INET;  server_ip.sin_port=htons(12345);  server_ip.sin_addr.s_addr=INADDR_ANY;  //bzero(&(server_ip.sin_zero),8);  if(bind(localSocket,(struct sockaddr *) &server_ip,\  sizeof(struct sockaddr ))==-1)  {     perror("bind");     exit(1);  }  if(listen(localSocket,10)==-1)  {     perror("listen");     exit(1);  }  while(1)  {       client_addr_size=sizeof(struct sockaddr_in);       if((clientSocket=accept(localSocket,(struct sockaddr *) &client_ip,\       &client_addr_size))==-1)       {           perror("accept");           exit(1);       }       //find a free socket       while(sd[i]==-1)       {          i=(i+1)%CHATNUM;          continue;       }       sd[i]=clientSocket;       pthread_create(&pd,NULL,(void *) sendMsgToClient,(int *)clientSocket);  }  return 0;}



/*客户端*/
C/C++ code
#include <stdio.h>#include <string.h>#include <errno.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <sys/time.h>#include <sys/ioctl.h>#include <sys/un.h>#include <netinet/in.h>#include <pthread.h>void dellMsgFromServer(int sd){  char recvMsg[2000];  int recvMsgLen=0;  while(1)  {       if((recvMsgLen=recv(sd,recvMsg,1024,0))<0)       {          perror("recv");          exit(1);       }       recvMsg[recvMsgLen]='\0';       printf("%s\n",recvMsg);  }  pthread_exit(NULL);}int main(){  char input[2000];  char clientName[20];  int sd;  pthread_t pd;  // set the server address  struct sockaddr_in client_addr;  client_addr.sin_family=AF_INET;  client_addr.sin_port=htons(12345);  if(inet_aton("127.0.0.1",&client_addr.sin_addr)==0)  {     perror("inet_aton");     exit(1);  }  bzero(&(client_addr.sin_zero),8);  if((sd=socket(AF_INET,SOCK_STREAM,0))<0)  {      perror("socket");      exit(1);  }  if(connect(sd,(struct sockaddr *)&client_addr,\  sizeof(struct sockaddr_in))!=0)  {      perror("connect");      exit(1);  }  printf("please input your name,note:your name lenth not over 20 byte\n");  scanf("%s",clientName);  if(send(sd,clientName,strlen(clientName),0)<0)  {     perror("send");     exit(1);  }  if(pthread_create(&pd,NULL,(void *)dellMsgFromServer,sd)!=0)  {      perror("pthread_create");      exit(1);  }  printf("pthread_create is success");  while(1)  {      scanf("%s",input);      if(send(sd,input,strlen(input),0)<0)      {           perror("send");           exit(1);      }      sleep(1);  }  close(sd);  return 0;} 



[解决办法]
服务器程序中的下面部分出现死循环,在第一个客户端进入的时候,在此处一直循环,始终不能调用下面的sd[i]=clientSocket;所以你的客户端数组永远都是-1.其实数据已经发送到了服务器。

//find a free socket
while(sd[i]==-1)
{
i=(i+1)%CHATNUM;
continue;
}

你的代码功能没太细看,至少注释了上面的while,服务器端有反应了,能打印出客户端发送的名字和输信息。
学学GDB,调试起来,很容易定位问题的。
[解决办法]
你在哪里找的源码啊,你这个程序可以编译通过吗?
一眼看上去就很多毛病,你先把这几个地方改改:
1.线程调用
这个能通过编译吗?参数格式就不对吧?
C/C++ code
pthread_create(&pd,NULL,(void *) sendMsgToClient,(int *)clientSocket); 

读书人网 >UNIXLINUX

热点推荐