linux系统C语言开发一套类似于微信的网络聊天系统

此项目能完成的功能有以下几点
注册( 防止账号重复)
登陆( 防止重复登陆)
注销
群聊
私聊
时间显示(时间编程)
昵称显示
上下线提示
修改密码
聊天记录(数据库实现)
查看聊天记录
管理员: 禁言、 解禁、 权限转让
 

代码部分分为服务器和客户端两部分;

服务器部分代码如下(小部分未完善,不影响整体功能的使用)、

#include <sys/types.h>
#include <sys/socket.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/epoll.h>
#include <time.h>

struct all
{
    char id[20];    // 账号
    char pwd[20];   // 密码
    char info[100]; // 用户发送的消息
    char rev[100];  // 用户接受的消息
    char toid[20];  // 发送的id
    int gongneng;   // 功能选择
};

struct all r_info = {0}; // 用户发送的信息
char s_info[50] = {0};   // 服务器向客户端发送的消息
char tishi[50] = {0};
int s_fd;
int ser;                    // 错误判断
struct epoll_event lis[21]; // 句柄监听数组
int count;                  // 标志位
MYSQL *p = NULL;            // 核心结构体
MYSQL_RES *a = NULL;        // 转换体
int row = 0;                // 行数
int column = 0;             // 列数
char order[50] = {0};       // 指令拼接存放
int u_fd[20] = {0};         // 用户通信套接字存放
time_t r_tm;
int t_fd = 0;
void fun(void);
void printall(void);
int denglu(struct all r_info);
int lookfor_id(struct all r_info);
int check_speak(struct all r_info);

