/*Function of chatting with someone*/ void chat_with_one(struct send_thread_data *send_data){ struct packet sendline,recvline; show_user_list(send_data); char name[MAXNAME]; memset(&name,0,sizeof(name)); char msg[MAXDATA]; //printf("name is %s\n",send_data->send_name); //printf("choose one person to chat with:"); wclear(local_win_down); wborder(local_win_down,'|',' ','-',' ','+',' ','+',' '); mvwprintw(local_win_down,1,1,"choose one person to chat with:"); //wrefresh(local_win_down); mvwscanw(local_win_down,2,2,"%64s%*[^\n]",name); wrefresh(local_win_down); //sendline->service=SERVICE_ASKISONLINE; //sendline->status=STATUS_REQUEST; //sendline->send_name=send_data->send_name; //sendline->recv_name=name; packetInit(&sendline,SERVICE_ASKISONLINE,STATUS_REQUEST,send_data->send_name,name,NULL); send(send_data->sockfd,&sendline,sizeof(sendline),0); //printf("recv!!!!!!\n"); //if(recv(send_data->sockfd,&recvline,sizeof(recvline),0)<0){ // perror("The server terminated prematurely"); // return; //} //printf("recv success!!!!\n"); usleep(100000); if(!cantalk){ //printf("user is not online\n"); //assert(!cantalk); if(linetag==(2*row/3-1)){ linetag=1; wclear(local_win_up); wborder(local_win_up,'|','|','-','-','+','+','+','+'); } mvwprintw(local_win_up,linetag,1,"user is not online"); wrefresh(local_win_up); return; } else if(cantalk){ memset(&msg,0,sizeof(msg)); while(1){ //printf("%s : ",((struct send_thread_data *)send_data)->send_name); memset(&msg,0,sizeof(msg)); wclear(local_win_down); wborder(local_win_down,'|',' ','-',' ','+',' ','+',' '); mvwprintw(local_win_down,1,1,"You are chatting with %s",name); //printf("You are chatting with %s\n",name); wrefresh(local_win_down); mvwprintw(local_win_down,2,1,"%s:", ((struct send_thread_data*)send_data)->send_name); //if(Get_Key()==12) break; wrefresh(local_win_down); if(getchar()=='') return; mvwscanw(local_win_down,2, strlen(((struct send_thread_data*)send_data)->send_name)+2,"%[^\n]",msg); //if(!strcmp(msg,"")) // return; //char temp; //int len; //while(true){ // len=strlen(msg); // temp=getchar(); // if(temp!='\n'&&temp!=EOF) // msg[temp]=temp; //} wrefresh(local_win_down); if(!strcmp(msg ,"")) continue; if(linetag==2*row/3-1){ linetag=1; wclear(local_win_up); wborder(local_win_up,'|','|','-','-','+','+','+','+'); } mvwprintw(local_win_up,linetag,1,"%s:%s", ((struct send_thread_data*)send_data)->send_name,msg); linetag++; wrefresh(local_win_up); //wrefresh(local_win_down); //fgets(msg,MAXDATA,stdin); //msg[strlen(msg)-1]='\0'; packetInit(&sendline,SERVICE_MESSAGE,STATUS_REQUEST,send_data->send_name,name,msg); send(send_data->sockfd,&sendline,sizeof(sendline),0); //if(Get_Key()==12){ //assert(0); // return; //} //if(getchar()=='') // return; } } }
/*handle send*/ void *send_handle(void *threadarg){ //char func='0'; struct send_thread_data *send_data; char func[2]; memset(&func,0,sizeof(func)); send_data=(struct send_thread_data *)threadarg; //system("clear"); while(1){ //printf("Hello,%s\n",send_data->send_name); //printf("Function:\n"); //printf("1.chat with one person;\n"); //printf("2.chat with all the people online;\n"); //printf("3.show all the people online;\n"); //printf("4.logout;\n"); memset(&func,0,sizeof(func)); wclear(local_win_down); wclear(local_win_up); wborder(local_win_up,'|','|','-','-','+','+','+','+'); wborder(local_win_down,'|',' ','-',' ','+',' ','+',' '); mvwprintw(local_win_right,1,1,"Hello,%s",send_data->send_name); mvwprintw(local_win_right,2,1,"Function"); mvwprintw(local_win_right,3,1,"1.chat with one"); mvwprintw(local_win_right,4,1,"2.chat with all"); mvwprintw(local_win_right,5,1,"3.update namelist"); mvwprintw(local_win_right,6,1,"4.logout"); mvwprintw(local_win_right,7,1,"input to return"); mvwprintw(local_win_right,8,1,"=control+B"); wrefresh(local_win_right); mvwprintw(local_win_down,1,1,"fuc:"); mvwscanw(local_win_down,1,6,"%2s%*[^\n]",func); wrefresh(local_win_down); switch(func[0]){ case '1': {//printf("chat name: %s\n",send_data->send_name); //wclear(local_win_down); //mvwprintw(local_win_down,1,1,"chat name:%s\n",send_data->send_name); //wrefresh(local_win_down); chat_with_one(send_data); break; } case '2': {chat_with_all(send_data);break;} case '3': {show_user_list(send_data);break;} case '4': { logout(send_data); wclear(local_win_down); wclear(local_win_left); wclear(local_win_up); wclear(local_win_right); delwin(local_win_down); delwin(local_win_up); delwin(local_win_right); delwin(local_win_left); endwin(); exit(0); break;} default : { //printf("input error\n"); wclear(local_win_down); wborder(local_win_down,'|',' ','-',' ','+',' ','+',' '); mvwprintw(local_win_down,2,1,"input error"); wrefresh(local_win_down); getchar(); } } } }
void main(){ int listenSock, connSock; struct sockaddr_in serv_addr, client_addr; int clientAddrLenght; User user[100]; char tmp[100]; int max_user; char mesg[LEN]; char mesg2[LEN]; char buff[LEN]="11|"; int t,n; int recvBytes,sentBytes; fd_set readfds,allset; int i, maxi,sockfd; int rv; struct pollfd client[30]; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(5556); if((listenSock = socket(AF_INET, SOCK_STREAM, 0)) == -1){ printf("\nTao socket loi!!\n"); return; } if(bind(listenSock, (struct sockaddr *) &serv_addr,sizeof(serv_addr))<0) { printf("\nBind loi!!\n"); return; } if(listen(listenSock, 10) == -1) { printf("\nListen loi!!\n"); return; } for ( i = 1; i < 30; i++){ client[i].fd=-1; } client[0].fd = listenSock; client[0].events = POLLRDNORM; max_user= take_user(user); while(1){ rv = poll(client, 30,3); //Number of client = 30, time out=3 if(client[0].revents & POLLRDNORM){ clientAddrLenght=sizeof(client_addr); connSock = accept(listenSock, (struct sockaddr *) &client_addr, (socklen_t*)&clientAddrLenght); for(i=1;i < 30;i++){ if(client[i].fd < 0){ client[i].fd = connSock; break; } }//end for client[i].events = POLLRDNORM; if(--rv <= 0) //no more readable descriptor. Decrement before return continue; }//end if for(i=1;i<30;i++){ if((sockfd = client[i].fd) <0) continue; if(client[i].revents & (POLLRDNORM | POLLERR)){ strcpy(mesg,""); n=recv(sockfd, mesg, LEN, 0); printf("\nXau nhan tu Client: %s",mesg ); mesg[n]='\0'; if((n)==0){ close(sockfd); client[i].fd = -1; for ( i = 0; i < max_user; i++){ if(user[i].sockfd==sockfd){ user[i].status=0; break; } } }else{ // printf("\nXau nhan tu Client: %s",mesg ); t=check_mark(mesg); if(t == 0) max_user = sign_up(sockfd,mesg,user,max_user); if(t == 1) { login(sockfd,mesg,user,max_user); } if(t == 2) show_user_list(sockfd,user,max_user); if(t == 3) play_request(sockfd,mesg,user,max_user); if(t == 4) accept_request(sockfd,mesg,user,max_user); if(t == 5) not_accept_request(sockfd,mesg,user,max_user); if(t == 6) playing(sockfd,mesg,user,max_user); if(t == 7) stop_play(sockfd,mesg,user,max_user); if(t == 8) log_out(sockfd,user,max_user); } if(--rv <= 0) break; } } }//end while }