예제 #1
0
void chat_interface(int new_fd)
{
    clear();
    refresh();
    
    int flag = 3;

    int ch;

    WINDOW *new_window1, *new_window2, *new_window5;

    setlocale(LC_ALL, "");
    //initscr();

    //keypad(ch_window4, 1);

    new_window1 = newwin(3, 91,0,22);
    ch_window2 = newwin(13, 68,4,23);
    new_window5 = newwin(15, 70,3,22);
    ch_window3 = newwin(6, 70,18,22);
    ch_window4 = newwin(21, 21,3,92);
    ch_window5 = newwin(6, 20,0,2);
    ch_window1 = newwin(18, 20,6,2);

    box(new_window1, 0, 0);
    box(ch_window4, 0, 0);
    box(ch_window5, 0, 0);
    box(new_window5, 0, 0);
    box(ch_window1, 0, 0);
    box(ch_window2, ' ', ' ');
    box(ch_window3, 0, 0);

    mvwaddstr(ch_window1, 1, 5, "ONLINE-USER");
    mvwaddstr(ch_window1, 2, 5, "===========");

    mvwaddstr(ch_window5, 2, 7, msg1.name);
    mvwaddstr(ch_window5, 3, 6, msg1.id);
    
    mvwaddstr(ch_window4, 1, 6, "FUNCTION");
    mvwaddstr(ch_window4, 2, 5, "===========");
    mvwaddstr(ch_window4, 3, 5, "私聊");
    mvwaddstr(ch_window4, 4, 5, "群聊");
    mvwaddstr(ch_window4, 5, 5, "发送表情");
    mvwaddstr(ch_window4, 6, 5, "查看聊天记录");
    mvwaddstr(ch_window4, 7, 5, "删除聊天记录");
    mvwaddstr(ch_window4, 8, 5, "发送文件");
    mvwaddstr(ch_window4, 9, 5, "修改昵称");
    mvwaddstr(ch_window4, 10, 5, "修改密码");
    mvwaddstr(ch_window4, 11, 5, "切换用户");

    wrefresh(new_window1);
    wrefresh(ch_window3);
    wrefresh(ch_window5);
    wrefresh(new_window5);
    wrefresh(ch_window1);
    wrefresh(ch_window2);
    wrefresh(ch_window4);
 
    mvwaddstr(ch_window4, flag, 3, "=>");
    wrefresh(ch_window4);

    keypad(ch_window4,true);

    cbreak();

    while(1)
    {
        if(filesend == FILE_SEND)
	{
	    file_receive(new_fd);

	    filesend = 0;
	}

        curs_set(0);
        
        /*mvwaddstr(ch_window4, flag, 3, "  ");
	
	flag = 3;

        mvwaddstr(ch_window4, flag, 3, "=>");
	wrefresh(ch_window4);*/

        noecho();
        while((ch = wgetch(ch_window4)) != '\n')
	{
	    if(ch == KEY_UP)
	    {
		mvwaddstr(ch_window4, flag, 3, "  ");

	        if(flag == 3)
		{
		    flag = 11;
		}
		else
		{
		    flag--;
		}

		mvwaddstr(ch_window4, flag, 3, "=>");
	    }
	    if(ch == KEY_DOWN)
	    {
		mvwaddstr(ch_window4, flag, 3, "  ");
                 
	        if(flag == 11)
		{
		    flag = 3;
		}
		else
		{
		    flag++;
		}

		mvwaddstr(ch_window4, flag, 3, "=>");
	        
	    }

	    wrefresh(ch_window4);
	}

	switch(flag)
	{
	    case 3:
	    {
	        private_chat(new_fd);
                break;
	    }
	    case 4:
	    {
	        group_chat(new_fd);
	        break;
	    }
	    case 5:
	    {   
	        send_face(new_fd);
	        break;
	    }
	    case 6:
	    {
	        check_history(new_fd);
	        break;
	    }
	    case 7:
	    {
	        delete_history(new_fd);
	        break;
	    }
	    case 8:
	    {
	        file_send(new_fd);
	        break;
	    }
	    case 9:
	    {
	        change_name(new_fd);
	        break;
	    }
	    case 10:
	    {
 
	        change_password(new_fd);

    box(new_window1, 0, 0);
    box(ch_window4, 0, 0);
    box(ch_window5, 0, 0);
    box(new_window5, 0, 0);
    box(ch_window1, 0, 0);
    box(ch_window2, ' ', ' ');
    box(ch_window3, 0, 0);

    mvwaddstr(ch_window1, 1, 5, "ONLINE-USER");
    mvwaddstr(ch_window1, 2, 5, "===========");

    mvwaddstr(ch_window5, 2, 7, msg1.name);
    mvwaddstr(ch_window5, 3, 6, msg1.id);
    
    mvwaddstr(ch_window4, 1, 6, "FUNCTION");
    mvwaddstr(ch_window4, 2, 5, "===========");
    mvwaddstr(ch_window4, 3, 5, "私聊");
    mvwaddstr(ch_window4, 4, 5, "群聊");
    mvwaddstr(ch_window4, 5, 5, "发送表情");
    mvwaddstr(ch_window4, 6, 5, "查看聊天记录");
    mvwaddstr(ch_window4, 7, 5, "删除聊天记录");
    mvwaddstr(ch_window4, 8, 5, "发送文件");
    mvwaddstr(ch_window4, 9, 5, "修改昵称");
    mvwaddstr(ch_window4, 10, 5, "修改密码");
    mvwaddstr(ch_window4, 11, 5, "切换用户");

    wrefresh(new_window1);
    wrefresh(ch_window3);
    wrefresh(ch_window5);
    wrefresh(new_window5);
    wrefresh(ch_window1);
    wrefresh(ch_window2);
    wrefresh(ch_window4);
 
    mvwaddstr(ch_window4, flag, 3, "=>");
    wrefresh(ch_window4);


                     break;

	    }
	    case 11:
	    {
                clear();
                refresh();
                new_window2 = newwin(13, 50, 5, 30);
                box(new_window2, 0, 0);
                mvwaddstr(new_window2, 3, 22, "GOODBYE");
                mvwaddstr(new_window2, 5, 22, msg1.name);
		wrefresh(new_window2);

		msg1.action = QUIT;
		write(new_fd, &msg1, sizeof(Node));

	        goto EXIT_CHATINTERFACE;
	        break;
	    }
	}
    }

    EXIT_CHATINTERFACE:

    curs_set(1);
    wgetch(new_window1);

}
예제 #2
0
/*解析消息线程*/
void *pthread_func()
{
       int group_fd;     //组播套接字
       group_fd = udp_link();
 
       head_user = (struct user_info *)malloc(sizeof(struct user_info));
       head_user->next = NULL;
      
       struct user_info *tmp; // 循环变量,用于便利在线用户链表将其发送给第一次登录的或者有刷新请求的客户端
       struct  servmsg *free_tmp;
 
       int ret= -1;
       while(1){
              while(H->next != NULL){
                   free_tmp = H;
                     H = H->next; //消息头,处理玩就往后移动
                   free(free_tmp);//将处理完的消息所占内存释放掉
                   free_tmp = NULL;
                    printf("消息来自:%s  IP:PORT:%s:%d\n",H->recvmsg.self_name,inet_ntoa(H->addr.sin_addr),ntohs(H->addr.sin_port));
					
					switch(H->recvmsg.type)
					{
                     case LOG_IN:
                            printf("%s登录消息\n",H->recvmsg.self_name);
                            send_message_to_all(H,LOGIN_TOALL);
                            add_user(head_user,H);
                     		break;
      				case REFRESH:
                            printf("%s刷新消息\n",H->recvmsg.self_name);
                            //usleep(50000);
                            send_all_online(H->addr);
                            break;
                     case CHAT_PRI:
                            printf("%s私聊消息\n",H->recvmsg.self_name);
                            printf("目标:%s\n",H->recvmsg.dst_name);
                            chat_private();
							break;
                     case CHAT_ALL:
                            printf("%s群聊消息\n",H->recvmsg.self_name);
						   send_message_to_all(H,CHAT_ALL);
                       		break;
					case FILE_NAME:
                            printf("%s申请下载\n",H->recvmsg.self_name);
                            send_dir_allfile(H->addr);
                     		break;
					case DOWNLOAD:
                            printf("%s 确认下载\n",H->recvmsg.self_name);
                            pthread_create(&tid2,NULL,download_send,(void *)&H->addr);
                            pthread_detach(tid2);
							break;
                     case  UPLOAD:
                            printf("%s上传文件\n",H->recvmsg.self_name);
                            pthread_create(&tid3,NULL,(void *)&upload_func,NULL);
                            pthread_detach(tid3);
                     		break;
					case OFFLINE:
                            printf("%s下线\n",H->recvmsg.self_name);
                            delete_user(H->recvmsg.self_name);
                     		break;
					case CREATE_GROUP:
                            printf("%s create group\n",H->recvmsg.self_name);
							create_group(H);						
                     		break;
					case  JOIN_GROUP:
                            printf("%s join group\n",H->recvmsg.self_name);
							join_group(H);
                     		break;
					case LIST_GROUP:
                            printf("%s list group\n",H->recvmsg.self_name);
							list_group(H);
                     		break;
					case GROUP_CHAT:
                            printf("%s group chat\n",H->recvmsg.self_name);
							group_chat(H);
                     		break;
					case GROUP_DELETE:
                            printf("%s delete group\n",H->recvmsg.self_name);
							delete_group(H);
                     		break;
					 default:
							printf("msg type error !\n");
							break;
					 }
                     printf("-----------------------------------\n");
              }
       }
}