/*处理与客户传输数据的线程*/ 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; }
void SignIn::on_passwordEdit_returnPressed() { // Próba nawiązania połączenia enterChat(); }
/** 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(); }
/** 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(); }
/** 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(); }
/*处理客户请求的线程*/ 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; }