Beispiel #1
0
/*处理与客户传输数据的线程*/
void *handleRequest(int *fd)
{
	int sockfd,ret,n;
	
	/*声明消息变量*/
	Message message;
	
	/*声明消息缓冲区*/
	char buf[MAX_LINE];
	
	//客户端的套接字地址
	struct sockaddr_in cliaddr;
	socklen_t len;
	sockfd = *fd;
	
	//获取客户的ip地址和端口号
	len = sizeof(cliaddr);
	if(getpeername(sockfd,(struct sockaddr *)&cliaddr,&len) < 0)
	{
		perror("getpeername error: ");
		printf("\n\n");
	}
	
	
	while(1){
		//接受用户发送的消息
		memset(buf,0,MAX_LINE);
		memset(&message,0,sizeof(message));
		n = readn(sockfd,buf,sizeof(message));
		if(n == sizeof(message)){
			//printf("已经接收了%d字节数据\n",n);
			//printf("消息类型%d\n",message.msgType);
		}
		if(n <= 0)
		{
			//关闭当前描述符,向客户端发送FIN
			fflush(stdout);
			close(sockfd);
			*fd = -1;
			//打印发送者的IP
			printf("来自%s的断开连接!\n\n",inet_ntoa(cliaddr.sin_addr));
			pthread_exit(NULL);//此线程退出
			return NULL;
		}
		
		memcpy(&message,buf,sizeof(message));
		message.sendAddr = cliaddr;
		
		//printf("消息类型%d\n",message.msgType);
		switch(message.msgType)
		{
			case REGISTER:{
				printf("\n来自%s注册申请!\n",inet_ntoa(message.sendAddr.sin_addr));
				ret = registerUser(&message,sockfd);//交由sqlite3数据库处理
				//if(ret == FAILED)break;
				memset(&message,0,sizeof(message));
				message.msgType = RESULT;
				message.msgRet = ret;
				printf("%s\n",stateMsg(ret));
				strcpy(message.content , stateMsg(ret));
				memset(buf,0,MAX_LINE);
				memcpy(buf,&message,sizeof(message));
				/*发送操作结果消息*/
				if(writen(sockfd,buf,sizeof(message)) < 0){
					perror("send error: ");
					printf("\n\n");
					exit(1);
				}
				printf("注册:%s\n", stateMsg(message.msgRet));
				break;
			}
			 case LOGIN:{
				User user;
				printf("来自%s的登录请求!\n",inet_ntoa(message.sendAddr.sin_addr));
				ret = loginUser(&message,sockfd,&user);//交由sqlite3数据库处理
				//if(ret == FAILED)break;//客户登录界面突然退出
				memset(&message,0,sizeof(message));
				message.msgType = RESULT;
				message.msgRet = ret;
				strcpy(message.content,stateMsg(ret));
				memset(buf,0,MAX_LINE);
				memcpy(buf,&message,sizeof(message));
				//发送操作结果消息
				if(writen(sockfd,buf,sizeof(message)) < 0){
					perror("send error: ");
					printf("\n\n");
					exit(1);
				}
				//printf("登录:%s\n",stateMsg(ret));
				if(ret == SUCCESS){
					//进入服务器聊天模式
					ret = enterChat(&sockfd);
					if(ret == FAILED){//客户enterChat界面突然退出
						printf("\033[;31m%s\033[0m退出登录\n",user.userName);
						userList = deleteNode(userList , &user);
						printf("来自%s的断开连接!\n\n",inet_ntoa(cliaddr.sin_addr));
						pthread_exit(NULL);//此线程退出
						return NULL;
					}
				}
				break;
			} 
			default:
				printf("unknown operator.\n");
				//close(sockfd);
				break;
		}
	}
	
	//关闭当前描述符,向客户端发送FIN
	close(sockfd);
	*fd = -1;
	return NULL;
}
Beispiel #2
0
void SignIn::on_passwordEdit_returnPressed() {

    // Próba nawiązania połączenia
    enterChat();
}
Beispiel #3
0
/** Przesłanie prośby o nawiązanie połączenia:
 *
 * W przypadku naciśnięcia klawisza ENTER
 *
 */
void SignIn::on_startChatButton_clicked() {

    // Próba nawiązania połączenia
    enterChat();
}
Beispiel #4
0
/** Przesłanie prośby o nawiązanie połączenia:
 *
 * W przypadku naciśnięcia klawisza ENTER
 *
 */
void SignIn::on_usernameEdit_returnPressed() {

    // Próba nawiązania połączenia
    enterChat();
}
Beispiel #5
0
/** Przesłanie prośby o nawiązanie połączenia:
 *
 * W przypadku naciśnięcia klawisza ENTER
 *
 */
void SignIn::on_ipAddressEdit_returnPressed() {

    // Próba nawiązania połączenia
    enterChat();
}
Beispiel #6
0
/*处理客户请求的线程*/
void* handleRequest(int *fd)
{
	int sockfd , ret , n;
	/*声明消息变量*/
	Message message;
	/*声明消息缓冲区*/
	char buf[MAX_LINE];

	sockfd = *fd;

	memset(buf , 0 , MAX_LINE);
	memset(&message , 0 , sizeof(message));

	//接收用户发送的消息
	n = recv(sockfd , buf , sizeof(buf)+1 , 0);
	if(n <= 0)
	{
		//关闭当前描述符,并清空描述符数组 
		fflush(stdout);
		close(sockfd);
		*fd = -1;
		printf("来自%s的退出请求!\n", inet_ntoa(message.sendAddr.sin_addr));		
		return NULL;			
	}//if				
	else{
		memcpy(&message , buf , sizeof(buf));				
		/*为每个客户操作链接创建一个线程*/					
		switch(message.msgType)
		{
		case REGISTER:						
			{
				printf("来自%s的注册请求!\n", inet_ntoa(message.sendAddr.sin_addr));
				ret = registerUser(&message , sockfd);
				memset(&message , 0 , sizeof(message));
				message.msgType = RESULT;
				message.msgRet = ret;
				strcpy(message.content , stateMsg(ret));		
				memset(buf , 0 , MAX_LINE);
				memcpy(buf , &message , sizeof(message));						
				/*发送操作结果消息*/
				send(sockfd , buf , sizeof(buf) , 0);
				printf("注册:%s\n", stateMsg(ret));	
				close(sockfd);
				*fd = -1;
				return NULL;
				break;
			}//case
		case LOGIN:
			{
				printf("来自%s的登陆请求!\n", inet_ntoa(message.sendAddr.sin_addr));
				ret = loginUser(&message , sockfd);							
				memset(&message , 0 , sizeof(message));
				message.msgType = RESULT;
				message.msgRet = ret;
				strcpy(message.content , stateMsg(ret));							
				memset(buf , 0 , MAX_LINE);
				memcpy(buf , &message , sizeof(message));						
				/*发送操作结果消息*/
				send(sockfd , buf , sizeof(buf) , 0);
				printf("登录:%s\n", stateMsg(ret));
				/*进入服务器处理聊天界面*/
				enterChat(&sockfd);												
				break;
			}//case			
		default:
			printf("unknown operation.\n");
			break;
		}//switch					
	}//else				

	close(sockfd);
	*fd = -1;
	return NULL;
}