//线程函数中进行通信 //主要是接受客户端的消息,把消息分发给所有客户端 void * service_thread(void *p){ char name[30] = {}; if(recv(c[size].fds,name,sizeof(name),0)>0){ //接收到客户端的昵称 strcpy(c[size].name,name); } size++; //先群发一条提示,告诉所有客户端某某进入聊天室 char tishi[100] = {}; sprintf(tishi,"热烈欢迎 %s 进入本聊天室\n",c[size-1].name); //用来群发消息的函数 sendMsgToAll(tishi); int fd = *(int*)p; printf("pthread = %d\n",fd); //通信,接收消息,分发消息 while(1){ char buf[100] = {}; if(recv(fd,buf,sizeof(buf),0) == 0){ //返回0表示客户端退出连接 printf("fd = %dquit\n",fd);//test //清除这个客户端在数组中的信息 int i,j; char name[20] = {}; int flag = 1;//开关标志 for(i=0;i<size;i++){ if(c[i].fds == fd){ strcpy(name,c[i].name);//记录要删除客户端的昵称 i++;//防止数组溢出 flag = 0; } if(flag!=1){ c[i-1].fds = c[i].fds;//覆盖 strcpy(c[i-1].name,c[i].name); } } c[i].fds = 0;//覆盖最后一个数组元素值 strcpy(c[i].name,"");//数组赋值空串 size--; printf("quit->fd=%dquit\n",fd); char msg[100] = {}; sprintf(msg,"欢送 %s 离开本聊天室\n",name); //将退出提示发送给所有人 sendMsgToAll(msg); close(fd);//关闭描述符 return;//客户端退出之后,结束线程 } sendMsgToAll(buf);//如果正确读取到客户端发来的消息,直接将消息分发给所以在线客户即可 } }
//线程函数,用来接受客户端的消息,并把消息分发给所有的客户 void * service_thread(void* p){ int m_id = 0; char name[20]={}; if(recv(c[size].fds,name,sizeof(name),0)>0){//接受到名字 strcpy(c[size].name,name); } m_id = size; size++; //进入线程之后,先群发一条提示,提示某某客户端连接上来 char tishi[100]={}; //sprintf(tishi,"\033[1;32;41m热烈欢迎 %s 登录本聊天室..\033[0m",c[size-1].name); sprintf(tishi,"热烈欢迎 %s 登录本聊天室..",c[size-1].name); sendMsgToAll(tishi); int fd = *(int*)p; printf("pthread=%d\n",fd);//线程所对应的客户端的描述符 //通信,接受消息,分发消息 while(1){ char buf[100]={}; if(recv(fd,buf,sizeof(buf),0)<=0){//接受信息 printf("fd=%dquit\n",fd);//recv函数返回小于0,则 //表示有客户端断开,打印quit //之后将退出的客户端的socket描述符重新置成0 int i; for(i=0;i<size;i++){ if(c[i].fds==fd){ c[i].fds=0; break; } } printf("quit->fd=%dquit\n",fd);//打印fd->quit退出 char msg[100]={}; //sprintf(msg,"\033[1;40;32m欢送 %s 离开聊天室,再见..\033[0m",c[i].name); sprintf(msg,"欢送 %s 离开聊天室,再见..",c[i].name); //将退出消息发给所有聊天的人 //将这些内容写到一个函数中 sendMsgToAll(msg); return ;//某客户端退出之后,结束线程 }//正确读到数据之后 if(strncmp(buf,"TF",2) == 0){//接收文件 if(recv(fd,filename,sizeof(filename),0)<0){//接收文件名 perror("recv filename"); /*char fail[100] = {}; sprintf(fail,"服务器接收文件%s失败",filename); send(fd,fail,strlen(fail),0);//把错误发给客户端*/ printf("服务器接收文件%s失败",filename); continue; } //开始接收文件内容 FILE* fp = fopen(filename,"wb"); if(fp == NULL){ perror("open filename "); printf("服务器接收文件%s失败",filename); continue; } char buff[4096] = {0}; int res = 0; int flag = 1; while((res=recv(fd,buff,4096,0)) == 4096){ if(res < 0){ perror("recv "); printf("服务器接收文件%s失败",filename); flag = 0; break; } int writelen = fwrite(buff,sizeof(char),res,fp);/////////////// if(writelen < res){ perror("fwrite "); printf("服务器接收文件%s失败",filename); flag = 0; break; } bzero(buff,4096);//清零数组 } if( res>0 ){ int writelen = fwrite(buff,sizeof(char),res,fp); if(writelen < res){ perror("fwrite "); printf("服务器接收文件%s失败",filename); flag = 0; break; } } if(flag!=1){ fclose(fp); continue; } printf("成功接收到客户端的文件\n"); fclose(fp); } else{ char msg[100] = {0}; sprintf(msg,"%s 说: %s",c[m_id].name,buf); sendMsgToAll(msg); } bzero(buf,100); } }