0
点赞
收藏
分享

微信扫一扫

Linux下基于数据库/TCP的网络聊天室项目

天涯学馆 03-10 20:30 阅读 3

服务器方面

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <time.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#define PORT 55556
#define IP "127.0.0.1"
#include <signal.h>
int max=0;
int cfd[20]={0};
int count=0;
struct per
{
    char siliao[256];//不在线----私聊
    char name[24];//姓名
    char zhanghao[24];//账号
    char passwd[24];//密码
    char type;//消息类型
    char Cmd[24];//管理员身份运行
    int id;//聊天对象的id
    char online[16];//在线状态
    char r_buf[128];//读取入的信息
    char w_buf[128];//写入的信息-----群聊
    int FD;
}per;
int Register();
int Log_on(int fd,int i);
int Log_off(int fd);
int Double(int fd);
int Signle(int fd);
void Fun();
int log_cmd(int fd,int i);//管理员登录
void chat_out(int fd);//踢人
void chat_no_speak(int fd);//禁言单个
MYSQL sql;
int main()
{
    mysql_init(&sql);
    signal(2,Fun);//通过监测服务器当输入ctrl+c时会运行Fun函数,来进行数据库内的数据清理
    //1.创建套接字
    int sfd=socket(AF_INET,SOCK_STREAM,0);
    if(sfd==-1)
    {
        perror("socket");
        return -1;
    }
    int val=1;//自动清理端口被占用
    setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
    setsockopt(sfd,SOL_SOCKET,SO_REUSEPORT,&val,sizeof(val));
    //2.绑定
    struct sockaddr_in s_addr;
    s_addr.sin_family=AF_INET;
    s_addr.sin_port=htons(PORT);
    s_addr.sin_addr.s_addr=inet_addr(IP);

    int res=bind(sfd,(struct sockaddr *)&s_addr,sizeof(s_addr));
    if(res==-1)
    {
        perror("bind");
        return -1;
    }
    //3.监听
    res=listen(sfd,20);
    if(res==-1)
    {
        perror("listen");
        return -1;
    }
    struct sockaddr_in c_addr;//用于连接时所需绑定的端口和ip
    socklen_t len=sizeof(c_addr);
    max=sfd;
    fd_set table;//创建操作表
    fd_set bf_table;//备份
    FD_ZERO(&bf_table);//清空操作表
    FD_SET(sfd,&bf_table);//将sfd添加到操作表中
    //1.创建并初始化中心结构体
    mysql_init(&sql);
    //2.连接结构体
    MYSQL *sqls=mysql_real_connect(&sql,"localhost","root","1","chat_room",0,NULL,0);
    if(&sqls==NULL)
    {
        printf("数据库连接失败\n");
        return -1;
    }
    //3.操作数据库
    char r_buf[128]={0};
    char w_buf[128]={0};
    while(1)
    {   
        table=bf_table;//将备份表里的内容给操作表
        res = select(max+1,&table,NULL,NULL,NULL);
        if(FD_ISSET(sfd,&table))//如果判断为真成立说明要连接
        {
            cfd[count]=accept(sfd,(struct sockaddr *)&c_addr,&len);
            max=(max>cfd[count])?max:cfd[count];
            //时刻保存select第一个参数是套接字中最大的
            FD_SET(cfd[count],&bf_table);
            count++;
            //把新连接的套接字放入备份表中
            if(res==1)//说明操作表内只有一个套接字 sfd
            {
                continue;
            }
        }
        //到此处说明操作表内不只一个套接字
        //有人要发消息情况
        int i=0;
        for(i=0;i<count;i++)//判断是谁发消息
        {
            if(FD_ISSET(cfd[i],&table))
            {
                memset(&per,0,sizeof(per));
                int a=read(cfd[i],&per,sizeof(per));
                printf("per.type = %c\n",per.type);
                if(a>0)
                {
                    switch(per.type)
                    {
                        case 't':chat_out(cfd[i]);write(cfd[i],&per,sizeof(per));break;
                        case '1':Register();write(cfd[i],&per,sizeof(per));break;//注册
                        case '2':Log_on(cfd[i],i);break;//登陆
                        case '3':Log_off(cfd[i]);write(cfd[i],&per,sizeof(per));break;//注销
                        case '4':Signle(cfd[i]);break;//私聊
                        case '5':
                            
                            per.FD=cfd[i];
                            char buf[128]={0};
                            sprintf(buf,"select 姓名 from chat_rooms where FD=%d;",per.FD);//通过FD找到后修改其行中FD,在线状态
                            mysql_query(&sql,buf);
                            MYSQL_RES *res=mysql_store_result(&sql);
                            //遍历出是谁的消息
                            char **p=mysql_fetch_row(res);
                            

                            int hang = mysql_num_rows(res);
                            int lie = mysql_num_fields(res);
                            for(int k=0;k<hang;k++)
                            {
                                for(int w=0;w<lie;w++)
                                {
                                        int hang = mysql_num_rows(res);
                                        char temp[128]={0};
                                        memset(temp,0,sizeof(temp));
                                        sprintf(temp,"%s说:",p[0]);
                                        strcat(temp,per.w_buf);
                                        sprintf(per.w_buf,temp,sizeof(temp));
                                        for(int r=0;r<20;r++)//所有人不管在不在线都发
                                        {
                                            if(k!=cfd[i])//除发的本人外都发送
                                            {
                                                write(cfd[r],&per,sizeof(per)); 
                                            }

                                        }
                                } 
                            }
                        break;//群聊
                        case 'g':log_cmd(cfd[i],i);break;
                    }
                }
                if(a==0)//说明对方有客户端离线
                {
                    FD_CLR(cfd[i],&bf_table);
                    char buf[128]={0};
                    sprintf(buf,"select * from chat_rooms where FD=%d;",cfd[i]);//通过FD找到后修改其行中FD,在线状态
                    mysql_query(&sql,buf);
                    MYSQL_RES *res=mysql_store_result(&sql);
                    int hang = mysql_num_rows(res);
                    if(hang != 0)
                    {
                        memset(per.online,0,sizeof(per.online));
                        sprintf(per.online,"离线");
                        char **p=mysql_fetch_row(res);
                        for(int k=0;k<count;k++)//除发的本人外都发送下线通知
                        {
                            if(k!=i)
                            {
                                per.type='5';//通过群聊的方式发送给别人
                                memset(per.w_buf,0,sizeof(per.w_buf));
                                sprintf(per.w_buf,"%s说:%s已下线",p[0],p[0]);
                                write(cfd[k],&per,sizeof(per));
                            }
                        }
    
                        sprintf(buf,"update chat_rooms set online='离线',FD=-1 where FD=%d;",cfd[i]);//通过查找FD修改相应的信息
                        mysql_query(&sql,buf);
                    }
                    for(int j=i;j<count;j++)//去除已下线的
                    {
                        cfd[j]=cfd[j+1];
                    }
                    count--; 
                }
            }
        }

    }
    return 0;
}
void chat_no_speak(int fd)//禁言单个
{
    //判断是否在线
    char buf[128]={0};
    sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);//通过FD找到后修改其行中FD,在线状态
    mysql_query(&sql,buf);
    MYSQL_RES *res=mysql_store_result(&sql);
    int hang = mysql_num_rows(res);
    if(hang!=0)//说明该账号存在
    {
        char **p=mysql_fetch_row(res);
        
        if(strcmp(p[4],"离线")==0)//说明该账号目前不在线
        {
            memset(per.zhanghao,0,sizeof(per.zhanghao));
            sprintf(per.zhanghao,"该账号目前不在线");
            per.type='g';//错误的话信息通过g发给客户端
        }
        else
        {
            sprintf(buf,"update chat_rooms set FD=-1, where 账号='%s';",per.zhanghao);//修改相应的信息
            mysql_query(&sql,buf);
            memset(per.zhanghao,0,sizeof(per.zhanghao));
            sprintf(per.zhanghao,"%s账号已被禁言",per.zhanghao);
        }
    }
}
void chat_out(int fd)//踢下线
{
    //判断是否在线
    char buf[128]={0};
    sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);//通过FD找到后修改其行中FD,在线状态
    mysql_query(&sql,buf);
    MYSQL_RES *res=mysql_store_result(&sql);
    int hang = mysql_num_rows(res);
    if(hang!=0)//说明该账号存在
    {
        char **p=mysql_fetch_row(res);
        
        if(strcmp(p[4],"离线")==0)//说明该账号目前不在线
        {
            memset(per.zhanghao,0,sizeof(per.zhanghao));
            sprintf(per.zhanghao,"该账号目前不在线");
            per.type='g';//错误的话信息通过g发给客户端
        }
        else
        {
            sprintf(buf,"update chat_rooms set FD=-1,online='离线' where 账号='%s';",per.zhanghao);//修改相应的信息
            mysql_query(&sql,buf);
            memset(per.zhanghao,0,sizeof(per.zhanghao));
            sprintf(per.zhanghao,"该账号已被清理下线");
            kill(atoi(p[5]),9);
        }
    }
}
int log_cmd(int fd,int i)//管理员登录
{
    char buf[128]={0};
    //查找表里的内容,判断账号是否存在
    memset(buf,0,sizeof(buf));
    sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);
    mysql_query(&sql,buf);
    MYSQL_RES *res=mysql_store_result(&sql);
    if(res==NULL)
    {
        printf("mysql_store_result异常\n");
    }
    int hang=mysql_num_rows(res);
    char**p=mysql_fetch_row(res);
    if(hang!=0)//说明账号存在
    {
        if(atoi(p[3])!=-1)
            {
                memset(per.w_buf,0,sizeof(per.w_buf));
                sprintf(per.w_buf,"账号已在线,请勿重复登陆");
                per.type='2';//账户错误的话走2渠道进行打印
                write(cfd[i],&per,sizeof(per));
            }
        if(strcmp(per.passwd,p[2])==0)//判读读取密码是否正确
        {
            //登陆成功后把FD和在线状态在库内进行更新------------------------
            memset(buf,0,sizeof(buf));
            per.FD=fd;
            sprintf(per.online,"在线");
            sprintf(buf,"update chat_rooms set FD=%d,online='%s',pid=%d where 账号='%s';",per.FD,per.online,per.id,per.zhanghao);//修改相应的信息
            mysql_query(&sql,buf);
            //客户端提示谁上线--------------------------------------------
            memset(buf,0,sizeof(buf));
            sprintf(buf,"select 姓名 from chat_rooms where 账号='%s';",per.zhanghao);
            mysql_query(&sql,buf);
            MYSQL_RES *res=mysql_store_result(&sql);
            int hang=mysql_num_rows(res);
            char **p=NULL;
            p=mysql_fetch_row(res);
            sprintf(per.name,"%s",p[0]);
            printf("%d号客户端:%s已上线\n",fd,per.name);
            memset(buf,0,sizeof(buf));
            char buf[128]={0};
            sprintf(buf,"select FD from chat_rooms where FD>0;");//通过FD找到后修改其行中FD,在线状态
            mysql_query(&sql,buf);
            res=mysql_store_result(&sql);
            if(res==NULL)
            {
                printf("mysql_store_result异常\n");
            }
            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"账号、密码正确");
            //账号密码正确走g通道
            memset(&per.type,0,sizeof(per.type));
            per.type='g';
            //把帐号密码信息写入密码内发给客户端------------------------------
            hang = mysql_num_rows(res);
            char **p1=NULL;
            for(int k=0;k<hang;k++)//除发的本人外都发送上线通知
            {
                char **p1=mysql_fetch_row(res);
                if(atoi(p1[0])!= fd)
                {
                    memset(&per.type,0,sizeof(per.type));
                    per.type='5';//通过群聊的方式发送给别人--------------
                    memset(per.w_buf,0,sizeof(per.w_buf));
                    sprintf(per.w_buf,"%d%s已上线,请文明交流避免被踢。",per.FD,p[0]);
                    write(atoi(p1[0]),&per,sizeof(per));
                }
            } 
        }
        else
        {
            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"账号或密码错误");
            per.type='2';//密码错误的话走2渠道进行打印
            write(cfd[i],&per,sizeof(per));
        }
    }
    else
    {
        memset(per.zhanghao,0,sizeof(per.zhanghao));
        sprintf(per.zhanghao,"账号或密码错误");
        per.type='2';//账户错误的话走2渠道进行打印
        write(cfd[i],&per,sizeof(per));
        //错误信息发送给本人
    }
}
int Register()//注册
{
    char buf[256]={0};
    //生成随机账号
    time_t t;
    t=time(NULL);
    t%=10000;
    sprintf(per.zhanghao,"%ld",t);
    int FD=-1;
    per.FD=FD;
    per.id=-1;
    sprintf(per.online,"离线");
    //将注册好的信息存入数据库
    memset(buf,0,sizeof(buf));
    sprintf(buf,"insert into chat_rooms values('%s','%s','%s',%d,'%s',%d);",per.name,per.zhanghao,per.passwd,per.FD,per.online,per.id);
    mysql_query(&sql,buf);
}
int Log_on(int fd,int i)//登陆
{
    char buf[128]={0};
    //查找表里的内容,判断账号是否存在
    memset(buf,0,sizeof(buf));
    sprintf(buf,"select * from chat_rooms where 账号='%s';",per.zhanghao);
    mysql_query(&sql,buf);
    printf("buf1 = %s\n",buf);
    MYSQL_RES *res=mysql_store_result(&sql);
    if(res==NULL)
    {
        printf("mysql_store_result异常\n");
    }
    int hang=mysql_num_rows(res);
    char**p=mysql_fetch_row(res);
    if(hang!=0)//说明账号存在
    {
        printf("p[3] = %s\n",p[3]);
        if(atoi(p[3])!=-1)
            {
                memset(per.w_buf,0,sizeof(per.w_buf));
                sprintf(per.w_buf,"账号已在线,请勿重复登陆");
                per.type='2';//账户错误的话走2渠道进行打印
                write(cfd[i],&per,sizeof(per));
            }
        if(strcmp(per.passwd,p[2])==0)//判读读取密码是否正确
        {
            //登陆成功后把FD和在线状态在库内进行更新------------------------
            memset(buf,0,sizeof(buf));
            per.FD=fd;
            sprintf(per.online,"在线");
            sprintf(buf,"update chat_rooms set FD=%d,online='%s',pid=%d where 账号='%s';",per.FD,per.online,per.id,per.zhanghao);//修改相应的信息
            mysql_query(&sql,buf);
            //客户端提示谁上线--------------------------------------------
            memset(buf,0,sizeof(buf));
            sprintf(buf,"select 姓名 from chat_rooms where 账号='%s';",per.zhanghao);
            mysql_query(&sql,buf);
            printf("buf2 = %s\n",buf);
            MYSQL_RES *res=mysql_store_result(&sql);
            int hang=mysql_num_rows(res);
            char **p=NULL;
            p=mysql_fetch_row(res);
            sprintf(per.name,"%s",p[0]);
            printf("%d号客户端:%s已上线\n",fd,per.name);
            memset(buf,0,sizeof(buf));
            char buf[128]={0};
            sprintf(buf,"select FD from chat_rooms where FD>0;");//通过FD找到后修改其行中FD,在线状态
            mysql_query(&sql,buf);
            res=mysql_store_result(&sql);
            if(res==NULL)
            {
                printf("mysql_store_result异常\n");
            }
            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"账号、密码正确");
            //把帐号密码信息写入密码内发给客户端------------------------------
            hang = mysql_num_rows(res);
            char **p1=NULL;
            for(int k=0;k<hang;k++)//除发的本人外都发送上线通知
            {
                char **p1=mysql_fetch_row(res);
                printf("%d\n",fd);
                if(atoi(p1[0])!= fd)
                {
                    memset(&per.type,0,sizeof(per.type));
                    per.type='5';//通过群聊的方式发送给别人--------------
                    memset(per.w_buf,0,sizeof(per.w_buf));
                    sprintf(per.w_buf,"%d号客户端%s已上线",per.FD,p[0]);
                    write(atoi(p1[0]),&per,sizeof(per));
                }
            } 
        }
        else
        {
            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"账号或密码错误");
            per.type='2';//密码错误的话走2渠道进行打印
            write(cfd[i],&per,sizeof(per));
        }
    }
    else
    {
        memset(per.zhanghao,0,sizeof(per.zhanghao));
        sprintf(per.zhanghao,"账号或密码错误");
        per.type='2';//账户错误的话走2渠道进行打印
        write(cfd[i],&per,sizeof(per));
        //错误信息发送给本人
    }
}
int Log_off(int fd)
{
    
    char buf[256]={0};
    //查找表里的内容,判断账号是否存在
    memset(buf,0,sizeof(buf));
    sprintf(buf,"select 密码 from chat_rooms where 账号='%s';",per.zhanghao);
    mysql_query(&sql,buf);
    MYSQL_RES *res=mysql_store_result(&sql);
    if(res==NULL)
    {
        printf("mysql_store_result异常\n");
    }
    int hang=mysql_num_rows(res);
    if(hang!=0)//说明账号存在
    {
        char **p=NULL;
        p=mysql_fetch_row(res);
        if(strcmp(per.passwd,p[0])==0)//判断读取密码是否正确
        {

            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"密码正确");
            memset(buf,0,sizeof(buf));
            sprintf(buf,"delete from chat_rooms where 账号='%s';",per.zhanghao);
            mysql_query(&sql,buf);
            sprintf(per.passwd,"账户注销完成");
        }
        else
        {
            memset(per.passwd,0,sizeof(per.passwd));
            sprintf(per.passwd,"密码错误");
        }
    }
    else
    {
        memset(per.zhanghao,0,sizeof(per.zhanghao));
        sprintf(per.zhanghao,"账号不存在");
        sprintf(per.passwd,"ERR");
    }
}