int main()
{
    //**************************************************服务器框架

    //*****************************************网络部分
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(11111);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");//ping自己
    ser = bind(s_fd, (const struct sockaddr *)&addr, sizeof(addr));
    if (ser == -1)
    {
        perror("bind");
    }
    ser = listen(s_fd, 20);
    if (ser == -1)
    {
        perror("listen");
    }
    printf("网络部分初始完成\n");

    //***********************************************句柄部分
    int e_id = epoll_create(1); // 创建句柄
    if (e_id == -1)
    {
        perror("epoll_create");
    }

    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = s_fd;
    ser = epoll_ctl(e_id, EPOLL_CTL_ADD, s_fd, &ev); // 添加句柄
    if (ser == -1)
    {
        perror("epoll_ctl");
    }
    struct sockaddr_in userfd;
    int size = sizeof(userfd);
    printf("句柄初始完成\n");

    p = mysql_init(NULL);                                                        // 创建核心体
    p = mysql_real_connect(p, "localhost", "root", "1", "userinfo", 0, NULL, 0); // 连接全部数据库
    if (p == NULL)
    {
        perror("mysql_real_connect");
    }
    while (1)
    {
        //**********************************************连接数据库部分

        int res = mysql_query(p, "select *from userinfo"); // 筛选目标数据库
        if (res != 0)
        {
            perror("mysql_query");
        }
        a = mysql_store_result(p); // 核心体转换为MYSQL_RES*类型
        row = mysql_num_rows(a);   // 行数
        if (row == -1)
        {
            perror("mysql_num_rows");
        }
        column = mysql_num_fields(a); // 列数
        if (column == -1)
        {
            perror("mysql_num_fields");
        }
        r_tm = time(NULL); // 时间编成部分
        struct tm *local = localtime(&r_tm);
        // printf("行:%d\t列:%d\n", row, column);
        // printf("数据库连接成功\n");
        //******************************************************************************套接字检测部分

        int f_count = epoll_wait(e_id, lis, 21, -1); // 创建套接字

        for (int i = 0; i < f_count; i++) // 遍历异动的套接字
        {
            if (lis[i].data.fd == s_fd && lis[i].events == EPOLLIN) // 用户连接服务器
            {

                t_fd = accept(s_fd, (struct sockaddr *)&userfd, &size);
                printf("用户%d已连接服务器\n", t_fd);
                struct epoll_event ev;
                ev.data.fd = t_fd;
                ev.events = EPOLLIN;
                ser = epoll_ctl(e_id, EPOLL_CTL_ADD, t_fd, &ev); // 添加句柄
            }

            if (lis[i].data.fd != s_fd && lis[i].events == EPOLLIN) // 收到用户发送消息
            {
                res = recv(lis[i].data.fd, &r_info, sizeof(r_info), 0);
                //**********************************************************************************客户端下线
                if (res == 0)
                {
                    epoll_ctl(e_id, EPOLL_CTL_DEL, lis[i].data.fd, NULL); // 将cfd[i],从数组中移除

                    for (int j = 0; j < count; j++)
                    {
                        if (u_fd[j] == lis[i].data.fd)
                        {
                            for (int m = j; m < count; m++)
                            {
                                u_fd[m] = u_fd[m + 1];
                            }
                            break;
                        }
                    }
                    count--;
                    printf("%d已退出\n", lis[i].data.fd);
                    char temp1[100] = {0};
                    char temp2[100] = {0};
                    char temp3[100] = {0};
                    sprintf(temp1, "update userinfo set chatflag=0  where tongxin='%d'", lis[i].data.fd);
                    sprintf(temp2, "update userinfo set logflag=0 where tongxin='%d'", lis[i].data.fd);
                    sprintf(temp3, "update userinfo set tongxin=0 where tongxin='%d'", lis[i].data.fd);
                    ser = mysql_query(p, temp1); // 退出时聊天状态标志位置0
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    ser = mysql_query(p, temp2); // 退出时登陆状态标志位置0
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    ser = mysql_query(p, temp3); // 退出时通信标志位置0
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    break;
                }

                if (strlen(r_info.info) != 0 && r_info.gongneng != 34 && r_info.gongneng >= 30) // 消息区不为空则转发消息给信息套接字数组
                {
                    int flag=check_speak(r_info);
                    if (flag==0)
                    {
                        char temp0[150] = {0};
                        sprintf(temp0, "你已被禁言");
                        send(lis[i].data.fd, temp0, sizeof(temp0), 0);
                        break;
                    }
                    for (int n = 0; n < count; n++)
                    {
                        if (u_fd[n] != lis[i].data.fd)
                        {
                            char temp0[150] = {0};
                            sprintf(temp0, "%d时%d分%d秒\n用户%d发送:%s", local->tm_hour, local->tm_min, local->tm_sec, lis[i].data.fd, r_info.info);
                            send(u_fd[n], temp0, sizeof(temp0), 0);
                        }
                    }
                    break;
                }
                if (strlen(r_info.info) != 0 && r_info.gongneng < 30) // 消息区不为空并且功能位为对方通信套接字
                {
                    int flag=check_speak(r_info);
                    if (flag==0)
                    {
                        char temp0[150] = {0};
                        sprintf(temp0, "你已被禁言");
                        send(lis[i].data.fd, temp0, sizeof(temp0), 0);
                        break;
                    }
                    
                    if (!strcmp(r_info.info, "quit")) // 收到quit不转发
                    {
                        break;
                    }
                    char temp0[150] = {0};
                    sprintf(temp0, "%d时%d分%d秒\n用户%d私聊你:%s", local->tm_hour, local->tm_min, local->tm_sec, lis[i].data.fd, r_info.info);
                    // sprintf(temp0, "用户%d私聊你:%s", lis[i].data.fd, r_info.info);
                    send(r_info.gongneng, temp0, sizeof(temp0), 0);
                    break;
                }

                if (r_info.gongneng == 30) //****************************************用户请求登陆
                {
                    int flag1 = denglu(r_info);
                    if (flag1 == 1)
                    {
                        char success[110] = {"登陆成功"};
                        printf("%d登陆成功\n", lis[i].data.fd);
                        send(lis[i].data.fd, success, sizeof(success), 0);
                        // char temp4[100] = {0};
                        // sprintf(temp4, "update userinfo set logflag=1 where id='%s'", r_info.id);
                        // ser = mysql_query(p, temp4); // 登陆成功登陆标志位置1
                        // if (ser != 0)
                        // {
                        //     perror("mysql_query");
                        // }
                        char temp5[100] = {0};
                        sprintf(temp5, "update userinfo set tongxin=%d where id='%s'", lis[i].data.fd, r_info.id);
                        ser = mysql_query(p, temp5); //  登陆成功通信套接字赋值
                        if (ser != 0)
                        {
                            perror("mysql_query");
                        }
                        break;
                    }
                    if (flag1 == 2)
                    {
                        char success[110] = {"管理员登陆成功"};
                        printf("%d管理员登陆成功\n", lis[i].data.fd);
                        send(lis[i].data.fd, success, sizeof(success), 0);
                        // char temp4[100] = {0};
                        // sprintf(temp4, "update userinfo set logflag=1 where id='%s'", r_info.id);
                        // ser = mysql_query(p, temp4); // 登陆成功登陆标志位置1
                        // if (ser != 0)
                        // {
                        //     perror("mysql_query");
                        // }
                        char temp5[100] = {0};
                        sprintf(temp5, "update userinfo set tongxin=%d where id='%s'", lis[i].data.fd, r_info.id);
                        ser = mysql_query(p, temp5); //  登陆成功通信套接字赋值
                        if (ser != 0)
                        {
                            perror("mysql_query");
                        }
                        break;
                    }
                    if (flag1 == -1)
                    {
                        char success[100] = {"登陆失败,检查该账号是否存在或密码是否正确\n"};
                        send(lis[i].data.fd, success, sizeof(success), 0);
                        break;
                    }
                }
                if (r_info.gongneng == 31) //****************************************用户请求注册
                {
                    int flag = lookfor_id(r_info);
                    if (flag != -1)
                    {
                        char success[50] = {"该账号已存在\n"};
                        send(lis[i].data.fd, success, sizeof(success), 0);
                        break;
                    }
                    char temp[100] = {0};
                    sprintf(temp, "insert into userinfo values('%s','%s',0,0,0,0,0)", r_info.id, r_info.pwd);
                    int ser = mysql_query(p, temp); // insert into 表名 values(第一列数据,第二列数据,第三列数据);
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    char success[50] = {"注册成功"};
                    printf("%d注册成功\n", lis[i].data.fd);
                    send(lis[i].data.fd, success, sizeof(success), 0);
                    break;
                }
                if (r_info.gongneng == 32) //****************************************用户请求注销
                {
                    int flag = lookfor_id(r_info);
                    if (flag == -1)
                    {
                        char success[50] = {"该账号不存在\n"};
                        send(lis[i].data.fd, success, sizeof(success), 0);
                        break;
                    }
                    char temp[100] = {0};
                    sprintf(temp, "delete from userinfo where id='%s' and password='%s'", r_info.id, r_info.pwd);
                    int ser = mysql_query(p, temp); // insert into 表名 values(第一列数据,第二列数据,第三列数据);
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    char success[50] = {"注销成功\n"};
                    printf("%d注销成功\n", lis[i].data.fd);
                    send(lis[i].data.fd, success, sizeof(success), 0);
                    break;
                }
                if (r_info.gongneng == 33) //****************************************用户请求加入聊天室
                {
                    u_fd[count] = lis[i].data.fd;
                    count++;
                    char temp[100] = {0};
                    sprintf(temp, "update userinfo set chatflag=1 where id='%s'", r_info.id);
                    int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                    printf("%d加入聊天室\n", lis[i].data.fd);
                    if (ser != 0)
                    {
                        perror("mysql_query");
                    }
                    break;
                }
                if (r_info.gongneng == 34) //****************************************用户请求修改密码
                {
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[1], r_info.pwd)))
                            {
                                char temp[200] = {0};
                                sprintf(temp, "update userinfo set password='%s' where id='%s'", r_info.info, r_info.id);
                                int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                                if (ser != 0)
                                {
                                    perror("mysql_query");
                                }
                                char success[50] = {"修改成功\n"};
                                send(lis[i].data.fd, success, sizeof(success), 0);
                                break;
                            }
                        }
                    }
                    char success1[50] = {"账号或密码输入错误\n"};
                    send(lis[i].data.fd, success1, sizeof(success1), 0);
                }
                if (r_info.gongneng == 35) //****************************************用户请求私聊
                {
                    int flag0 = 0;
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[2], "0")))
                            {
                                char success2[50] = {0};
                                sprintf(success2, "该用户不在线");
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                            // if ((!strcmp(r[2], "1")) && (!strcmp(r[3], "1")))
                            // {
                            //     char success3[50] = {0};
                            //     sprintf(success3, "该用户正在私聊中");
                            //     send(lis[i].data.fd, success3, sizeof(success3), 0);
                            //     // sl_fd[sl_count]=atoi(r[6]);
                            //     // sl_count++;
                            //     break;
                            // }
                            if (!strcmp(r[2], "1"))
                            {
                                char success1[50] = {0};
                                sprintf(success1, "%s", r[6]);
                                send(lis[i].data.fd, success1, sizeof(success1), 0);
                                // sl_fd[sl_count]=atoi(r[6]);
                                // sl_count++;
                                flag0 = 1;
                                break;
                            }
                        }
                    }
                    if (flag0 == 0)
                    {
                        char success1[50] = {"没有这个id号"};
                        send(lis[i].data.fd, success1, sizeof(success1), 0);
                    }
                }
                if (r_info.gongneng == 36) //****************************************管理员请求禁言
                {
                    int flag0 = 0;
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[5], "0")))
                            {
                                char temp[200] = {0};
                                sprintf(temp, "update userinfo set speakflag=1 where id='%s'", r_info.id);
                                int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                                if (ser != 0)
                                {
                                    perror("mysql_query");
                                }
                                char success2[50] = {0};
                                sprintf(success2, "用户%s已被禁言", r_info.id);
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                            if ((!strcmp(r[5], "1")))
                            {
                                char success2[60] = {0};
                                sprintf(success2, "用户%s已被禁言无需再次操作", r_info.id);
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                        }
                    }
                    if (flag0 == 0)
                    {
                        char success1[50] = {"没有这个id号"};
                        send(lis[i].data.fd, success1, sizeof(success1), 0);
                    }
                }
                if (r_info.gongneng == 37) //****************************************管理员请求解除禁言
                {
                    int flag0 = 0;
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[5], "1")))
                            {
                                char temp[200] = {0};
                                sprintf(temp, "update userinfo set speakflag=0 where id='%s'", r_info.id);
                                int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                                if (ser != 0)
                                {
                                    perror("mysql_query");
                                }
                                char success2[50] = {0};
                                sprintf(success2, "用户%s已被解除禁言", r_info.id);
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                            if ((!strcmp(r[5], "0")))
                            {
                                char success3[60] = {0};
                                sprintf(success3, "用户%s已解除禁言无需再次操作", r_info.id);
                                send(lis[i].data.fd, success3, sizeof(success3), 0);
                                flag0 = 1;
                                break;
                            }
                        }
                    }
                    if (flag0 == 0)
                    {
                        char success1[50] = {"没有这个id号"};
                        send(lis[i].data.fd, success1, sizeof(success1), 0);
                    }
                }
                if (r_info.gongneng == 38) //****************************************管理员请求下放管理员权限
                {
                    int flag0 = 0;
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[4], "0")))
                            {
                                char temp[200] = {0};
                                sprintf(temp, "update userinfo set manageflag=1 where id='%s'", r_info.id);
                                int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                                if (ser != 0)
                                {
                                    perror("mysql_query");
                                }
                                char success2[50] = {0};
                                sprintf(success2, "用户%s已拥有管理员权限", r_info.id);
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                            if ((!strcmp(r[4], "1")))
                            {
                                char success3[60] = {0};
                                sprintf(success3, "用户%s已是管理员", r_info.id);
                                send(lis[i].data.fd, success3, sizeof(success3), 0);
                                flag0 = 1;
                                break;
                            }
                        }
                    }
                    if (flag0 == 0)
                    {
                        char success1[50] = {"没有这个id号"};
                        send(lis[i].data.fd, success1, sizeof(success1), 0);
                    }
                }
                if (r_info.gongneng == 39) //****************************************管理员请求回收管理员权限
                {
                    int flag0 = 0;
                    char **r = NULL;
                    while (r = mysql_fetch_row(a))
                    {
                        if (!strcmp(r[0], r_info.id))
                        {
                            if ((!strcmp(r[4], "1")))
                            {
                                char temp[200] = {0};
                                sprintf(temp, "update userinfo set manageflag=0 where id='%s'", r_info.id);
                                int ser = mysql_query(p, temp); // update 表名 set 数据名=数据 where 判断条件;
                                if (ser != 0)
                                {
                                    perror("mysql_query");
                                }
                                char success2[50] = {0};
                                sprintf(success2, "用户%s已回收管理员权限", r_info.id);
                                send(lis[i].data.fd, success2, sizeof(success2), 0);
                                flag0 = 1;
                                break;
                            }
                            if ((!strcmp(r[4], "0")))
                            {
                                char success3[60] = {0};
                                sprintf(success3, "用户%s已被回收请勿重复操作", r_info.id);
                                send(lis[i].data.fd, success3, sizeof(success3), 0);
                                flag0 = 1;
                                break;
                            }
                        }
                    }
                    if (flag0 == 0)
                    {
                        char success1[50] = {"没有这个id号"};
                        send(lis[i].data.fd, success1, sizeof(success1), 0);
                    }
                }
            }
        }
    }
    mysql_close(p);
    return 0;
}
int check_speak(struct all r_info)
{
    char **r = NULL;
    while (r = mysql_fetch_row(a))
    {
        if (!strcmp(r[0], r_info.id))
        {
            if ((!strcmp(r[5], "1")))
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }
}
void printall(void)
{
    printf("%d   %d", row, column);
    MYSQL_FIELD *head = NULL; // 打印列头
    while (head = mysql_fetch_field(a))
    {
        printf("%s\t", head->name);
    }
    printf("\n");

    char **info = NULL; // 打印每一行数据
    while (info = mysql_fetch_row(a))
    {
        for (int i = 0; i < column; i++)
        {
            printf("%s\t", info[i]);
        }
        printf("\n");
    }
    return;
}
int lookfor_id(struct all r_info)
{
    int count = 0;
    char **r = NULL;
    while (r = mysql_fetch_row(a))
    {
        if (!strcmp(r[0], r_info.id))
        {
            return count;
        }
        count++;
    }
    return -1;
}
int denglu(struct all r_info)
{
    int count = 0;
    char **r = NULL;
    while (r = mysql_fetch_row(a))
    {
        if (!strcmp(r[0], r_info.id))
        {
            if ((!strcmp(r[1], r_info.pwd)) && (!strcmp(r[2], "0")) && (!strcmp(r[4], "0")))
            {
                char temp[100] = {0};
                sprintf(temp, "update userinfo set logflag=1 where id='%s'", r_info.id); // update 表名 set 数据名=数据 where 判断条件;
                // printf("用户登陆成功\n");
                int res = mysql_query(p, temp);
                if (res != 0)
                {
                    perror("mysql_query");
                }
                return 1;
            }
            if ((!strcmp(r[1], r_info.pwd)) && (!strcmp(r[2], "0")) && (!strcmp(r[4], "1")))
            {
                char temp1[100] = {0};
                sprintf(temp1, "update userinfo set logflag=1 where id='%s'", r_info.id); // update 表名 set 数据名=数据 where 判断条件;
                // printf("用户登陆成功\n");
                int res = mysql_query(p, temp1);
                if (res != 0)
                {
                    perror("mysql_query");
                }
                return 2;
            }

            return -1;
        }
    }
    return -1;
}

客户端部分代码如下

#include <sys/types.h>
#include <sys/socket.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/epoll.h>
#include <time.h>
struct all
{
    char id[20];    // 账号
    char pwd[20];   // 密码
    char info[100]; // 用户发送的消息
    char rev[100];  // 用户接受的消息
    char toid[20];  // 发送的id
    int gongneng;   // 功能选择
};
MYSQL *p = NULL;         // 核心结构体
MYSQL_RES *a = NULL;     // 转换体
int row = 0;             // 行数
int column = 0;          // 列数
struct all s_info = {0}; // 用户发送的信息
struct all user = {0};   // 用户信息
char rev[110] = {0};
int s_fd;
int ser;
pthread_t pid1 = 0;
pthread_t pid2 = 0;
char success[110] = {"登陆成功"};
void denglu(void);
void *fun1(void *lll);
void zhuce(void);
void zhuxiao(void);
void jiaru(void);
void caidan(void);
void xiugai(void);
void siliao(void);
void silioa2(void);
void jilu(void);
void sahnchujilu(void);
void glcaidan(void);
void jinyan(void);
void jiejin(void);
void xiafang(void);
void shouhui(void);
int main()
{
    printf("连接服务器中......\n");
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(11111);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    connect(s_fd, (const struct sockaddr *)&addr, sizeof(addr));
    printf("连接服务器成功!!!\n");

    printf("数据库连接中.........\n");
    p = mysql_init(NULL);                                                       // 创建核心体
    p = mysql_real_connect(p, "localhost", "root", "1", "message", 0, NULL, 0); // 连接全部数据库
    if (p == NULL)
    {
        perror("mysql_real_connect");
    }

    pthread_create(&pid1, NULL, fun1, NULL);

    while (1)
    {
        system("clear");
        printf("********************欢迎来到登陆界面\n");
        printf("********************请选择功能\n");
        printf("********************1:登陆\n");
        printf("********************2:注册\n");
        printf("********************0:退出\n");
        char choose = '0';
        scanf("%c", &choose);
        while (getchar() != '\n')
            ;

        switch (choose)
        {
        case ('1'):
            denglu();
            sleep(1);
            if (!strcmp(rev, "登陆成功"))
            {
                char temp[100] = {0};
                sprintf(temp, "create table A%s (message CHAR(150))", user.id);
                ser = mysql_query(p, temp);
                caidan();
            }
            if (!strcmp(rev, "管理员登陆成功"))
            {
                char temp[100] = {0};
                sprintf(temp, "create table A%s (message CHAR(150))", user.id);
                ser = mysql_query(p, temp);
                glcaidan();
            }
            break;
        case ('2'):
            zhuce();
            break;

            break;
        case ('4'):

            break;
        case ('0'):
            return 0;
        default:
            break;
        }
    }

    return 0;
}
void *fun1(void *lll)
{
    while (1)
    {
        recv(s_fd, rev, 110, 0);
        printf("%s\n", rev);
        char temp[160] = {0};
        sprintf(temp, "insert into A%s values('%s')", user.id, rev);
        ser = mysql_query(p, temp);
        // if (ser != 0)
        // {
        //     perror("mysql_query");
        // }
    }
}

void denglu(void)
{
    struct all info = {0};
    info.gongneng = 30; // 登陆功能1
    printf("请输入你的ID:");
    gets(info.id);
    printf("请输入你的密码:");
    gets(info.pwd);
    strcpy(user.id, info.id);
    strcpy(user.pwd, info.pwd);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void zhuce(void)
{
    struct all info = {0};
    info.gongneng = 31; // 注册功能2
    printf("请输入你要注册的ID:");
    gets(info.id);
    printf("请输入你注册的密码:");
    gets(info.pwd);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void glcaidan(void)
{
    while (1)
    {

        printf("********************请选择功能\n");
        printf("********************1:加入群聊\n");
        printf("********************2:私聊\n");
        printf("********************3:注销该id\n");
        printf("********************4:更改密码\n");
        printf("********************5:查看聊天和操作记录\n");
        printf("********************6:删除聊天和操作记录\n");
        printf("********************7:禁言\n");
        printf("********************8:解禁言\n");
        printf("********************9:下放管理员权限\n");
        printf("********************q:回收管理员权限\n");
        printf("********************0:退出\n");
        char choose = '0';
        scanf("%c", &choose);
        while (getchar() != '\n')
            ;
        switch (choose)
        {
        case ('1'):
            printf("输入quit退出群聊\n");
            jiaru();
            system("clear");
            break;
        case ('2'):
            siliao();
            sleep(1);
            if (!strcmp(rev, "该用户不在线") || !strcmp(rev, "没有这个id号") || !strcmp(rev, "该用户正在私聊中"))
            {
                break;
            }
            silioa2();
            system("clear");
            break;
        case ('3'):
            zhuxiao();
            system("clear");
            return;
        case ('4'):
            xiugai();
            system("clear");
            break;
        case ('5'):
            jilu();
            break;
        case ('6'):
            sahnchujilu();
            break;
        case ('7'):
            jinyan();
            break;
        case ('8'):
            jiejin();
            break;
        case ('9'):
            xiafang();
            break;
        case ('q'):
            shouhui();
            break;
        case ('0'):
            return;
        default:
            break;
        }
    }
}
void xiafang(void)
{
    struct all info = {0};
    info.gongneng = 38; // 管理员下方权限功能38
    printf("请输入你下放权限的ID:");
    gets(info.id);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void shouhui(void)
{
    struct all info = {0};
    info.gongneng = 39; // 管理员收回权限功能39
    printf("请输入你回收权限的ID:");
    gets(info.id);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void jinyan(void)
{
    struct all info = {0};
    info.gongneng = 36; // 禁言功能36
    printf("请输入你要禁言的ID:");
    gets(info.id);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void jiejin(void)
{
    struct all info = {0};
    info.gongneng = 37; // 解开禁言功能37
    printf("请输入你解禁的ID:");
    gets(info.id);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void caidan(void)
{
    while (1)
    {

        printf("********************请选择功能\n");
        printf("********************1:加入群聊\n");
        printf("********************2:私聊\n");
        printf("********************3:注销该id\n");
        printf("********************4:更改密码\n");
        printf("********************5:查看聊天和操作记录\n");
        printf("********************6:删除聊天和操作记录\n");
        printf("********************0:退出\n");
        char choose = '0';
        scanf("%c", &choose);
        while (getchar() != '\n')
            ;
        switch (choose)
        {
        case ('1'):
            printf("输入quit退出群聊\n");
            jiaru();
            system("clear");
            break;
        case ('2'):
            siliao();
            sleep(1);
            if (!strcmp(rev, "该用户不在线") || !strcmp(rev, "没有这个id号") || !strcmp(rev, "该用户正在私聊中"))
            {
                break;
            }
            silioa2();
            system("clear");
            break;
        case ('3'):
            zhuxiao();
            system("clear");
            return;
        case ('4'):
            xiugai();
            system("clear");
            break;
        case ('5'):
            jilu();
            break;
        case ('6'):
            sahnchujilu();
            break;
        case ('0'):
            return;
        default:
            break;
        }
    }
}

void jilu(void)
{
    char temp[50] = {0};
    sprintf(temp, "select *from A%s", user.id);
    printf("%s\n", temp);
    int res = mysql_query(p, temp); // 筛选目标数据库
    if (res != 0)
    {
        perror("mysql_query");
    }
    a = mysql_store_result(p); // 核心体转换为MYSQL_RES*类型
    row = mysql_num_rows(a);   // 行数
    if (row == -1)
    {
        perror("mysql_num_rows");
    }

    char **r = NULL;
    while (r = mysql_fetch_row(a))
    {
        printf("%s\n", r[0]);
    }
    printf("一共有%d行消息\n", row);
    printf("按任意建返回.....\n");
    getchar();
    // getchar();
}
void sahnchujilu(void)
{
    char choose = '0';
    printf("是否要删除所有记录y/n:");
    scanf("%c", &choose);
    while (getchar() != '\n')
        ;
    if (choose == 'y')
    {
        char temp[50] = {0};
        sprintf(temp, "drop table A%s", user.id);
        ser = mysql_query(p, temp);
        if (ser != 0)
        {
            perror("mysql_query");
        }
        printf("删除成功\n");
        sleep(1);
    }
    else
    {
        return;
    }

    // drop table 表名;
}
void siliao(void)
{
    struct all info = {0};
    info.gongneng = 35; // 私聊功能6
    printf("请输入你想要私聊用户的id:");
    gets(info.id);
    send(s_fd, (const void *)&info, sizeof(info), 0);
}
void silioa2(void)
{
    printf("和用户连接成功\n");
    struct all info = {0};
    int slfd = atoi(rev);
    info.gongneng = slfd;
    printf("请输入你要私聊的内容\n");
	strcpy(info.id,user.id);
    while (1)
    {
        gets(info.info);
        send(s_fd, (const void *)&info, sizeof(info), 0);
        if (!strcmp(info.info, "quit"))
        {
            return;
        }
        char temp[150] = {0};
        sprintf(temp, "insert into A%s values(%s)", user.id, info.info);
        ser = mysql_query(p, temp);
        // if (ser != 0)
        // {
        //     perror("mysql_query");
        // }
        // insert into 表名 values(第一列数据,第二列数据,第三列数据);
    }
}
void xiugai(void)
{
    struct all info = {0};
    char temp[20] = {0};
    info.gongneng = 34; // 修改密码功能5
    printf("请输入你的ID:");
    gets(info.id);
    printf("请输入你的密码:");
    gets(info.pwd);
    printf("请输入你修改后的密码:");
    gets(info.info);
    printf("请再次输入你修改后的密码:");
    gets(temp);
    if (!strcmp(temp, info.info))
    {
        send(s_fd, (const void *)&info, sizeof(info), 0);
        return;
    }
    printf("两次输入密码不同,请重新输入\n");
    sleep(1);
}
void zhuxiao(void)
{
    // struct all info = {0};
    user.gongneng = 32; // 注销功能3
    char choose = '0';
    printf("是否要注销该账号y/n:");
    scanf("%c", &choose);
    while (getchar() != '\n')
        ;
    if (choose == 'y')
    {
        send(s_fd, (const void *)&user, sizeof(user), 0);
    }
}
void jiaru(void)
{
    user.gongneng = 33; // 加入聊天室4
    send(s_fd, (const void *)&user, sizeof(user), 0);
    printf("加入成功!\n");
    while (1)
    {
        gets(user.info);
        send(s_fd, (const void *)&user, sizeof(user), 0);
        if (!strcmp(user.info, "quit"))
        {
            return;
        }
        char temp[150] = {0};
        sprintf(temp, "insert into A%s values('%s')", user.id, user.info);
        ser = mysql_query(p, temp);
        // if (ser != 0)
        // {
        //     perror("mysql_query");
        // }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值