Linux系统编程之网络聊天室

里面的提示信息混乱有没有大佬帮我改一下,就下面那个

char feedback[50];//反馈信息,服务器给客户端返回处理结果

服务器端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//字符串
#include <unistd.h>
#include <sys/socket.h>//tCp网络编程
#include <netinet/in.h>//绑定需要
#include <arpa/inet.h>//转换需要
#include <mysql/mysql.h>//数据库
#include <sys/select.h>//多路io复用
#include <sys/types.h>//文件操作
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>//时间
typedef struct
{
    char name[20];//用户名
    char passwd[20];//用户密码
    int ID;//用户账号
    char type;//消息类型 -- 判断要干什么
    char feedback[50];//反馈信息,服务器给客户端返回处理结果
    int online;//在线状态
    int s_ID;//聊天对象的ID
    char adm[3];//管理员标志
    char t_buf[128];//用于读写操作
    int tjz;//套接字
    char L_time[30];
} CLI;

CLI er_abc,ew_abc;
MYSQL *con;
MYSQL_RES *result;
int clients = 0;//接入的客户端数
int server_fd,client_fds[50];//套接字
MYSQL_ROW row;
char query[255] = {};
int i;
int adm = 0;

void login(int lo);
void G_login(int lo);
void log_off(int rc);
//void group_chat(int i,int cs);
void registerClient(int rc);
void Private_chat(int rs,int s_ID);
void PrivateChat(int rs);
void No_Speaking(int rc);
void Yes_Speaking(int rc);
void Kick_people(int Gc);
void Txt();
int look();
int Account();

