コード例 #1
0
ファイル: server.c プロジェクト: isongbo/MyCode
//线程函数中进行通信
//主要是接受客户端的消息,把消息分发给所有客户端
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);//如果正确读取到客户端发来的消息,直接将消息分发给所以在线客户即可
	}
}
コード例 #2
0
ファイル: chat_server.c プロジェクト: gitmanyi/first
//线程函数,用来接受客户端的消息,并把消息分发给所有的客户
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);
	}
}