UDP网络聊天室(客户端 )

/***************************************************************

File Name: client.h
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月12日 星期二 17时16分54秒
**************************************************************/

#ifndef _CHATING_H_
#define _CHATING_H_

#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PORT             8888
struct userinfo
{
    int flag;//传输信息标志
    char buf[100];//传输信息标志
    char account[20];
    char password[20];
    char nickname[100];
    char moto[256];
    int likes;
    char vip[20];
    char qq_email[64];
    char administrator[20];//管理员
    char msg[1024];//存储对话消息
    char to_nickname[20];//所要发送消息的对象昵称
    int online_number;
    char online_nickname[100][20];//存储在线人员名单//之前定义指针数组一直出错
    char file_name[64];//文件名称
    char file_content[4096];//文件内容  
    char shut_up[20];//禁言标志位
    char tmp_name[20];//
};

typedef struct userinfo Userinfo;

struct node
{
    struct sockaddr_in *client_addr;
    char nickname[20];
    struct node *next;
};

typedef struct node Node;

void show_first1();
void show_first2();
void print_info();
int mygetch();
int getpasswd(char *passwd, int size);
int client_creat();
int Register(Userinfo *sendbuf);
int Login(Userinfo *sendbuf);
void login_screen();
void chat_function(int *sockfd, struct sockaddr_in *server_addr);
void *read_from_server(void *arg);

#endif

/***************************************************************

File Name: chat.h
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月12日 星期二 10时10分56秒
**************************************************************/

#include <stdio.h>
#include "client.h"
extern Userinfo RECVBUF;
extern OUT;
extern OUT1;
char time_info[128] = {0};