int main()
{
    int max_fd;//套接字最大值
    fd_set read_fds,all_fds;//创建保存套接字的集合
    socklen_t len;//计算accept需要的结构体的大小
    struct sockaddr_in server_addr, client_addr;//用于绑定地址和端口号的结构体
    int res;//接收各函数的返回值
    //连接MySql数据库
    con = mysql_init(NULL);
    if(con == NULL)
    {
        perror("mysql_init");
        return -1;
    }
    perror("mysql_init");
    //登陆数据库
    con = mysql_real_connect(con,"localhost","root","123","826_stu",0,NULL,0);
    if(con == NULL)
    {
        perror("mysql_real_connect");
        return -1;
    }
    perror("mysql_real_connect");
    //创建服务器套接字    ipv4     TCP
    server_fd = socket(AF_INET,SOCK_STREAM,0);
    if(server_fd == -1)
    {
        perror("socket");
        return -1;
    }
    printf("%d号服务器启动..\n",server_fd);
    perror("socket");
    //防止端口号被占用
    int val = 1;
    setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
    //设置bind需要的参数
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//或INADDR_ANY表示当地地址
    server_addr.sin_port = htons(12345);//端口号用于和客户端之间的通信
    //绑定套接字到服务器地址
    res = bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
    if(res == -1)
    {
        perror("bind");
        return -1;
    }
    perror("bind");
    //设置监听连接请求数量
    res = listen(server_fd,50);
    if(res == -1)
    {
        perror("listen");
        return -1;
    }
    perror("listen");
    //初始化客户端套接字集合
    FD_ZERO(&all_fds);
    //将服务器套接字先放入集合中
    FD_SET(server_fd,&all_fds);
    max_fd = server_fd;//设置最大套接字
    len = sizeof(client_addr);//接收客户端结构体的大小
    printf("等待客户端连接...\n");
    //创建循环方便多个客户端的接入
    while (1)
    {
        printf("进入循环创建客户端接入\n");
        //复制套接字的集合便于侦察读文件是否发生异动
        read_fds = all_fds;
        //select的多路io复用
        res = select(max_fd + 1,&read_fds,NULL,NULL,NULL);
        if(res == -1)
        {
            perror("select");
            return -1;
        }
        perror("select");
        //检测集合fds中的fd是否变化,变化为0
        if(FD_ISSET(server_fd,&read_fds))
        {
            //接收客户端的连接
            client_fds[clients] = accept(server_fd,(struct sockaddr *)&client_addr,&len);
            if(client_fds[clients] == -1)
            {
                perror("accept");
                return -1;
            }
            printf("%d号客户端接入\n",client_fds[clients]);
            perror("accept");
            ew_abc.tjz = client_fds[clients];
            //将新加入的客户端套接字加入集合中
            FD_SET(client_fds[clients],&all_fds);
            //更新最大套接字
            if(client_fds[clients] > max_fd)
                max_fd = client_fds[clients];
            //更新接收客户端的连接返回值的数组下标
            clients++;
            /*select的返回值表示变化的文件描述符的总个数,
            如果只有一个sockfd(连接套接字)发生变化,
            说明此时客户端只是连接还未进行数据传输,
            则没必要继续检测是否进行通讯,结束本次循环*/
            if(res == 1)
                continue;
        }   
        //如果有客户端连接就执行该循环
        for(i=0;i<clients;i++)
        {
            printf("如果有客户端连接就执行该循环\n");
            if(FD_ISSET(client_fds[i],&read_fds))
            {
                printf("判断套接字是否改变%d %d\n",i,clients);
                ssize_t recv_len = recv(client_fds[i],&er_abc,sizeof(er_abc),0);
                printf("接收的数据:%c\n",er_abc.type);
                if(recv_len < 0)
                {
                    perror("recv");
                    return -1;
                }
                else if(recv_len == 0)
                {
                    printf("%d号已关闭连接\n",client_fds[i]);
                    //close(client_fds[i]);
                    FD_CLR(client_fds[i],&all_fds);
                    //printf("%d%d\n",ew_abc.tjz,client_fds[i]);
                    sprintf(query,"select 姓名,管理权限 from LT where 套接字=%d",client_fds[i]);
                    if(mysql_query(con,query))
                    {
                        printf("对比不成功\n");
                        exit(1);
                    }
                    //获取查询结果
                    result = mysql_store_result(con);
                    if(result == NULL)
                    {
                        printf("获取数据失败\n");
                        exit(1);
                    }
                    //判断接收的账号是否正确
                    if(row = mysql_fetch_row(result))
                    {
                        strcpy(ew_abc.name,row[0]);
                        strcpy(ew_abc.adm,row[1]);
                    }
                    sprintf(ew_abc.t_buf,"%s已下线",ew_abc.name);
                    for(int j = 0;j<clients;j++)
                    {
                        if(j != i)
                        {
                            printf("%s\n",ew_abc.t_buf);
                            send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
                        }
                    }
                    sprintf(query,"update LT set 在线状态='0',套接字=-1 where 套接字=%d",client_fds[i]);
                    //printf("%d\n",client_fds[i]);
                    if(mysql_query(con,query))
                    {
                        printf("修改在线失败\n");
                        exit(1);
                    }
                    //将以下线的客户端移动到集合后面
                    for(int k = i;k<clients-1;k++)
                    {
                        client_fds[k] = client_fds[k+1];
                    }
                    clients--;
                    mysql_free_result(result);
                    printf("退出已设置************\n");
                }
                else
                {
                    printf("解析中..\n");
                    //解析客户端发送的消息
                    if(er_abc.type == 'D')//登陆
                    {
                        //if(ew_abc.tjz == client_fds[i])
                            login(client_fds[i]);
                    }
                    if(er_abc.type == 'Q')//群聊
                    {
                        printf("%d\n",adm);
                        if(!strcmp(er_abc.t_buf,"quit"))
                        {
                            printf("私发\n");
                            send(client_fds[i],&er_abc,sizeof(er_abc),0);
                            break;
                        }
                        if(look() == -1)
                            break;
                        //group_chat(i,client_fds[i]);
                        for(int j = 0;j<clients;j++)
                        {
                            if((j != i) && (j != adm))
                            {
                                printf("群发\n");
                                send(client_fds[j],&er_abc,sizeof(er_abc),0);
                            }
                        }
                        Txt();
                    }
                    if (er_abc.type == 'Z')//注册
                        registerClient(client_fds[i]);
                    if (er_abc.type == 'S')//查找私聊账号
                        Private_chat(client_fds[i],er_abc.s_ID);
                    if(er_abc.type == 's')
                    {
                        //给自己发送
                        send(client_fds[i],&er_abc,sizeof(er_abc),0);
                        if(!strcmp(er_abc.t_buf,"quit"))
                            break;
                        //给私聊对象发送
                        printf("套接字%d\n",er_abc.tjz);
                        send(er_abc.tjz,&er_abc,sizeof(er_abc),0);
                    }
                    if(er_abc.type == 'G')//管理员登陆
                        G_login(client_fds[i]);
                    if(er_abc.type == 'J')//禁言账号查询
                        PrivateChat(client_fds[i]);
                    if(er_abc.type == 'j')//禁言执行
                    {
                        No_Speaking(client_fds[i]);
                    }
                    if(er_abc.type == 'X')//解除禁言
                        Yes_Speaking(client_fds[i]);
                    if(er_abc.type == 'z')//注销账号
                    {
                        log_off(client_fds[i]);
                    }
                    if(er_abc.type == 'T')//查找踢人账号
                    {
                        er_abc.type = 'T';
                        Private_chat(client_fds[i],er_abc.s_ID);
                        printf("%d\n",client_fds[i]);
                    }
                    if(er_abc.type == 't')//执行踢人命令
                    {
                        Kick_people(client_fds[i]);
                    }
                    if(er_abc.type == 'g')//解除踢人命令
                    {
                        Yes_Speaking(client_fds[i]);
                    }
                }
            }
        }
    }
    //关闭数据库连接
    mysql_close(con);
    return 0;
}
//登陆
void login(int lo)
{
    //查询数据库的数据
    sprintf(query,"select 姓名,在线状态,管理权限 from LT where 账号='%d' and 密码='%s'",er_abc.ID,er_abc.passwd);
    if(mysql_query(con,query))
    {
        printf("对比不成功\n");
        exit(1);
    }
    //获取查询结果
    result = mysql_store_result(con);
    if(result == NULL)
    {
        printf("获取数据失败\n");
        exit(1);
    }
    //判断接收的账号是否正确
    if(row = mysql_fetch_row(result))
    {
        strcpy(ew_abc.name,row[0]);
        ew_abc.online = atoi(row[1]);
        strcpy(ew_abc.adm,row[2]);
        printf("%s,%s,%s,%d,%d\n",row[0],row[1],row[2],ew_abc.online,ew_abc.tjz);
        sprintf(query,"update LT set 在线状态='1',套接字=%d where 账号=%d",ew_abc.tjz,er_abc.ID);
        if(mysql_query(con,query))
        {
            printf("修改在线失败\n");
            exit(1);
        }
        sprintf(ew_abc.feedback,"登陆成功!");
        if(ew_abc.online == 1)
            sprintf(ew_abc.feedback,"该账号已登陆!");
        ew_abc.tjz = client_fds[i];
        send(lo,&ew_abc,sizeof(ew_abc),0);
        mysql_free_result(result);
        //提示各客户端本用户上线
        sprintf(query,"select 姓名,套接字 from LT where 套接字=%d",client_fds[i]);
        if(mysql_query(con,query))
        {
            printf("对比不成功\n");
            exit(1);
        }
        //获取查询结果
        result = mysql_store_result(con);
        if(result == NULL)
        {
            printf("获取数据失败\n");
            exit(1);
        }
        //判断接收的账号是否正确
        if(row = mysql_fetch_row(result))
        {
            strcpy(ew_abc.name,row[0]);
        }
        sprintf(ew_abc.t_buf,"%s已上线",ew_abc.name);
        for(int j = 0;j<clients;j++)
        {
            if((j != i) && (j != adm))
            {
                printf("%s\n",ew_abc.t_buf);
                send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
            }
        }
    }
    else
    {
        sprintf(ew_abc.feedback,"登陆失败!");
        send(lo,&ew_abc,sizeof(ew_abc),0);
    }
    mysql_free_result(result);
}
//管理员登陆
void G_login(int lo)
{
    //查询数据库的数据
    sprintf(query,"select 姓名,在线状态,管理权限 from LT where 账号='%d' and 密码='%s'",er_abc.ID,er_abc.passwd);
    if(mysql_query(con,query))
    {
        printf("对比不成功\n");
        exit(1);
    }
    //获取查询结果
    result = mysql_store_result(con);
    if(result == NULL)
    {
        printf("获取数据失败\n");
        exit(1);
    }
    //判断接收的账号是否正确
    if(row = mysql_fetch_row(result))
    {
        strcpy(ew_abc.name,row[0]);
        ew_abc.online = atoi(row[1]);
        strcpy(ew_abc.adm,row[2]);
        printf("%s,%s,%s,管理%s\n",row[0],row[1],row[2],ew_abc.adm);
        if(!strcmp(ew_abc.adm,"0"))
        {
            printf("该账号不是管理员\n");
            sprintf(ew_abc.feedback,"该账号不是管理员!");
            send(lo,&ew_abc,sizeof(ew_abc),0);
            exit(1);
        }
        sprintf(query,"update LT set 在线状态='1',套接字=%d where 账号=%d",ew_abc.tjz,er_abc.ID);
        if(mysql_query(con,query))
        {
            printf("修改在线失败\n");
            sprintf(ew_abc.feedback,"修改在线失败!");
            send(lo,&ew_abc,sizeof(ew_abc),0);
            exit(1);
        }
        sprintf(ew_abc.feedback,"登陆成功!");
        if(ew_abc.online == 1)
            sprintf(ew_abc.feedback,"该账号已登陆!");
        send(lo,&ew_abc,sizeof(ew_abc),0);
        adm = lo;
        mysql_free_result(result);
        //提示各客户端本用户上线
        sprintf(query,"select 姓名 from LT where 套接字=%d",client_fds[i]);
        if(mysql_query(con,query))
        {
            printf("对比不成功\n");
            exit(1);
        }
        //获取查询结果
        result = mysql_store_result(con);
        if(result == NULL)
        {
            printf("获取数据失败\n");
            exit(1);
        }
        //判断接收的账号是否正确
        if(row = mysql_fetch_row(result))
        {
            strcpy(ew_abc.name,row[0]);
        }
        sprintf(ew_abc.t_buf,"管理员%s已上线",ew_abc.name);
        ew_abc.t_buf[strlen(ew_abc.t_buf)] = '\0';
        for(int j = 0;j<clients;j++)
        {
            if(j != i)
            {
                printf("%s\n",ew_abc.t_buf);
                send(client_fds[j],&ew_abc,sizeof(ew_abc),0);
            }
        }
        memset(ew_abc.t_buf, 0, sizeof(ew_abc.t_buf));
    }
    else
    {
        sprintf(ew_abc.feedback,"登陆失败!");
        send(lo,&ew_abc,sizeof(ew_abc),0);
    }
    mysql_free_result(result);
}
//注册
void registerClient(int rc)
{
    er_abc.ID = Account();
    char C_set[255] = {};
    sprintf(C_set,"insert into LT values(%d,'%s','%s','0','0',-1)",
        er_abc.ID,er_abc.name,er_abc.passwd);
    if(mysql_query(con,C_set))
    {
        printf("注册不成功\n");
        sprintf(ew_abc.feedback,"注册不成功!");
        exit(1);
    }
    printf("注册成功%d\n",er_abc.ID);
    ew_abc.ID = er_abc.ID;
    sprintf(ew_abc.feedback,"注册成功!");
    send(rc,&ew_abc,sizeof(er_abc),0);
}
//注销
void log_off(int rc)
{
    char C_log_off[255] = {};
    sprintf(C_log_off,"delete from LT where 账号=%d and 姓名='%s' and 密码='%s'",
        er_abc.ID,er_abc.name,er_abc.passwd);
    if(mysql_query(con,C_log_off))
    {
        printf("注销不成功\n");
        sprintf(ew_abc.feedback,"注销不成功,可能信息输入错误!");
        exit(1);
    }
    printf("注销成功账号:%d\n",er_abc.ID);
    sprintf(ew_abc.feedback,"注销成功!");
    send(rc,&ew_abc,sizeof(er_abc),0);
}
//查找私聊账号/查找禁言账号
void Private_chat(int rs,int s_ID)
{
    sprintf(query,"select 姓名,在线状态,套接字 from LT where 账号=%d",s_ID); 
    if(mysql_query(con,query))
    {
        printf("查询账号失败\n");
        sprintf(ew_abc.feedback,"查询账号失败");
        send(rs,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    //获取查询结果
    result = mysql_store_result(con);
    if(result == NULL)
    {
        printf("获取数据失败\n");
        sprintf(ew_abc.feedback,"获取数据失败");
        send(rs,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    if(row = mysql_fetch_row(result))
    {
        strcpy(ew_abc.name,row[0]); 
        ew_abc.online = atoi(row[1]);
        ew_abc.tjz = atoi(row[2]);

        sprintf(ew_abc.feedback,"查询账号成功");
        printf("%c %s\n",er_abc.type, ew_abc.feedback);
        send(rs,&ew_abc,sizeof(ew_abc),0);
    }
    else
    {
        printf("账号不存在\n");
        sprintf(ew_abc.feedback,"账号不存在");
        send(rs,&ew_abc,sizeof(ew_abc),0);
    }
    mysql_free_result(result);
}
//禁言名字查询
void PrivateChat(int rs)
{
    sprintf(query,"select 账号 from LT where 姓名='%s'",er_abc.t_buf); 
    if(mysql_query(con,query))
    {
        printf("查询禁言账号失败\n");
        sprintf(ew_abc.feedback,"查询禁言账号失败");
        send(rs,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    //获取查询结果
    result = mysql_store_result(con);
    if(result == NULL)
    {
        printf("获取禁言数据失败\n");
        sprintf(ew_abc.feedback,"获取禁言数据失败");
        send(rs,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    if(row = mysql_fetch_row(result))
    {
        ew_abc.s_ID = atoi(row[0]);
        sprintf(ew_abc.feedback,"查询账号成功");
        printf("%s\n",ew_abc.feedback);
        send(rs,&ew_abc,sizeof(ew_abc),0);
    }
    else
    {
        printf("禁言账号不存在\n");
        sprintf(ew_abc.feedback,"禁言账号不存在");
        send(rs,&ew_abc,sizeof(ew_abc),0);
    }
    mysql_free_result(result);
}
//禁言执行
void No_Speaking(int rc)
{
    sprintf(query,"update LT set 管理权限='J' where 账号=%d",er_abc.s_ID);
    if(mysql_query(con,query))
    {
        printf("修改禁言失败\n");
        sprintf(ew_abc.feedback,"修改禁言失败!");
        send(rc,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    printf("修改禁言成功\n");
    sprintf(ew_abc.feedback,"修改禁言成功!");
    send(rc,&ew_abc,sizeof(ew_abc),0);
}
//解除禁言/踢人
void Yes_Speaking(int rc)
{
    sprintf(query,"update LT set 管理权限='0' where 账号=%d",er_abc.s_ID);
    if(mysql_query(con,query))
    {
        printf("解除失败\n");
        sprintf(ew_abc.feedback,"解除失败!");
        send(rc,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    memset(ew_abc.feedback,0,50);
    sprintf(ew_abc.feedback,"解除成功!");
    printf("%s\n",ew_abc.feedback);
    send(rc,&ew_abc,sizeof(ew_abc),0);
}
//踢人
void Kick_people(int Gc)
{
    sprintf(query,"update LT set 管理权限='T' where 账号=%d",er_abc.s_ID);
    if(mysql_query(con,query))
    {
        printf("修改踢人失败\n");
        sprintf(ew_abc.feedback,"修改踢人失败!");
        send(Gc,&ew_abc,sizeof(ew_abc),0);
        exit(1);
    }
    printf("修改踢人成功\n");
    sprintf(ew_abc.feedback,"修改踢人成功!");
    send(Gc,&ew_abc,sizeof(ew_abc),0);
}
//查看自己是否可以群聊
int look()
{
    sprintf(query,"select 管理权限 from LT where 套接字=%d",er_abc.tjz);
    //printf("服务器接收套接字:%d\n",er_abc.tjz);
    if(mysql_query(con,query))
    {
        printf("查找重要数据失败1\n");
        sprintf(ew_abc.feedback,"查找重要数据失败!");
        return -1;
    }
    //获取查询结果
    result = mysql_store_result(con);
    if(result == NULL)
    {
        printf("查找重要数据失败2\n");
        sprintf(ew_abc.feedback,"查找重要数据失败!");
        return -1;
    }
    //判断是否接收到数据
    if(row = mysql_fetch_row(result))
    {
        strcpy(ew_abc.adm,row[0]);
        if(!strcmp(ew_abc.adm,"J"))
        {
            printf("该账号已禁言,请联系管理员解除禁言\n");
            sprintf(ew_abc.t_buf,"该账号已禁言,请联系管理员解除禁言");
            send(client_fds[i],&ew_abc,sizeof(ew_abc),0);
            return -1;
        }
        if(!strcmp(ew_abc.adm,"T"))
        {
            printf("该账号已被踢出,请联系管理员解除禁言\n");
            sprintf(ew_abc.t_buf,"该账号被踢出,请联系管理员解除禁言");
            send(client_fds[i],&ew_abc,sizeof(ew_abc),0);
            return -1;
        }
    }
    mysql_free_result(result);
    return 0;
}
//保存聊天记录
void Txt()
{
    FILE * fp = fopen("./聊天.txt","a+");
    fprintf(fp,"%s\n用户%s:%s\n",er_abc.L_time,er_abc.name,er_abc.t_buf);
    fclose(fp);
}
//设置用户账号
int Account()
{
    //设置账号的初值
    int id = 10;
    //创建/打开一个文档用于储存已经定义好的账号
    int fd = open("account.txt",O_RDWR|O_CREAT,0644);
    if(fd == -1)
    {
        perror("open");
        return -1;
    }
    //读取已经创建好了的账号
    read(fd,&id,sizeof(int));
    id++;
    lseek(fd,0,0);
    write(fd,&id,sizeof(int));
    close(fd);
    printf("准备返回账号:%d\n",id);
    //返回已经创建好的账号
    return id;
}




// //群聊
// void group_chat(int i,int cs)
// {
//     printf("群聊\n");
//     for(int j = 0;j<clients;j++)
//     {
//         printf("%d   %d\n",i,j);
//         if(j != i)
//         {   printf("向%d发送\n",cs);
//             send(cs,&er_abc,sizeof(er_abc),0);
//         }
//     }
// }

客户端

#include <stdio.h>
#include <sys/types.h>  //类型
#include <sys/socket.h>//tcp
#include <netinet/in.h>//绑定
#include <arpa/inet.h>//转换
#include <string.h>//字符串
#include <pthread.h>//线程
#include <time.h>
typedef struct
{
    char name[20];//用户名
    char passwd[20];//用户密码
    int ID;//用户账号
    char type;//消息类型 -- 判断要干什么
    char feedback[50];//反馈信息,服务器给客户端返回处理结果
    int online;//在线状态
    int s_ID;//聊天对象的ID
    char adm[3];//管理员标志
    char t_buf[128];//用于读写操作
    int tjz;//套接字
    char L_time[30];
} CLI;

CLI cr_abc,cw_abc;

int client_fd;
int count = 0;
int tjz;
int adm = -1;
int adm1 = 0;
char Y_N;
char str[20] = "quit";
char name[20];

void *F_fun(void *p);
void *F_fun1(void *p);
void L_time();
void L_time1();
int menu();

int main()
{
    int res;
    int a;
    struct sockaddr_in server_addr;//通信地址
    pthread_t id;//线程
    //创建客户端套接字
    client_fd = socket(AF_INET,SOCK_STREAM,0);
    if(client_fd < 0)
    {
        perror("socket");
        return -1;
    }
    printf("%d客户端上线\n",client_fd);
    perror("socket");
    //连接服务器前的准备
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //连接服务器
    res = connect(client_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
    if(res == -1)
    {
        perror("connect");
        return -1;
    }
    perror("connect");
next:
    do
    {
        a = menu();
        switch (a)
        {
        case 1:
            for(int i=3;i>0;i--)
            {
                cw_abc.type = 'D';
                printf("登陆(依次输入账号密码):");
                scanf("%d%s",&cw_abc.ID,cw_abc.passwd);
                getchar();
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                if(!strcmp(cr_abc.adm,"T"))
                {
                    printf("你已被提出群聊!联系管理员解除\n");
                    return 0;
                }
                printf("接收:%s\n",cr_abc.feedback);
                if(!strcmp(cr_abc.feedback,"该账号已登陆!"))
                    goto next;
                if(!strcmp(cr_abc.feedback,"登陆成功!"))
                {
                    strcpy(name,cr_abc.name);
                    count = 1;
                    tjz = cr_abc.tjz;
                    printf("登陆接收套接字:%d\n",tjz);
                    printf("count =%d\n",count);
                    break;
                }
                printf("你还有%d次机会\n",i-1);
                if(i==1)
                    count=2;
                if(count == 2)
                {
                    printf("错误次数过多已下线\n");
                    return -1;
                }
            }
            break;
        case 2:
            cw_abc.type = 'Z';
            printf("请输入你要注册的姓名和密码:\n");
            scanf("%s%s",cw_abc.name,cw_abc.passwd);
            getchar();
            send(client_fd,&cw_abc,sizeof(cw_abc),0);
            recv(client_fd,&cr_abc,sizeof(cr_abc),0);
            printf("注册成功你的账号为:%d\n",cr_abc.ID);
            printf("返回界面还是退出(y/n):");
            Y_N = getchar();
            if(Y_N == 'n')
                return 0;
            break;
        case 3:
            cw_abc.type = 'G';
            printf("请依次输入管理员账号和密码:");
            scanf("%d%s",&cw_abc.ID,cw_abc.passwd);
            getchar();
            send(client_fd,&cw_abc,sizeof(cw_abc),0);
            memset(cr_abc.feedback,0,50);
            recv(client_fd,&cr_abc,sizeof(cr_abc),0);
            printf("接收%s\n",cr_abc.feedback);
            if(!strcmp(cr_abc.feedback,"该账号不是管理员!"))
                goto next;
            if(!strcmp(cr_abc.feedback,"修改在线失败!"))
                goto next;
            if(!strcmp(cr_abc.feedback,"登陆成功!"))
            {
                adm1 = 1;
                tjz = cr_abc.tjz;
                strcpy(name,cr_abc.name);
                count = 1;
                adm = 1;
            }
                
            break;
        case 0:
            return 0;
            break;
        default:
            printf("输入错误,请重新输入:\n");
            break;
        }
        if(count == 1)
            break;
    } while (1);
    if(adm1 != 1)
    {
        while (1)
        {
            printf("\033[0;33m(1.私聊  2.群聊  3.注销账号 0.下线)\n");
            printf("请输入你的选择:\033[0m");
            scanf("%d",&a);
            getchar();
            switch (a)
            {
            case 1:
                cw_abc.type = 'S';
                printf("请输入要私聊的账号:\n");
                scanf("%d",&cw_abc.s_ID);
                getchar();
                if(cw_abc.s_ID==cw_abc.ID)
                {
                    printf("不能与本账户聊天\n");
                    continue;
                }
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                if(strcmp(cr_abc.feedback,"查询账号成功"))
                {
                    printf("出现错误:%s\n",cr_abc.feedback);
                    printf("请重新选择\n");
                    continue;
                }
                if(!cr_abc.online)
                {
                    printf("用户不在线请重新选择\n");
                    continue;
                }
                tjz = cr_abc.tjz;
                //创建线程
                res = pthread_create(&id,NULL,F_fun1,NULL);
                while (1)
                {
                    recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                    printf("%s\n{用户(%s)}:%s\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
                    if(!strcmp(cr_abc.t_buf,str))
                        break;
                }
                break;
            case 2:
                cw_abc.type = 'Q';
                //创建线程
                res = pthread_create(&id,NULL,F_fun,NULL);
                while (1)
                {
                    recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                    //printf("%s\n",cr_abc.t_buf);
                    if(!strcmp(cr_abc.adm,"T"))
                    {
                        printf("%s\n",cr_abc.t_buf);
                        return 0;
                    }
                    if(!strcmp(cr_abc.t_buf,str))
                        break;
                    if(!strcmp(cr_abc.adm,"1"))
                    {
                        L_time1();
                        printf("\033[0;36m%s\n\033[1;5;31;42m{用户(%s)}:%s\033[0m\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
                        continue;
                    }
                    printf("\033[0;36m%s\n\033[0;34m{用户(%s)}:%s\033[0m\n",cr_abc.L_time,cr_abc.name,cr_abc.t_buf);
                }
                break;
            case 3://注销账户
                cw_abc.type = 'z';
                printf("请依次输入你要注销账号的账号,姓名和密码:\n");
                scanf("%d",&a);
                if(a != cw_abc.ID)
                {
                    printf("该账号与本账号不同请重新选择\n");
                    break;
                }
                //是本账号就继续
                cw_abc.ID = a;
                scanf("%s%s",cw_abc.name,cw_abc.passwd);
                getchar();
                printf("你确定要注销么?(y/n)\n");
                Y_N = getchar();
                if(Y_N == 'n')
                    break;
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                printf("%s\n",cr_abc.feedback);
                if(!strcmp(cr_abc.feedback,"注销成功!"));
                {
                    printf("请重新登陆账号\n");
                    goto next;
                }
                break;
            case 0:
                return 0;
                break;
            default:
                printf("输入错误");
                break;
            }
        }
    }
    else
    {
        while(1){
            printf("1.禁言 2.解除禁言 3.踢人 4.解除踢人 0.退出管理(只执行一次)\n");
            scanf("%d",&a);
            getchar();
            switch (a)
            {
            case 1:
                cw_abc.type = 'J';
                printf("请输入要禁言人的名字\n");
                scanf("%s",cw_abc.t_buf);
                getchar();
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                printf("接收:%s\n",cr_abc.feedback);
                if(!strcmp(cr_abc.feedback,"查询账号成功"))
                {
                    printf("是否禁言[%s账号:%d](y/n)\n",cw_abc.t_buf,cr_abc.s_ID);
                    Y_N = getchar();
                    if(Y_N == 'n')
                        continue;
                    cw_abc.type = 'j';
                    cw_abc.s_ID = cr_abc.s_ID;
                    send(client_fd,&cw_abc,sizeof(cw_abc),0);
                    memset(cr_abc.feedback,0,50);
                    recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                    printf("%s\n",cr_abc.feedback);
                }
                break;
            case 2:
                cw_abc.type = 'J';
                printf("请输入要解除禁言人的名字\n");
                scanf("%s",cw_abc.t_buf);
                getchar();
                memset(cr_abc.feedback,0,50);
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                printf("接收:%s\n",cr_abc.feedback);
                if(!strcmp(cr_abc.feedback,"查询账号成功"))
                {
                    printf("是否解除禁言[%s账号:%d](y/n)\n",cw_abc.t_buf,cr_abc.s_ID);
                    Y_N = getchar();
                    if(Y_N == 'n')
                        continue;
                    cw_abc.type = 'X';
                    cw_abc.s_ID = cr_abc.s_ID;
                    send(client_fd,&cw_abc,sizeof(cw_abc),0);
                    memset(cr_abc.feedback,0,50);
                    recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                    printf("%s\n",cr_abc.feedback);
                }
                break;
            case 3:
                cw_abc.type = 'T';
                printf("请输入要踢那个账号\n");
                scanf("%d",&cw_abc.s_ID);
                getchar();
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                printf("接收:%s\n",cr_abc.feedback);
                if(!strcmp(cr_abc.feedback,"查询账号成功"))
                {
                    printf("是否要踢出[姓名:%s 账号:%d](y/n)",cr_abc.name,cw_abc.s_ID);
                    Y_N = getchar();
                    if(Y_N == 'n')
                        break;
                    cw_abc.type = 't';
                    send(client_fd,&cw_abc,sizeof(cw_abc),0);
                    memset(cr_abc.feedback,0,50);
                    recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                    printf("%s\n",cr_abc.feedback);
                }
                break;
            case 4:
                cw_abc.type = 'g';
                printf("要解除那个账号:\n");
                scanf("%d",&cw_abc.s_ID);
                send(client_fd,&cw_abc,sizeof(cw_abc),0);
                memset(cr_abc.feedback,0,50);
                recv(client_fd,&cr_abc,sizeof(cr_abc),0);
                printf("%s\n",cr_abc.feedback);
                break;
            case 0:
                return 0;
                break;
            default:
                printf("输入错误");
                break;
            }
        }
    }
    
    //创建线程
    // res = pthread_create(&id,NULL,F_fun,NULL);
    // while (1)
    // {
    //     recv(client_fd,r_buf,sizeof(r_buf),0);
    //     printf("\n接收:%s\n",r_buf);
    // }
    return 0;
}

//副线程
void *F_fun(void *p)
{
    printf("进入聊天室\n");
    while (1)
    {
        memset(cw_abc.t_buf,0,sizeof(cw_abc.t_buf));
        printf("发送(quit退出):");
        scanf("%s",cw_abc.t_buf);
        getchar();
        L_time();
        strcpy(cw_abc.name,name); 
        cw_abc.tjz = tjz;
        sprintf(cw_abc.feedback,"查询账号成功");
        //printf("发送套接字:%d\n",tjz);
        send(client_fd,&cw_abc,sizeof(cw_abc),0);
        if(!strcmp(cw_abc.t_buf,str))
            break;
        printf("\033[0;32m[*本用户*(%s)]:%s\033[0m\n",cw_abc.name,cw_abc.t_buf);
    }
}
void *F_fun1(void *p)
{
    printf("进入私聊\n");
    while (1)
    {
        memset(cw_abc.t_buf,0,sizeof(cw_abc.t_buf));
        cw_abc.type = 's';
        cw_abc.tjz = tjz;
        printf("[私聊]发送(quit退出私聊):\n");
        scanf("%s",cw_abc.t_buf);
        getchar();
        L_time();
        strcpy(cw_abc.name,name); 
        send(client_fd,&cw_abc,sizeof(cw_abc),0);
        if(!strcmp(cw_abc.t_buf,str))
            break;
        //printf("[*本用户*(%s)]:%s\n",cw_abc.name,cw_abc.t_buf);
    }
    
}
//时间
void L_time()
{
    time_t currentTime;//时间
    struct tm *localTime;
    // 获取当前系统时间
    currentTime = time(NULL);
    // 将当前时间转换为本地时间
    localTime = localtime(&currentTime);
    //显示时间
    printf("\033[0;36m%d-%02d-%02d %02d:%02d:%02d\033[0m\n",
        localTime->tm_year + 1900,
        localTime->tm_mon + 1,
        localTime->tm_mday,
        localTime->tm_hour,
        localTime->tm_min,
        localTime->tm_sec);
    sprintf(cw_abc.L_time,"%d-%02d-%02d %02d:%02d:%02d",
        localTime->tm_year + 1900,
        localTime->tm_mon + 1,
        localTime->tm_mday,
        localTime->tm_hour,
        localTime->tm_min,
        localTime->tm_sec);
}
void L_time1()
{
    time_t currentTime;//时间
    struct tm *localTime;
    // 获取当前系统时间
    currentTime = time(NULL);
    // 将当前时间转换为本地时间
    localTime = localtime(&currentTime);
    // //显示时间
    // printf("\033[0;36m%d-%02d-%02d %02d:%02d:%02d\033[0m\n",
    //     localTime->tm_year + 1900,
    //     localTime->tm_mon + 1,
    //     localTime->tm_mday,
    //     localTime->tm_hour,
    //     localTime->tm_min,
    //     localTime->tm_sec);
    sprintf(cr_abc.L_time,"%d-%02d-%02d %02d:%02d:%02d",
        localTime->tm_year + 1900,
        localTime->tm_mon + 1,
        localTime->tm_mday,
        localTime->tm_hour,
        localTime->tm_min,
        localTime->tm_sec);
}
//菜单
int menu()
{
    int a;
    printf("\033[0;34m+================================================================+\033[0m\n");
    printf("\033[0;34m|                                                                |\033[0m\n");
    printf("\033[0;34m|***********************\033[0;33m欢迎来到小辉聊天室\033[0;34m***********************|\033[0m\n");
    printf("\033[0;34m|                                                      版本:1.0 |\033[0m\n");
    printf("\033[0;34m|----------------------------------------------------------------|\033[0m\n");
    printf("\033[0;34m|                                                               |\033[0m\n");
    printf("\033[0;34m|                         \033[0;36m1.用户登录                            \033[0;34m|\033[0m\n");
    printf("\033[0;34m|                                                               |\033[0m\n");
    printf("\033[0;34m|                         \033[0;36m2.帐号注册                             \033[0;34m|\033[0m\n");
    printf("\033[0;34m|                                                               |\033[0m\n");
    printf("\033[0;34m|                         \033[0;33m3.管理员登录                           \033[0;34m|\033[0m\n");
    printf("\033[0;34m|                                                               |\033[0m\n");
    printf("\033[0;34m|                        \033[0;31m 0:退出聊天室                           \033[0;34m|\033[0m\n");
    printf("\033[0;34m|                                                               |\033[0m\n");
    printf("\033[0;34m+================================================================+\033[0m\n");
    printf("请输入你的选择:\n");
    scanf("%d",&a);
    return a;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值