int Signle(int fd)
{   int n =0;
    //查找表里的内容,查找在线的人
    char buf[512]={0};
    memset(buf,0,sizeof(buf));
    sprintf(buf,"select * from chat_rooms where 账号=%s;",per.zhanghao);//通过账号找到FD
    //memset(per.zhanghao,0,sizeof(per.zhanghao));
    mysql_query(&sql,buf);

    MYSQL_RES *res=mysql_store_result(&sql);
    if(res==NULL)
    {
        printf("mysql_store_result异常\n");
    }
    int hang=mysql_num_rows(res);
    if(hang!=0)//说明已经通过行FD找到了账号
    {
        char **p=NULL;
        p = mysql_fetch_row(res);
        n =atoi(p[3]);
        if(atoi(p[3])==-1)//通过FD判断是否在线
        {
            memset(per.siliao,0,sizeof(per.siliao));
            sprintf(per.siliao,"该好友离线无法聊天");
        }
    }
    else//账号找不到的情况
    {
        sprintf(per.siliao,"没有该好友");
    }
    write(n,per.siliao,sizeof(per.siliao));
}

void Fun()
{
    char buf[128]={0};
    sprintf(buf,"update chat_rooms set FD=-1,online='离线',pid=-1 where FD>0;");//修改相应的信息
    mysql_query(&sql,buf);
    pid_t pid=getpid();
    kill(pid,9);
}