void time_show()
{
     time_t rawtime;
     struct tm *timeinfo;
     time (&rawtime);
     timeinfo = localtime(&rawtime);
     printf("时间: %d%d%d%d%d%d 秒\n\n", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
                timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}

char *time_show1()
{   
     time_t rawtime;
     struct tm *timeinfo;
     time (&rawtime);
     timeinfo = localtime(&rawtime);
     sprintf(time_info, "时间: %d%d%d%d%d%d 秒\n\n", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
                timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
     return time_info;
}
void show()//欢迎界面
{
    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢                                               ");
    printf("\e[0;37m%s\e[0m","******************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎                                            ");
    printf("\e[0;37m%s\e[0m","******************\n\n\n");
    printf("\t\t\t                                                    Author :                          \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光                                         ");
    printf("\e[0;37m%s\e[0m","******************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临                                      ");
    printf("\e[0;37m%s\e[0m","******************\n\n\n");
    printf("\t\t\t                                                    Author :                          \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##                    ");
    printf("\e[0;37m%s\e[0m","*****************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##  ");
    printf("\e[0;36;1m%s\e[0m","网                ");
    printf("\e[0;37m%s\e[0m","*****************\n\n\n");
    printf("\t\t\t                                                    Author :                          \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##  ");
    printf("\e[0;36;1m%s\e[0m","网 络         ");
    printf("\e[0;37m%s\e[0m","*********************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##  ");
    printf("\e[0;36;1m%s\e[0m","网 络 聊      ");
    printf("\e[0;37m%s\e[0m","*********************\n\n\n");
    printf("\t\t\t                                                    Author :                          \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##  ");
    printf("\e[0;36;1m%s\e[0m","网 络 聊 天   ");
    printf("\e[0;37m%s\e[0m","*********************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    usleep(400000);


    system("clear");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
    printf("\t\t\t\e[0;37m%s\e[0m","*****************  ");
    printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
    printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ##  ");
    printf("\e[0;36;1m%s\e[0m","网 络 聊 天 室");
    printf("\e[0;37m%s\e[0m","*********************\n\n\n");
    printf("\t\t\t                                                    Author : 浮生流年                 \n\n");
    printf("\t\t\t\e[0;34;1m%s\e[0m","  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  \n\n");
    printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
    sleep(2);
}
void print_info()//主界面
{
    system("clear");
system("tput cup 6 20");
    printf("*****************************************************************************************\n");
system("tput cup 7 20");
    printf("*                                                                                       *\n");
system("tput cup 8 20");
    printf("*         #####################* * 依 人 恋 春 * *#######################           *\n");
system("tput cup 9 20");
    printf("*                                                                                       *\n");
system("tput cup 10 20");
    printf("*                           ********1. 注册帐户********                                 *\n");
system("tput cup 11 20");
    printf("*                                                                                       *\n");
system("tput cup 12 20");
    printf("*                           ********2. 登录帐户********                                 *\n");
system("tput cup 13 20");
    printf("*                                                                                       *\n");
system("tput cup 14 20");
    printf("*                           ********3. 忘记密码********                                 *\n");
system("tput cup 15 20");
    printf("*                                                                                       *\n");
system("tput cup 16 20");
    printf("*                           ********4. 退出平台********                                 *\n");
system("tput cup 17 20");
    printf("*                                                                                       *\n");
system("tput cup 18 20");
    printf("*******************************请 输 入 您 的 选 择:************************************\n");
}
void show_first()//开场白
{
    system("clear");
    system("tput cup 5 84");   printf("\e[0;35;1m%s\e[0m","依\n"); usleep(350000);
    system("tput cup 7 84");   printf("\e[0;34;1m%s\e[0m","山\n"); usleep(350000);
    system("tput cup 9 84");   printf("\e[0;34;1m%s\e[0m","寄\n"); usleep(350000);
    system("tput cup 11 84");  printf("\e[0;34;1m%s\e[0m","水\n"); usleep(350000);
    system("tput cup 13 84");  printf("\e[0;34;1m%s\e[0m","似\n"); usleep(350000);
    system("tput cup 15 84");  printf("\e[0;34;1m%s\e[0m","浮\n"); usleep(350000);
    system("tput cup 17 84");  printf("\e[0;34;1m%s\e[0m","云\n"); usleep(850000);


    system("tput cup 5 74");   printf("\e[0;35;1m%s\e[0m","人\n"); usleep(350000);
    system("tput cup 7 74");   printf("\e[0;34;1m%s\e[0m","间\n"); usleep(350000);
    system("tput cup 9 74");   printf("\e[0;34;1m%s\e[0m","步\n"); usleep(350000);
    system("tput cup 11 74");  printf("\e[0;34;1m%s\e[0m","步\n"); usleep(350000);
    system("tput cup 13 74");  printf("\e[0;34;1m%s\e[0m","是\n"); usleep(350000);
    system("tput cup 15 74");  printf("\e[0;34;1m%s\e[0m","尘\n"); usleep(350000);
    system("tput cup 17 74");  printf("\e[0;34;1m%s\e[0m","埃\n"); usleep(850000);


    system("tput cup 5 64");   printf("\e[0;35;1m%s\e[0m","恋\n"); usleep(350000);
    system("tput cup 7 64");   printf("\e[0;34;1m%s\e[0m","君\n"); usleep(350000);
    system("tput cup 9 64");   printf("\e[0;34;1m%s\e[0m","不\n"); usleep(350000);
    system("tput cup 11 64");  printf("\e[0;34;1m%s\e[0m","去\n"); usleep(350000);
    system("tput cup 13 64");  printf("\e[0;34;1m%s\e[0m","君\n"); usleep(350000);
    system("tput cup 15 64");  printf("\e[0;34;1m%s\e[0m","须\n"); usleep(350000);
    system("tput cup 17 64");  printf("\e[0;34;1m%s\e[0m","会\n"); usleep(850000);


    system("tput cup 5 54");   printf("\e[0;35;1m%s\e[0m","春\n"); usleep(350000);
    system("tput cup 7 54");   printf("\e[0;34;1m%s\e[0m","尽\n"); usleep(350000);
    system("tput cup 9 54");   printf("\e[0;34;1m%s\e[0m","空\n"); usleep(350000);
    system("tput cup 11 54");  printf("\e[0;34;1m%s\e[0m","余\n"); usleep(350000);
    system("tput cup 13 54");  printf("\e[0;34;1m%s\e[0m","白\n"); usleep(350000);
    system("tput cup 15 54");  printf("\e[0;34;1m%s\e[0m","日\n"); usleep(350000);
    system("tput cup 17 54");  printf("\e[0;34;1m%s\e[0m","长\n"); usleep(850000);

    system("tput cup 9 44");   printf("\e[0;35;1m%s\e[0m","|\n"); usleep(550000);
    system("tput cup 11 44");  printf("\e[0;34;1m%s\e[0m","浮\n"); usleep(550000);
    system("tput cup 13 44");  printf("\e[0;34;1m%s\e[0m","生\n"); usleep(550000);
    system("tput cup 15 44");  printf("\e[0;34;1m%s\e[0m","流\n"); usleep(550000);
    system("tput cup 17 44");  printf("\e[0;34;1m%s\e[0m","年\n"); usleep(550000);
    sleep(2);
}

/*void exit()//落幕
{
system(“clear”);
system(“tput cup 5”)
system(“tput “)
}*/

int mygetch()//相当于getch()
{
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

int getpasswd(char *passwd, int size)//获取密码, 同时输出*
{
    int c, n = 0;
    do 
    {
        c = mygetch();
        if (c != '\n' && c != 'r' & c != 127)
        {
            passwd[n] = c;
            printf("*");
            n++;
        }
        else if ((c != '\n' | c != 'r') && c == 127)//判断是否是回车或者是退格
        {
            if (n > 0)
            {
                n--; 
                printf("\b \b");//输出退格
            }
        }
    }while (c != '\n' && c != 'r' && n < (size - 1));

    passwd[n] = '\0';//消除一个多余的回车
    return n;
}

int client_creat()//创建socket
{
    int sockfd;

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);

    if (-1 == sockfd)
    {
        perror("socket");
        exit(1);
    }   
    return sockfd;
}
int Register(Userinfo *sendbuf)//注册
{
    char ch;
    char password1[20] = {0};
    char password2[20] = {0};
    printf("请创建帐号:\n");
    scanf("%s", sendbuf->account);
    while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区
    printf("请设计昵称:\n");

    scanf("%s", sendbuf->nickname);
    while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区

//  printf("%s****\n", sendbuf->nickname);

    printf("请输入密码:\n");
    getpasswd(password1, 20);
    printf("\n请确认密码:\n");
    getpasswd(password2, 20);

    printf("\n密码找回:请输入您的QQ邮箱!\n");
    scanf("%s", sendbuf->qq_email);
    while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区

    strcpy(sendbuf->moto, "暂无个性签名");
    sendbuf->likes = 0;
    strcpy(sendbuf->vip, "未开通");
    strcpy(sendbuf->administrator, "大众");
    strcpy(sendbuf->shut_up, "未禁");

    printf("\n正在注册....\n");
    sleep(2);

    if (strcmp(password1, password2) != 0)
    {
        printf("密码输入不一致,请重新注册!\n");
        memset(sendbuf, 0, sizeof(*sendbuf));
        return 0;
    }
    else
    {
        strcpy(sendbuf->password, password1);
    }
}
int Login(Userinfo *sendbuf)//登录
{
    char ch;
//  char password[20];
    printf("请输入帐号:\n");
    scanf("%s", sendbuf->account);
    while ((ch = getchar()) != '\n' && ch != EOF);

    printf("请输入密码:\n");
    getpasswd(sendbuf->password, 20);
//  strcpy(sendbuf->password, password);
    system("clear");
    system("tput cup 11 33 ");
    printf("正在登录.......\n");
    sleep(2);
}



void online(Userinfo *recvbuf, int *sockfd, struct sockaddr_in *server_addr)//处理在线人数以及在线用户名单的显示函数
{
    int ret, i;
    Userinfo sendbuf = {0};
    bzero(&sendbuf, sizeof(sendbuf));

    sendbuf.flag = 7;
    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
    if (ret < 0)
    {
        perror("sendto_online_number!!!");
        return;
    }

    int length = sizeof(*server_addr);
    ret = recvfrom(*sockfd, recvbuf, sizeof(*recvbuf), 0, (struct sockaddr *)server_addr, &length);
    if (ret < 0)
    {
        perror("sendto_...");
            return;
    }
}
void login_screen(int *sockfd, struct sockaddr_in *server_addr)//登录界面
{
    int i;
    Userinfo recvbuf = {0};
    bzero(&recvbuf, sizeof(recvbuf));
    online(&recvbuf, sockfd, server_addr);

    if (!strcmp(RECVBUF.vip, "荣耀会员"))//会员专属界面
    {
        system("clear");
        system("tput cup 0 16"); printf("\e[0;30;7m%s\e[0m","******************************************************************************************\n");
        system("tput cup 2 20"); time_show();
        system("tput cup 4 20"); printf("昵称:\e[0;34m%s\e[0m    个性签名:\e[0;32;1m%s\e[0m   点赞:\e[0;35;1m%d\e[0m     VIP:\e[0;36;1m%s\e[0m    头衔:\e[0;33;1m%s\e[0m\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
        printf("\n                                                                                       当前在线人数:\e[0;31;1m%d\e[0m人\n", recvbuf.online_number);
        for (i = 0; i < recvbuf.online_number; i++)
        {
            printf("                                                                                           \e[0;31m%s\e[0m\n", recvbuf.online_nickname[i]);
        }
        system("tput cup 6  20"); printf("\e[0;34;1m%s\e[0m","1.私聊\n");
        system("tput cup 6  60"); printf("\e[0;34;1m%s\e[0m","2.群聊\n");
        system("tput cup 8  20"); printf("\e[0;34;1m%s\e[0m","3.文件传输\n");
        system("tput cup 8  60"); printf("\e[0;34;1m%s\e[0m","4.点赞\n");
        system("tput cup 10 20"); printf("\e[0;34;1m%s\e[0m","5.修改个性签名\n");
        system("tput cup 10 60"); printf("\e[0;34;1m%s\e[0m","6.注册会员\n");
        system("tput cup 12 20"); printf("\e[0;34;1m%s\e[0m","7.禁言指定用户(管理员权限)\n");
        system("tput cup 12 60"); printf("\e[0;34;1m%s\e[0m","8.全员禁言(管理员权限)\n");
        system("tput cup 14 20"); printf("\e[0;34;1m%s\e[0m","9.查看聊天记录\n");
        system("tput cup 14 60"); printf("\e[0;34;1m%s\e[0m","10.解禁指定用户(管理员权限)\n");
        system("tput cup 16 20"); printf("\e[0;34;1m%s\e[0m","11.全员解禁(管理员权限)\n");
        system("tput cup 16 60"); printf("\e[0;34;1m%s\e[0m","12.踢人(管理员权限)\n");
        system("tput cup 18 20"); printf("\e[0;34;1m%s\e[0m","13.退出(不终止客户端)\n");
        system("tput cup 18 60"); printf("\e[0;34;1m%s\e[0m","14.退出(终止客户端)\n");
        system("tput cup 20 16"); printf("\e[0;30;7m%s\e[0m","*********************************请 输 入 您 的 选 择:***********************************\n");

    }
    else if (!strcmp(RECVBUF.vip, "至尊会员"))//管理员专属界面
    {
        system("clear");
        system("tput cup 0 16"); printf("\e[0;35;7m%s\e[0m","**************************************************************************************************\n");
        system("tput cup 2 20"); time_show();
        system("tput cup 4 20"); printf("昵称:\e[0;34m%s\e[0m    个性签名:\e[0;32;1m%s\e[0m   点赞:\e[0;35;1m%d\e[0m     VIP:\e[0;36;1m%s\e[0m    头衔:\e[0;33;1m%s\e[0m\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
        printf("\n                                                                                       当前在线人数:\e[0;31;1m%d\e[0m人\n", recvbuf.online_number);
        for (i = 0; i < recvbuf.online_number; i++)
        {
            printf("                                                                                           \e[0;31m%s\e[0m\n", recvbuf.online_nickname[i]);
        }
        system("tput cup 6  20"); printf("\e[0;34;1m%s\e[0m","1.私聊\n");
        system("tput cup 6  60"); printf("\e[0;34;1m%s\e[0m","2.群聊\n");
        system("tput cup 8  20"); printf("\e[0;34;1m%s\e[0m","3.文件传输\n");
        system("tput cup 8  60"); printf("\e[0;34;1m%s\e[0m","4.点赞\n");
        system("tput cup 10 20"); printf("\e[0;34;1m%s\e[0m","5.修改个性签名\n");
        system("tput cup 10 60"); printf("\e[0;34;1m%s\e[0m","6.注册会员\n");
        system("tput cup 12 20"); printf("\e[0;34;1m%s\e[0m","7.禁言指定用户(管理员权限)\n");
        system("tput cup 12 60"); printf("\e[0;34;1m%s\e[0m","8.全员禁言(管理员权限)\n");
        system("tput cup 14 20"); printf("\e[0;34;1m%s\e[0m","9.查看聊天记录\n");
        system("tput cup 14 60"); printf("\e[0;34;1m%s\e[0m","10.解禁指定用户(管理员权限)\n");
        system("tput cup 16 20"); printf("\e[0;34;1m%s\e[0m","11.全员解禁(管理员权限)\n");
        system("tput cup 16 60"); printf("\e[0;34;1m%s\e[0m","12.踢人(管理员权限)\n");
        system("tput cup 18 20"); printf("\e[0;34;1m%s\e[0m","13.退出(不终止客户端)\n");
        system("tput cup 18 60"); printf("\e[0;34;1m%s\e[0m","14.退出(终止客户端)\n");
        system("tput cup 20 16"); printf("\e[0;35;7m%s\e[0m","*************************************请 输 入 您 的 选 择:***************************************\n");
    }
    else//普通用户界面
    {
        system("clear");
        time_show();
        printf("昵称:%s   个性签名:%s 点赞:* %d * VIP:%s  头衔:%s\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
        printf("\n\n                                    当前在线人数:%d人\n", recvbuf.online_number);
        for (i = 0; i < recvbuf.online_number; i++)
        {
            printf("                                %s\n", recvbuf.online_nickname[i]);
        }
        printf("1.私聊\n");
        printf("2.群聊\n");
        printf("3.文件传输\n");
        printf("4.点赞\n");
        printf("5.修改个性签名\n");
        printf("6.注册会员\n");
        printf("7.禁言指定用户(管理员权限)\n");
        printf("8.全员禁言(管理员权限)\n");
        printf("9.查看聊天记录\n");
        printf("10.解禁指定用户(管理员权限)\n");
        printf("11.全员解禁(管理员权限)\n");
        printf("12.踢人(管理员权限)\n");
        printf("13.退出(不终止客户端)\n");
        printf("14.退出(终止客户端)\n");
        printf("请输入您的选择:\n");

    }
}
void show_private_chat()
{
    system("clear");
    system("tput cup 4 20"); time_show();
    printf("######################################################################\n");
    printf("#                                                                    #\n");
    printf("#   聊天工具                   常用语                常用表情        #\n");
    printf("#                                                                    #\n");
    printf("# 1.输入信息                1.气死宝宝了              1. ^_^         #\n");
    printf("#                                                                    #\n");
    printf("# 2.选择表情                2.饿死宝宝了              2. >O<         #\n");
    printf("#                                                                    #\n");
    printf("# 3.日常用语                3.痛死宝宝了              3. >*<         #\n");
    printf("#                                                                    #\n");
    printf("# 4.确认发送                4.想死宝宝了              4.|*O*|        #\n");
    printf("#                                                                    #\n");
    printf("# 5.退出私聊                5.冻死宝宝了              5. -_-||       #\n");
    printf("#                                                                    #\n");
    printf("######################################################################\n");
    printf("#                                  #\n");
    printf("#################            请输入您的选择          #################\n");
}
void chat_function(int *sockfd, struct sockaddr_in *server_addr)//娱乐聊天功能
{
    char choice[20] = {0};
    char pay_confirm[20];
    char ch;
    char vip[20] = {0};//
    char administrator[20] = {0};//
    char nickname[20] ={0};//
    char shut_up[20] = {0};//

    int ret, fd1, length;

    strcpy(nickname, RECVBUF.nickname);//这步必须要放在while循环外面,亲测!!!,否则对于一些无效操作
                                       //(已是会员,不是管理员等的操作)昵称while循环会被清空,

    Userinfo sendbuf;//重新定义一个结构体变量


//***************************************************************************************************一登录进去就群发上线指令
    sendbuf.flag = 21;
    strcpy(sendbuf.nickname, RECVBUF.nickname);
    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
    if (ret < 0)
    {
        perror("sendto_register_show_info");
        return;
    }
//  bzero(&sendbuf, sizeof(sendbuf));

//***************************************************************************************************
while (1)//本case语句中,sleep两秒的作用是为了保证在下一个循环前,读线程可以运行完毕,局部变量可以被成功赋值!!!
    {
        if (0 == OUT)//收到被踢信号,下线
        {
            ++OUT;//必须要这步,因为程序没有终止,全局变量需要重新回到1,否则下次上线后会立即下线
            return;
        }
    //  sleep(3);//等待接受线程完成,此处与线程函数处的sleep时间是有关系的
        bzero(&vip, sizeof(vip));
        bzero(&administrator, sizeof(administrator));
        bzero(&shut_up, sizeof(shut_up));

        strcpy(vip, RECVBUF.vip);//只用这三个而忽略点赞是因为这三个要用来判断是否是会员、管理员和禁言
        strcpy(administrator, RECVBUF.administrator);
        strcpy(shut_up, RECVBUF.shut_up);

        system("clear");
        login_screen(sockfd, server_addr);//主界面

    //  system("tput cup x y");//等界面做好后再定坐标***************************************************

        fgets(choice, 20, stdin);


        bzero(&sendbuf, sizeof(sendbuf));
        switch (atoi(choice))
        {
            case 0:
                {
                    sendbuf.flag = 20;
                    strcpy(sendbuf.nickname, nickname);
                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_register_member");
                        return;
                    }
                    sleep(1);
                    break;
                }
            case 1://私聊
                { 
                    char chat_file_name[128] = {0};//存放聊天文件名
                    char chat_file_record[4096] = {0};//存放聊天记录
                    char tmp_record[128] = {0};
                    char Tmp_record[2048] = {0};

                    system("clear");
                    char select[20] = {0};
                    char select1[20] = {0};

                    printf("请输入聊天对象的名字:\n");    //等待界面做好后在定坐标*******************************************        
                    scanf("%s", sendbuf.to_nickname);//所要发送消息对象的昵称
                    while ((ch = getchar()) != '\n' && ch != EOF);


                    while (1)
                    {
                        if (0 == OUT1)//收到退出私聊信号
                        {
                            ++OUT1;
                            break;
                        }
                        show_private_chat();//私聊界面

                    fgets(select, 20, stdin);
                        switch (atoi(&select[0]))
                        {
                            case 0:
                                break;
                            case 1:
                                {
                        //          bzero(chat_text, sizeof(chat_text));
                        //          bzero(chat_record, sizeof(chat_record));
                        //          printf("请输入聊天对象的名字:\n");    //等待界面做好后在定坐标*******************************************        
                        //          scanf("%s", sendbuf.to_nickname);//所要发送消息对象的昵称
                        //          while ((ch = getchar()) != '\n' && ch != EOF);

                                    printf("请输入您想要说的话:\n");
                                    scanf("%[^\n]", sendbuf.msg);//读入所有不是换行的字符
                                    strcpy(sendbuf.nickname, nickname);//用户自己的昵称
                                    break;
                                }
                            case 2://选择表情
                                {
                                    printf("请选择表情!\n");
                                    scanf("%s", select1);
                                    switch(atoi(&select1[0]))
                                    {
                                        case 1:
                                            strcat(sendbuf.msg, " ^_^ ");
                                            break;
                                        case 2:
                                            strcat(sendbuf.msg, " >O< ");
                                            break;
                                        case 3:
                                            strcat(sendbuf.msg, " >*< ");
                                            break;
                                        case 4:
                                            strcat(sendbuf.msg, " |*O*| ");
                                            break;
                                        case 5:
                                            strcat(sendbuf.msg, " -_-|| ");
                                    }
                                    break;
                                }
                            case 3://选择常用语
                                {
                                    printf("请选择常用语!\n");
                                    scanf("%s", select1);
                                    switch(atoi(&select1[0]))
                                    {
                                        case 1:
                                            strcat(sendbuf.msg, " 气死宝宝了! ");
                                            break;
                                        case 2:
                                            strcat(sendbuf.msg, " 饿死宝宝了! ");
                                            break;
                                        case 3:
                                            strcat(sendbuf.msg, " 痛死宝宝了! ");
                                            break;
                                        case 4:
                                            strcat(sendbuf.msg, " 想死宝宝了! ");
                                            break;
                                        case 5:
                                            strcat(sendbuf.msg, " 冻死宝宝了! ");
                                            break;
                                    }
                                    break;
                                }
                            case 4://全部结束后发送消息
                                {
                                    sendbuf.flag = 4;

                                    if (!strcmp(sendbuf.to_nickname, nickname))//如果所要发送消息的对象是自己
                                    {
                                        bzero(&sendbuf, sizeof(sendbuf));
                                        printf("哼,本服务器不支持自言自语功能!\n");
                                        sendbuf.flag = 20;
                                        strcpy(sendbuf.nickname, nickname);
                                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, 
                                              sizeof(*server_addr));
                                        if (ret < 0)
                                        {
                                            perror("sendto_register_member");
                                            return;
                                        }


                                        sleep(2);
                                //      bzero(&sendbuf, sizeof(sendbuf));
                                        break;
                                    }

                                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, 
                                          sizeof(*server_addr));
                                    if (ret < 0)
                                    {
                                        perror("sendto_private_chat!!!");
                                        return;
                                    }
                                    bzero(&tmp_record, sizeof(tmp_record));//先清空
                                    sprintf(tmp_record, "%s%s\n\n", time_show1(), sendbuf.msg);//再赋值
                                    //每次对话先临时保存在中,退出私聊时再一并记录
                                    bzero(&sendbuf.msg, sizeof(sendbuf.msg));//清空sendbuf.msg,否则下次还保留信息
                                    strcat(Tmp_record, tmp_record);//留到第5步退出私聊后清空
                                    sleep(2);
                                    break;

                                }
                            case 5:
                                {
                                    OUT1 = 0;
                                    int fd;
                                    sendbuf.flag = 20;
                                    strcpy(sendbuf.nickname, nickname);
                                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, 
                                          sizeof(*server_addr));
                                    if (ret < 0)
                                    {
                                        perror("sendto_register_member");
                                        return;
                                    }

                                    sprintf(chat_file_name, "%s与%s的聊天记录.txt", nickname, sendbuf.to_nickname);
                                    fd = open(chat_file_name, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);
                                    if (-1 == fd)
                                    {
                                        perror("open");
                                        return;
                                    }

                                    sprintf(chat_file_record, "\e[0;34;1m%s对%s发送信息:\e[0m\n\n\n%s\n", nickname, sendbuf.to_nickname, Tmp_record);
                                    ret = write(fd, chat_file_record, strlen(chat_file_record));
                                    if (-1 == ret)
                                    {
                                        perror("write");
                                        return;
                                    }
                                    bzero(&Tmp_record, sizeof(Tmp_record));
                                    bzero(&chat_file_name, sizeof(chat_file_name));
                                    bzero(&chat_file_record, sizeof(chat_file_record));
                                    close(fd);

                                    sleep(2);
                                }
                                break;
                            default:
                                printf("请您输入正确的选项,谢谢配合!\n");
                        }//switch
                    }//while
                //  sprintf(chat_record,"%s与%s的聊天记录.txt", recvbuf->nickname, sendbuf->nickname);
                //  fd1 = open(chat_record, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR)
                }break;
case 2://群聊
                {
                    if (!strcmp(shut_up, "禁言"))
                    {
                        printf("您已被禁言,无此权限!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                        sleep(2);
                    }
                    else
                    {
                        system("clear");
                        printf("请发送消息:\n");
                        scanf("%s", sendbuf.msg);
                        while ((ch = getchar()) != '\n' && ch != EOF);

                        sendbuf.flag = 5;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_group_chat");
                            break;
                        }
                        printf("正在发送......\n");
                        sleep(2);
                    }
                    break;
                }
case 3://文件传输
                {
                    int ret;
                    FILE *fp;
                    printf("接收方昵称:\n");
                    scanf("%s", sendbuf.to_nickname);
                    while ((ch = getchar()) != '\n' && ch != EOF);
                    if (!strcmp(sendbuf.to_nickname, nickname))
                    {
                        printf("本服务器不支持自发自收功能!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                        sleep(2);
                        break;
                    }
                    strcpy(sendbuf.nickname, nickname);
                    printf("请选择文件:\n");
                    scanf("%s", sendbuf.file_name);

                    sendbuf.flag = 6;

                    fp = fopen(sendbuf.file_name, "r");
                    if (NULL == fp)
                    {
                        printf("无法打开,该文件不存在!\n");
                        perror("can not open file\n");
                        return;
                    }

                    ret = fread(sendbuf.file_content, 1, sizeof(sendbuf.file_content), fp);//可能写的不对//读到数组中
                    if (0 == ret)
                    {
                        perror("fread_file_transfer");
                        return;
                    }

                    fclose(fp);

                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_file_transfer");
                        return;
                    }
                    sleep(2);   
                }
                break;
case 4://点赞
                {
                    system("clear");
                    sendbuf.flag = 10;
                    printf("请输入点赞对象昵称:\n");
                    scanf("%s", sendbuf.to_nickname);
                    while ((ch = getchar()) != '\n' && ch != EOF);
                    strcpy(sendbuf.nickname, nickname);

                    if (!strcmp(nickname, sendbuf.to_nickname))
                    {
                        sleep(1);
                        system("clear");
                        printf("本服务器不支持自我点赞!\n");
                        sendbuf.flag = 20;
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                        sleep(2);
                        break;
                    }
                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_give_like");
                        return;
                    }
                    printf("正在为您喜爱的用户点赞......\n");
                    sleep(2);
                    break;
                }
case 5://修改个性签名
                    {
                        system("clear");
                        sendbuf.flag = 11;
                        printf("请输入您的个性签名:\n");
                        scanf("%[^\n]", sendbuf.moto);
                        while ((ch = getchar()) != '\n' && ch != EOF);
                        strcpy(sendbuf.nickname, nickname);

                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_chang_moto");
                            return;
                        }
                        printf("正在更新您的个性签名, 请稍等片刻!\n");
                        sleep(2);
                        break;
                    }
            case 6://注册会员
                    {
                        char choice[10] = {0};

                        if (!strcmp(vip, "荣耀会员"))
                        {
                            system("clear");
                            printf("您已是荣耀会员!\n");
                            sendbuf.flag = 20;
                            strcpy(sendbuf.nickname, nickname);
                            ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                            if (ret < 0)
                            {
                                perror("sendto_register_member");
                                return;
                            }
                            sleep(2);
                            break;
                        }
                        else 
                        {
                            system("clear");
                            printf("开通荣耀会员:支付100¥ \n");
                            printf("立即开通?(y/n)\n");//找人代付?....
                            scanf("%s", choice);//如果不定义choice,直接用ch ???
                            if ('y' == choice[0])
                            {
                                strcpy(sendbuf.vip, "荣耀会员");
                                strcpy(sendbuf.nickname, nickname);
                                sendbuf.flag = 12;

                                ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                                if (ret < 0)
                                {
                                    perror("sendto_register_member");
                                    return;
                                }
                                sleep(2);
                                break;
                            }
                            else//需要else,不可省略,因为任何操作都需要接收信息
                            {
                                sendbuf.flag = 20;
                                strcpy(sendbuf.nickname, nickname);
                                ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                                if (ret < 0)
                                {
                                    perror("sendto_register_member");
                                    return;
                                }
                                sleep(2);
                                break;
                            }                       
                        }
                    }
case 7://禁言指定用户(管理员权限)(针对群聊)
                    {
                        if (!strcmp(administrator, "大众"))
                        {
                            system("clear");
                            system("tput cup 6 55"); printf("您并非管理人员, 无此权限!\n");
                            sendbuf.flag = 20;
                            strcpy(sendbuf.nickname, nickname);
                            ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                            if (ret < 0)
                            {
                                perror("sendto_register_member");
                                return;
                            }
                        }
                        else
                        {
                            system("clear");
                            printf("请您输入禁言对象昵称:\n");
                            scanf("%s", sendbuf.to_nickname);

                            if (!strcmp(sendbuf.to_nickname, nickname))
                            {
                                system("clear");
                                system("tput cup 6 55"); printf("无法对自己禁言!\n");
                                sendbuf.flag = 20;
                                strcpy(sendbuf.nickname, nickname);
                                ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                                if (ret < 0)
                                {
                                    perror("sendto_register_member");
                                    return;
                                }
                                sleep(2);
                                break;
                            }
                            sendbuf.flag = 13;
                            strcpy(sendbuf.nickname, nickname);
                            strcpy(sendbuf.administrator, administrator);//传过去用来显示
                            strcpy(sendbuf.shut_up, "禁言");

                            ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                            if (ret < 0) 
                            {
                                perror("sendto_shut_up_person");
                                return;
                            }
                        }
                        sleep(2);
                        break;
                    }
case 8://全员禁言(针对群聊)
                {
                    if (!strcmp(administrator, "大众"))
                    {
                        system("clear");
                        system("tput cup 6 55"); printf("您并非管理人员, 无此权限!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                    }
                    else
                    {   
                        sendbuf.flag = 14;
                        strcpy(sendbuf.nickname, nickname);
                        strcpy(sendbuf.administrator, administrator);
                        strcpy(sendbuf.shut_up, "禁言");
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_group_chat");
                            break;
                        }
                        printf("正在发送......\n");
                    }
                    sleep(2);
                    break;
                }
case 9://查看聊天记录
                {
                    system("clear");
                    int fd1, i = 0;
                    char buf, record[1024] = {0};
                    char to_nickname[20] = {0};
                    char chat_name[128] = {0};//聊天文件名

                    printf("请您输入对方昵称:\n");
                    scanf("%s", to_nickname);
                    while ((ch = getchar()) != '\n' && ch != EOF);

                    sprintf(chat_name, "%s%s的聊天记录.txt", nickname, to_nickname);

                //  printf("%s\n", chat_name);//****************************************

                    fd1 = open(chat_name, O_RDONLY, S_IRUSR | S_IWUSR);
                    if (-1 == fd1)
                    {
                        system("clear");
                        printf("您与%s暂无聊天记录!\n", to_nickname);
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            break;
                        }
                        //********************************************flag = 20!!!
                        sleep(2);
                        break;
                    }

                    while ((ret = read(fd1, &buf, 1)) != 0)
                    {
                        record[i] = buf;
                        i++;
                        bzero(&buf, sizeof(buf));
                    }
                    record[i] = '\0';
                    system("clear");
                    printf("聊天记录:\n%s\n", record);

                    sleep(10);

                    sendbuf.flag = 20;
                    strcpy(sendbuf.nickname, nickname);
                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_register_member");
                        return;
                    }

                    close(fd1);
                    sleep(2);
                    break;

                }
case 10://解禁(指定用户)(针对群聊)
                {
                    if (!strcmp(administrator, "大众"))
                    {
                        system("clear");
                        system("tput cup 6 55"); printf("您并非管理人员,无此权限!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                    }
                    else
                    {
                        system("clear");
                        printf("请您输入解禁对象昵称:\n");
                        scanf("%s", sendbuf.to_nickname);

                        if (!strcmp(sendbuf.to_nickname, nickname))
                        {
                            system("clear");
                            printf("您是管理人员,无须此操作!\n");
                            sendbuf.flag = 20;
                            strcpy(sendbuf.nickname, nickname);
                            ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                            if (ret < 0)
                            {
                                perror("sendto_register_member");
                                return;
                            }
                            sleep(2);
                            break;
                        }
                        sendbuf.flag = 15;
                        strcpy(sendbuf.nickname, nickname);
                        strcpy(sendbuf.administrator, administrator);//传过去用来显示
                        strcpy(sendbuf.shut_up, "未禁");

                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0) 
                        {
                            perror("sendto_shut_up1");
                            return;
                        }
                        printf("正在处理......\n");
                    }
                    sleep(2);
                    break;
                }
case 11://全员解禁(针对群聊)(针对群聊)
                {
                    if (!strcmp(administrator, "大众"))
                    {
                        system("clear");
                        printf("您并非管理人员, 无此权限!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                    }
                    else
                    {   
                        sendbuf.flag = 16;
                        strcpy(sendbuf.nickname, nickname);
                        strcpy(sendbuf.administrator, administrator);
                        strcpy(sendbuf.shut_up, "未禁");
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_group_chat1");
                            break;
                        }
                        printf("正在发送......\n");
                    }
                    sleep(2);
                    break;
                }
            case 12://踢人(强制对方下线)(管理员权限)
                {
                    if (!strcmp(administrator, "大众"))
                    {
                        system("clear");
                        printf("您并非管理人员, 无此权限!\n");
                        sendbuf.flag = 20;
                        strcpy(sendbuf.nickname, nickname);
                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register_member");
                            return;
                        }
                    }
                    else
                    {
                        system("clear");
                        printf("请您输入对方昵称:\n");
                        scanf("%s", sendbuf.to_nickname);

                        printf("duifang:*******%s\n", sendbuf.to_nickname);

                        while ((ch = getchar()) != '\n' && ch != EOF);
                        if (!strcmp(sendbuf.to_nickname, nickname))
                        {
                            sleep(1);
                            system("clear");
                            printf("您是管理员,不得胡闹!\n");
                            sendbuf.flag = 20;
                            strcpy(sendbuf.nickname, nickname);
                            ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                            if (ret < 0)
                            {
                                perror("sendto_register_member");
                                return;
                            }
                            sleep(2);
                            break;
                         }
                        sendbuf.flag = 17;
                        strcpy(sendbuf.nickname, nickname);//传管理员昵称
                        strcpy(sendbuf.administrator, administrator);//传过去用来显示

                        ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                        if (ret < 0) 
                        {   
                            perror("sendto_shut_up");
                            return;
                        }
                        printf("正在处理......\n");
                    }
                    sleep(2);
                    break;
                }
case 13://退出(下线)(不终止客户端)
                {
                    sendbuf.flag = 18;

                    strcpy(sendbuf.nickname, nickname);
                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_downline");
                        return;
                    }
                    sleep(2);
                }
                break;
            case 14://退出(下线)(终止客户端)
                {
                    strcpy(sendbuf.nickname, nickname);
                    sendbuf.flag = 19;
                    ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_downline");
                        return;
                    }
                //  exit();//落幕
                    exit(1);
                }
            default:
                printf("请您输入正确的指令,谢谢配合!\n");
                sendbuf.flag = 20;
                strcpy(sendbuf.nickname, nickname);
                ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
                if (ret < 0)
                {
                    perror("sendto_register_member");
                    return;
                }
                break;
        }
    }
}
``void *read_from_server(void *arg)
{
int ret, length;
struct sockaddr_in server_addr;
length = sizeof(server_addr);

while (1)
{
sleep(3);
bzero(&RECVBUF, sizeof(RECVBUF));
ret = recvfrom(*(int *)arg, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
if ( ret < 0)
{
perror("recvfrom_read_from_server");
return;
}
switch (atoi(RECVBUF.buf))
{
case 1://对方向我私聊
     { 
     system("clear");
char fd2;
char chat_file_name1[128] = {0};
char chat_file_record1[4096] = {0};
char tmp_record1[256] = {0};

bzero(&chat_file_name1, sizeof(chat_file_name1));
bzero(&chat_file_record1, sizeof(chat_file_record1));
bzero(&tmp_record1, sizeof(tmp_record1));

sprintf(tmp_record1, "%s%s\n\n", time_show1(), RECVBUF.msg);

sprintf(chat_file_name1, "%s%s的聊天记录.txt", RECVBUF.nickname, RECVBUF.tmp_name);
fd2 = open(chat_file_name1, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);
if (-1 == fd2)
{
perror("open1");
return;
}

sprintf(chat_file_record1, "\e[0;34;1m%s%s发送信息:\e[0m\n\n%s\n", RECVBUF.tmp_name, RECVBUF.nickname, tmp_record1);
ret = write(fd2, chat_file_record1, strlen(chat_file_record1));
if (-1 == ret)
{
perror("write1");
return;
}

 system("tput cup 6 55"); printf("%s: %s\n", RECVBUF.tmp_name, RECVBUF.msg);//格式为:   对方名称:消息
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 2://发送消息成功(包括 私聊 和 群聊 和 文件)
      {
     system("clear");
system("tput cup 6 55"); printf("发送成功!\n");
//system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 3://对方暂未登录
       {
       system("clear");
system("tput cup 6 55"); printf("很遗憾, 对方暂未登录!\n");
//system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
/*  case 4://查看聊天记录
    { 
}*/
case 5://对方发起群聊
     {
  system("clear");
system("tput cup 6 55"); printf("%s群发:%s\n", RECVBUF.tmp_name, RECVBUF.msg);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 6://发送消息失败
    {
  system("clear");
system("tput cup 6 55"); printf("消息发送失败,无其他人在线!\n");
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 7://接收文件
    {
system("clear");
   int ret;
FILE *fp1;//之前传输文件处定义过fp,这里文件描述符千万别写成fp,就是说文件描述符必须不一致!!!
char file_name[64] = "复件";

strcat(file_name, RECVBUF.file_name);
fp1 = fopen(file_name, "w");
if (NULL == fp1)
{
   perror("can not open file_client_file_transfer") ;
return;
}

ret = fwrite(RECVBUF.file_content, 1, strlen(RECVBUF.file_content), fp1);

if (0 == ret)
{
   perror("fread_file_transfer");
return;
}
  printf("%s 给您发送文件,恭喜您已成功接收......\n", RECVBUF.tmp_name);
printf("文件内容:%s\n", RECVBUF.file_content);//稍后再写函数控制是否接收等等
system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
fclose(fp1);
//bzero(&RECVBUF, sizeof(RECVBUF));
break;
}

case 8://对方向我点赞 
                system("clear");
                system("tput cup 6 55"); printf("%s为您点赞!\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
                break;
            case 9://点赞成功
                system("clear");
                system("tput cup 6 55"); printf("点赞成功!\n");
                break;
            case 10://点赞失败
                system("clear");
                system("tput cup 6 55"); printf("点赞失败,该用户尚未注册!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 11://修改个性签名成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜您已成功修改个性签名!\n");
                break;
            case 12://注册会员成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜您已成功开通会员!\n");
                break;
            case 13://指定用户被禁言
                system("clear");
                system("tput cup 6 55"); printf("很抱歉, 您已被管理员:%s 禁言!\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 14://指定用户禁言成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜您成功禁言该用户!\n");
                break;
            case 15://指定用户禁言失败
                system("clear");
                system("tput cup 6 55"); printf("该用户并未注册, 无须禁言!\n");
                break;
            case 16://全员禁言成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜尊贵的管理员,本群禁言成功!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 17://收到禁言信息
                system("clear");
                system("tput cup 6 55"); printf("管理员%s:本群禁言中...\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 18://指定用户被解禁
                system("clear");
                system("tput cup 6 55"); printf("恭喜您,您已被管理员:%s 解禁!\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 19://指定用户解禁成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜您成功解禁该用户!\n");
                break;
            case 20://指定用户解禁失败
                system("clear");
                system("tput cup 6 55"); printf("该用户并未注册,无须解禁!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 21://全员解禁成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜尊贵的管理员,本群解禁成功!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 22://收到解禁信息
                system("clear");
                system("tput cup 6 55"); printf("管理员%s:本群已解禁!\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 23://被踢(被强制下线)
                system("clear");
                OUT = 0;
                system("tput cup 6 55"); printf("很遗憾,您已被管理员:%s 强制下线!\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 24://踢人(强制对方下线)成功
                system("clear");
                system("tput cup 6 55"); printf("恭喜尊贵的管理员,对方已被您成功踢下线!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 25://踢人(对方未登录)失败
                system("clear");
                system("tput cup 6 55"); printf("该用户尚未登录,您的踢人指令无效!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 26://踢人(对方未注册)失败
                system("clear");
                system("tput cup 6 55"); printf("该用户尚未注册,您的踢人指令无效!\n");
            //  system("tput cup 8 55"); printf("请您输入回车键返回:\n");
                break;
            case 27://自己下线成功(不终止客户端)
                system("clear");
                OUT = 0;
                system("tput cup 6 55"); printf("恭喜您已成功下线!\n");
                break;
            case 28://好友上线通知
                system("clear");
                system("tput cup 6 55"); printf("您的好友%s已上线\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
                break;
            case 29://好友下线通知
                system("clear");
                system("tput cup 6 55"); printf("您的好友%s已下线\n", RECVBUF.tmp_name);
                system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
                break;
        }
    }
}

/***************************************************************

File Name: testchat.c
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月13日 星期三 16时49分18秒
**************************************************************/

#include <stdio.h>
#include "client.h"


//pthread_t tid[2];
Userinfo RECVBUF;//全局变量
int OUT = 1;//全局变量,1保持聊天状态,0退出聊天界面
int OUT1 = 1;//全局变量,1保持聊天表情,常用语,聊天说话,0退出
//char time_info[128];//必须要全局变量,否则提示出错


int main()
{
    Userinfo Sendbuf;//定义结构体变量client
//  Userinfo Recvbuf;
    char choice[10] = {0};
    int sockfd, ret;
    struct sockaddr_in server_addr;
    pthread_t tid;


/*  H_node *head = (H_node *)malloc(sizeof(H_node));
    if (NULL == head)
    {
        printf("Malloc Failure !\n");
        return;
    }
    head->next = NULL;*/

    sockfd = client_creat();//创建socket

    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = PORT;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");


    show_first();
    show();
    int length = sizeof(server_addr);
    while (1)
    {
        print_info();
        scanf("%s", choice);

        switch (atoi(&choice[0]))
        {
            case 1://注册
                {

                    bzero(&Sendbuf, sizeof(Sendbuf));
                    if (Register(&Sendbuf) == 0)
                    {
                        break;
                    }
                    else
                    {
                        Sendbuf.flag = 1;

                        ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
                        if (ret < 0)
                        {
                            perror("sendto_register");
                            exit(1);
                        }

                        bzero(&RECVBUF, sizeof(RECVBUF));

                        ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
                        if (ret < 0)
                        {
                            perror("recvfrom_register");
                            exit(1);
                        }

                        if (strcmp(RECVBUF.buf, "注册成功!") == 0)
                        {
                            printf("恭喜您注册成功!\n");
                            sleep(2);
                            break;
                        }
                        else if (strcmp(RECVBUF.buf, "帐号已存在!") == 0)
                        {
                            printf("该帐户已被注册, 请重新注册!\n");
                            sleep(2);
                            break;
                        }

                    }
                }

            case 2://登录
                {
                    bzero(&Sendbuf, sizeof(Sendbuf));
                    Login(&Sendbuf);

                    Sendbuf.flag = 2;
                    ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
                    if ( ret < 0)
                    {
                        perror("sendto_login");
                        exit(1);
                    }
                    bzero(&Sendbuf, sizeof(Sendbuf));




                    ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
                    if (ret < 0)
                    {
                        perror("recvfrom_login");
                        exit(1);
                    }
                    if (!strcmp(RECVBUF.buf, "登录成功!"))//Recvbuf中保存了服务器发送的调用数据库中的本帐号信息
                    {
                        printf("恭喜您登录成功!\n");
                        printf("%s\n", RECVBUF.nickname);
                    //  bzero(&Recvbuf, sizeof(Recvbuf));//先写登录界面,待会再处理
                        sleep(2);
                    //  login_screen(&Recvbuf);//登录界面
                    //  bzero(&Recvbuf, sizeof(Recvbuf));

                        pthread_create(&tid, NULL, read_from_server, (void *)&sockfd);//开起一个读线程,专门用来接收消息
                        pthread_detach(tid);

                        chat_function(&sockfd, &server_addr);
                    }

                    else if (!strcmp(RECVBUF.buf, "该帐号已在其他地方登录!"))
                    {
                        printf("该帐号已在其他地方登录!\n");
                        bzero(&RECVBUF, sizeof(RECVBUF));
                        break;
                    }


                    else if (!strcmp(RECVBUF.buf, "帐号或密码错误"))
                    {
                        printf("您输入的帐号或密码错误,请重新登录!\n");
                        sleep(2);
                        bzero(&RECVBUF, sizeof(RECVBUF));
                    }
                    break;
                }
            case 3://忘记密码
                {
                    system("clear");
                    bzero(&Sendbuf, sizeof(Sendbuf));
                    Sendbuf.flag = 3;
                    printf("请输入您的QQ邮箱,我们将通过此邮箱发送您所需要的信息,请您注意查收!\n");
                    scanf("%s", Sendbuf.qq_email);

                    ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
                    if (ret < 0)
                    {
                        perror("sendto_forgot_password");
                        exit(1);
                    }

                    ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
                    if (ret < 0)
                    {
                        perror("recvfrom_forgot_password");
                        exit(1);
                    }

                    sleep(2);
                    system("clear");
                    if (!strcmp(RECVBUF.buf, "忘记密码"))
                    {
                        printf("密码已发送至您的邮箱,请前往查收!\n\n\n");
                        printf("正在为您跳转......\n\n");
                        sleep(2);
                        system("clear");
                        printf("已使用快捷方式登陆您的邮箱......\n");
                        sleep(1);
                        printf("************请妥善保管************\n");
                        printf("*                                *\n");
                        printf("*     帐号:%s                   *\n", RECVBUF.account);
                        printf("*                                *\n");
                        printf("*     密码:%s                   *\n", RECVBUF.password);
                        printf("*                                *\n");
                        printf("**********************************\n");
                        sleep(3);
                        break;
    show_first();
                    }
                    else
                    {
                        printf("该帐号尚未注册!\n");
                        break;
                    }
                }
            case 4:
                exit(1);
                break;
            default:
                printf("未知操作。。。。。。\n");
        }
    }

    close(sockfd);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值