客户端

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define IP "127.0.0.1"
#define PORT 55556


int Register(void);//注册
int Log_on(void);//登陆
int Log_off(void);//注销
int Signle(void);//私聊
int  Double(void);//群聊
int Cmd(void);//管理员模式
int fd=0;
void *W_FUN(void *p);
void *R_FUN(void *p);
void print1(void);//一级目录
void print2(void);//二级目录
void print3(void);//三级目录
void siliao(void);
void chat_out(void);//踢出群聊
void chat_no_speak(void);//禁言
void chat_everybody_no_speak(void);//全体禁言
void chat_cancel_everybody_speak(void);//解除全体禁言
struct per
{
    char siliao[256];//不在线----私聊
    char name[24];//姓名
    char zhanghao[24];//账号
    char passwd[24];//密码
    char type;//消息类型
    char Cmd[24];//管理员身份运行
    int id;//聊天对象的id
    char online[16];//在线状态
    char r_buf[128];//读取入的信息
    char w_buf[128];//写入的信息-----群聊
    int FD;
}per;

int main()
{
    //1.创建套接字
    fd=socket(AF_INET,SOCK_STREAM,0);
    printf("fd = %d\n",fd);
    if(fd==-1)
    {
        perror("socket");
        return -1;
    }
    //2.连接
    struct sockaddr_in ser_addr;
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_addr.s_addr=inet_addr(IP);
    ser_addr.sin_port=htons(PORT);
    int res=connect(fd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));
    if(res==-1)
    {
        perror("connect");
        return -1;
    }
    printf("连接成功\n");
    //创建读写进程
    
    
    pthread_t r_id,w_id;
    pthread_create(&r_id,NULL,R_FUN,NULL);
    pthread_create(&w_id,NULL,W_FUN,NULL);

    pthread_join(r_id,NULL);
    pthread_join(w_id,NULL);
    return 0;
}
void print1(void)
{
    printf("----------------------------------------\n");
    printf("**************欢迎进入聊天室**************\n");
    printf("**************g.管理员身份运行*************\n");
    printf("**************1.注册账号*****************\n");
    printf("**************2.登陆账号*****************\n");
    printf("**************3.注销********************\n");
    printf("**************0.退出********************\n");
    printf("----------------------------------------\n");
}
void print2(void)
{
    printf("----------------------------------------\n");
    printf("**************选择聊天室模式**************\n");
    printf("**************4.私聊********************\n");
    printf("**************5.群聊********************\n");
    printf("**************0.退出*********************\n");
    printf("----------------------------------------\n");
}
void print3(void)
{
    printf("---------------------------------------\n");
    printf("**************管理员模式****************\n");
    printf("**************t.踢出群聊*****************\n");
    printf("**************j.单个禁言*********************\n");
    printf("**************e.全体禁言*********************\n");
    printf("**************J.解除单个禁言****************\n");
    printf("**************E.解除全部禁言****************\n");
    printf("**************0.退出********************\n");
    printf("----------------------------------------\n");
}
void chat_out(void)//踢出群聊
{
    printf("请输入你要踢的人的账号:\n");
    memset(&per.id,0,sizeof(per.id));
    pid_t pid=getpid();
    per.id=(int)pid;
    printf("%d\n",pid);
    memset(per.zhanghao,0,sizeof(per.zhanghao));
    scanf("%s",per.zhanghao);
    getchar();
    write(fd,&per,sizeof(per));
}
void chat_no_speak(void)//禁言
{

}
void chat_everybody_no_speak(void)//全体禁言
{

}
void chat_cancel_everybody_speak(void)//解除全体禁言
{

}
void *R_FUN(void *p)
 {
    time_t t=time(NULL);
    struct tm *tm=localtime(&t);

    struct per r_per;
    
    while(1)
    {
        t=time(NULL);
        p=localtime(&t);
        int a=0;
        memset(&r_per,0,sizeof(r_per));
        a=read(fd,&r_per,sizeof(r_per));
        //printf("per.type = %c\n",r_per.type);
        if(a==0)
        {
            close(fd);
            printf("退出\n");
            
            exit(0);
        }
        if(r_per.type=='1')
        {
            printf("账号创建完成,您的账号为\n");
            printf("%s\n",r_per.zhanghao);
            //print1();
        }
        if(r_per.type=='2')
        {
            if(strcmp(r_per.zhanghao,"账号或密码错误")==0||strcmp(r_per.passwd,"账号或密码错误")==0)
            {
                printf("账号密码有误\n");
                exit(0);
                //print1();
            }
            else if(strcmp(r_per.w_buf,"账号已在线,请勿重复登陆")==0)
            {
                printf("%s,已退出\n",r_per.w_buf);
                printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
                exit(0);
            }
            else
            {
                printf("%s\n",r_per.passwd);
                print2();
            }
        }
        if(r_per.type=='3')
        {
            printf("%s\n",r_per.zhanghao);
            printf("%s\n",r_per.passwd);
            //print1();
        }
        if(strlen(r_per.siliao)!=0)//私聊
        {
            if(strcmp(r_per.siliao,"没有该好友")==0)
            {

                printf("%s\n",r_per.siliao);
                printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
                exit(0);
            }
            else if(strcmp(r_per.siliao,"该好友离线无法聊天")==0)
            {
                printf("%s,已退出\n",r_per.siliao);
                printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
                exit(0);
            }
            
            else
            {
                printf("%s\n",r_per.siliao);
                printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
            }
        }
        if(r_per.type=='5')//群聊
        {
            printf("%s\n",r_per.w_buf);
            printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
            memset(r_per.w_buf,0,sizeof(r_per.w_buf));
        }
         if(r_per.type=='g')//管理员模式
         {
             if(strcmp(r_per.zhanghao,"账号或密码错误")==0||strcmp(r_per.passwd,"账号或密码错误")==0)
            {
                printf("账号密码有误\n");
                exit(0);
                //print1();
            }
            else if(strcmp(r_per.w_buf,"账号已在线,请勿重复登陆")==0)
            {
                printf("%s,已退出\n",r_per.w_buf);
                printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
                exit(0);
            }
            else
            {
                printf("%s\n",r_per.passwd);
                print3();
            }
         }
         if(r_per.type=='t')//群聊
        {
            printf("%s\n",r_per.zhanghao);
            printf("%d时:%d分:%d秒\n",tm->tm_hour,tm->tm_min,tm->tm_sec);
        }
    }
}                 
void *W_FUN(void *p)
{

    while(1)//一级目录循环
    {
        print1();
        memset(&per.type,0,sizeof(per.type));
        printf("请输入你的选择:\n");
        printf("输入0退出\n");
        char shuru[20];//避免先开始客户输入一位数以上的数字
        scanf("%s",shuru);
        int a=strlen(shuru);
        if(a!=1)
        {
            printf("输入有误\n");
            close(fd);
            exit(0);
        }
        per.type=shuru[0];
        getchar();
        if(per.type=='0')
        {
            close(fd);
            exit(0);
        }
        switch(per.type)
        {
            case 'g':
                    memset(per.zhanghao,0,sizeof(per.zhanghao));
                    printf("请输入账号\n");
                    scanf("%s",per.zhanghao);
                    getchar();
                    memset(per.passwd,0,sizeof(per.passwd));
                    printf("请输入密码\n");
                    scanf("%s",per.passwd);
                    getchar();
                    write(fd,&per,sizeof(per));
                    memset(&per.type,0,sizeof(per.type));
                    sleep(1);
                    Cmd();
                    break;//管理员模式
            case '1':Register();sleep(1);break;//注册
            case '2':Log_on();sleep(1);break;
            case '3':Log_off();break;//注销
        }
    }
}
int Register(void)//注册
{
    memset(per.zhanghao,0,sizeof(per.zhanghao));
    printf("请输入姓名\n");
    scanf("%s",per.name);
    getchar();
    memset(per.passwd,0,sizeof(per.passwd));
    printf("请输入密码\n");
    scanf("%s",per.passwd);
    getchar();
    write(fd,&per,sizeof(per));
} 
int Log_on(void)//登陆
{
    memset(&per.id,0,sizeof(per.id));
    pid_t pid=getpid();
    per.id=(int)pid;
    memset(per.zhanghao,0,sizeof(per.zhanghao));
    printf("请输入账号\n");
    scanf("%s",per.zhanghao);
    getchar();
    memset(per.passwd,0,sizeof(per.passwd));
    printf("请输入密码\n");
    scanf("%s",per.passwd);
    getchar();
    write(fd,&per,sizeof(per));
    print2();
    printf("请输入选择\n");
    scanf("%c",&per.type);
    getchar();
    switch(per.type)
    {
        case '4':printf("请输入你想要聊天的人的账号()\n");
                    memset(per.zhanghao,0,sizeof(per.zhanghao));
                    scanf("%s",per.zhanghao);
                    getchar();
                    write(fd,&per,sizeof(per));
                    siliao();
                    break;//私聊  
            case '5':Double();break;//群聊       
            case '0':memset(&per,0,sizeof(per));write(fd,&per,sizeof(per));printf("退出\n");exit(0);
            default :printf("选择有误\n");break;
    }
}
void siliao(void)
{
    while(1)
    {
        sleep(0.1);
        printf("输入bye退出私聊\n");
        memset(per.siliao,0,sizeof(per.siliao));
        scanf("%s",per.siliao);
        
        if(strcmp(per.siliao,"bye")==0)
        {
            memset(per.siliao,0,sizeof(per.siliao));
            sprintf(per.siliao,"私聊已结束");
            write(fd,&per,sizeof(per));
            break;
        }
        write(fd,&per,sizeof(per));
    }
}
int Log_off(void)//注销
{
    memset(&per.type,0,sizeof(per.type));
    per.type='3';
    memset(per.zhanghao,0,sizeof(per.zhanghao));
    printf("请输入你要注销的账号\n");
    scanf("%s",per.zhanghao);
    getchar();
    memset(per.passwd,0,sizeof(per.passwd));
    printf("请输入密码\n");
    scanf("%s",per.passwd);
    getchar();
    write(fd,&per,sizeof(per));
    sleep(1);
}

int  Double(void)//群聊
{
    while(1)
    {
        
        printf("输入bye退出:\n");
        memset(per.w_buf,0,sizeof(per.w_buf));
        scanf("%s",per.w_buf);
        getchar();
        per.type='5';
        write(fd,&per,sizeof(per));
        if(strcmp(per.w_buf,"bye")==0)
        {
            close(fd);
            exit(0);
        }
    }
}
int Cmd(void)//管理员模式
{
    while(1)
    {
        print3();
        printf("请输入你的选择:");
        memset(&per.type,0,sizeof(per.type));
        scanf("%c",&per.type);
        switch(per.type)
        {
            case 't':chat_out();break;
            //case 'j':break;
            //case 'J':break;
            //case 'J':break;
            case '0':printf("退出\n");exit(0);break;

        }
    }
}

Linux下基于数据库/TCP的网络聊天室项目_mysql


举报

相关推荐

0 条评论