C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看

1.功能演示

C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第1张图片

 C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第2张图片

 C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第3张图片

 C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第4张图片

 2.功能说明

大方向一共四个功能:

注册

登录

查询单词

查询历史记录

3.流程图

C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第5张图片

C语言数据库:基于tcp多进程的在线词典,有详细的步骤已经图解,欢迎大家来观看_第6张图片

3.功能实现

1.搭建程序框架

2.实现注册和登录功能

3.查单词

4.查历史记

4. 代码实现

服务器:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define ERRLOG(msg)                                         \
    do                                                      \
    {                                                       \
        printf("%s,%s,%d\n", __FILE__, __func__, __LINE__); \
        perror(msg);                                        \
        exit(-1);                                           \
    } while (0)

#define Z 1
#define D 2
#define Q 3
#define C 4
#define H 5
#define N 32
#define M 500

void handler(int x)
{
    wait(NULL);
}

typedef struct _msg{
    int xuanze;
    char name[N];
    char text[M];
}msg_t;

void do_register(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_login(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_chakan(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_history(int acceptfd,msg_t *msg,sqlite3 *my_db);

int main (int argc,const char *argv[])
{
    int socketfd=0;
    sqlite3 *my_db;
    int acceptfd=0;
    pid_t pid;
    msg_t msg;


    if((socketfd=socket(AF_INET,SOCK_STREAM,0))==-1){
            ERRLOG("sockfd error");
    }

    if(sqlite3_open("my.db",&my_db)!=SQLITE_OK){
        ERRLOG("open error");
    }

    struct sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
    socklen_t serveraddr_len=sizeof(serveraddr);

    if(bind(socketfd,(struct sockaddr*)&serveraddr,serveraddr_len)==-1){
        ERRLOG("bind errror");
    }

    if(listen(socketfd,5)==-1){
        ERRLOG("listen error");
    }

    signal(SIGCHLD,handler);

    while(1){
        if((acceptfd=accept(socketfd,NULL,NULL))==-1){
            ERRLOG("acceptfd error");
        }

        if((pid=fork())==-1){
            ERRLOG("创建进程失败");
        }else if(pid==0){
            while(recv(acceptfd,&msg,sizeof(msg_t),0)>0){
                printf("%s %s\n",msg.name,msg.text);

                switch (msg.xuanze){
                    case Z:
                        do_register(acceptfd,&msg,my_db);
                        break;
                    case D:
                        do_login(acceptfd,&msg,my_db);
                        break;
                    case H:
                      do_history(acceptfd,&msg,my_db);
                        break;
                    case C:
                        do_chakan(acceptfd,&msg,my_db);
                        break;
                }
            }
        }else{
            close(acceptfd);
        }

    }

   return 0;
}

void do_register(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
    char buff[600]={0};
    int ret=0;

    sprintf(buff,"insert into usr values('%s','%s')",msg->name,msg->text);

    if((ret=sqlite3_exec(my_db,buff,NULL,NULL,NULL))!=SQLITE_OK){
        memset(msg->text,0,sizeof(msg->text));
        strcat(msg->text,"error");
    }else{     
        memset(msg->text,0,sizeof(msg->text));
        strcat(msg->text,"注册成功");
    }

    if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send errro");
    }

    return ;
}

void do_login(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
    char buff[600]={0};
    int now=0;
    int column=0;
    char **result=NULL;
    int ret=0;


    sprintf(buff,"select * from usr where name='%s' and pass='%s'",msg->name,msg->text);

    if((ret=sqlite3_get_table(my_db,buff,&result,&now,&column,NULL))!=SQLITE_OK){
        printf("%s\n",sqlite3_errmsg(my_db));
    }

    if(now==1){
        memset(msg->text,0,sizeof(msg));
        strcat(msg->text,"登录成功");
    }else{
        memset(msg->text,0,sizeof(msg));
        strcat(msg->text,"error");
    }

    if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send error");
    }
    return;
}

void do_chakan(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
    FILE *fd;
    char data[300]={0};
    int i=0;
    int len=strlen(msg->text);
    int flag=0;
    char shijian[128]={0};
    int ret=0;
    char buff[600]={0};
    char word[32]={0};

    strcpy(word,msg->text);

    if((fd=fopen("dict.txt","r"))==NULL){
        ERRLOG("fopen error");
    }

    while(fgets(data,sizeof(data),fd)!=NULL){
        data[strlen(data)-2]='\0';
        if(strncmp(msg->text,data,len)==0){
            if(data[len+1]==' '){
                
                while(data[i]!=' '){
                    i++;
                }

                while(data[i]==' '){
                    i++;
                }

                strcpy(msg->text,&data[i]);
                printf("%s\n",msg->text);
                if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
                    ERRLOG("send errror");
                }
                flag=1;
                memset(msg->text,0,sizeof(msg->text));
                goto next;
            }
        }
        memset(data,0,sizeof(data));
    }

    memset(msg->text,0,sizeof(msg->text));
    strcpy(msg->text,"没有这个单词");

    if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send error");
    }

next: 

    if(flag==1){
        time_t t;
        struct tm *tm;

        if((t=time(NULL))==-1){
            ERRLOG("获取时间失败");
        }

        if((tm=localtime(&t))==NULL){
            ERRLOG("localtime error");
        }

        sprintf(shijian,"%04d:%02d:%02d %02d:%02d:%02d",tm->tm_year+1900,tm->tm_mon,tm->tm_mday,\
        tm->tm_hour,tm->tm_min,tm->tm_sec);

        sprintf(buff,"insert into shuju values('%s','%s','%s')",msg->name,shijian,word);

        if((ret=sqlite3_exec(my_db,buff,NULL,NULL,NULL))!=SQLITE_OK){
            ERRLOG("sqlite3 errror");
        }
    }
    return ;
}

int callback(void *argc,int column,char **f_name,char **f_value)
{   
    msg_t msg;
    memset(&msg,0,sizeof(msg));
    int acceptfd=*(int *)argc;
    
    sprintf(msg.text,"%s%s",f_name[1],f_name[2]);

    if(send(acceptfd,&msg,sizeof(msg),0)==-1){
        ERRLOG("send error");
    }

    return 0;
}

void do_history(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
    char buff[500]={0};
    int ret=0;
    sprintf(buff,"select * from shuju");

    if((ret=sqlite3_exec(my_db,buff,callback,(void *)&acceptfd,NULL))!=SQLITE_OK){
        printf("%s\n",sqlite3_errmsg(my_db));
    }

    memset(msg->text,0,sizeof(msg->text));
    strcpy(msg->text,"over");
    if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send error");
   }
   return ;
}

客户端

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define ERRLOG(msg)                                         \
    do                                                      \
    {                                                       \
        printf("%s,%s,%d\n", __FILE__, __func__, __LINE__); \
        perror(msg);                                        \
        exit(-1);                                           \
    } while (0)

#define Z 1
#define D 2
#define Q 3
#define C 4
#define H 5
#define N 32
#define M 500


typedef struct _msg{
    int xuanze;
    char name[N];
    char text[M];
}msg_t;

void do_regesister(int socketfd,msg_t *msg);
int do_login(int socketfd,msg_t *msg);
void do_chakan(int socketfd,msg_t *msg);
void do_history(int socketfd,msg_t *msg);

int main(int argc, const char *argv[])
{
    int socketfd = 0;
    int choose=0;
    msg_t msg;

    if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        ERRLOG("socket error");
    }

    struct sockaddr_in clientaddr;
    memset(&clientaddr,0,sizeof(clientaddr));
    clientaddr.sin_family=AF_INET;
    clientaddr.sin_port=htons(atoi(argv[2]));
    clientaddr.sin_addr.s_addr=inet_addr(argv[1]);
    socklen_t clientaddr_len=sizeof(clientaddr);

    if(connect(socketfd,(struct sockaddr*)&clientaddr,clientaddr_len)==-1){
        ERRLOG("connect error");
    }

    while(1){
        printf("***********************************************\n");
        printf("1注册                  2登录              3退出\n");
        printf("************************************************\n");
        printf("请输入你您的选择>");
        scanf("%d",&choose);
        getchar();

        switch(choose) {
            case Z:
                do_regesister(socketfd,&msg);
                break;
            case D:
                if(do_login(socketfd,&msg)==1){
                    goto next;
                }
                break;
            case Q:
                printf("欢迎下次使用\n");
                exit(-1);
                break;
        }
    }

next:

    while(1){
        printf("**********************************************************\n");
        printf("4查询******************5历史************************3退出\n");
        printf("**********************************************************\n");
        printf("请输入你您的选择>");
        scanf("%d",&choose);
        getchar(); 

        switch (choose){
            case C:
                do_chakan(socketfd,&msg);
                break;
            case H:
                do_history(socketfd,&msg);
                break;
            case Q:
                printf("欢迎下次使用\n");
                exit(-1);
                break;
        }
    }
    return 0;
}

void do_regesister(int socketfd,msg_t *msg)
{
    memset(msg,0,sizeof(msg_t));

    msg->xuanze=Z;
    printf("请输入您的用户名");
    scanf("%s",msg->name);
    printf("请输入您的密码");
    scanf("%s",msg->text);

    if(send(socketfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send error");
    }
    
    memset(msg->text,0,sizeof(msg->text));
    if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("recv errro");
    }
      
    
    if(strcmp(msg->text,"error")==0){
        printf("用户已经存在\n");
    }else{
        printf("注册成功\n");
    }
    
    return ;
}

int do_login(int socketfd,msg_t *msg)
{
    memset(msg,0,sizeof(msg_t));
    msg->xuanze=D;
    printf("请输入您的用户名");
    scanf("%s",msg->name);
    printf("请输入您的密码");
    scanf("%s",msg->text);

    if(send(socketfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send errror");
    }

    memset(msg->text,0,sizeof(msg->text));
    if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("recv error");
    }
   

    if(strcmp(msg->text,"error")==0){
        printf("登录失败,用户或者密码错误\n");
        return 0;
    }else{
        printf("登录成功\n");
        return 1;
    }
}

void do_chakan(int socketfd,msg_t *msg)
{
    while(1){
        memset(msg->text,0,sizeof(msg->text));
        msg->xuanze=C;
        printf("请输入您要查询的单词");
        scanf("%s",msg->text);

        if(send(socketfd,msg,sizeof(msg_t),0)==-1){
            ERRLOG("查询失败");
        }

        memset(msg->text,0,sizeof(msg->text));
        if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
            ERRLOG("recv error");
        }

        printf("[%s]\n",msg->text);
    }
    return;
}

void do_history(int socketfd,msg_t *msg)
{
    msg->xuanze=H;

    if(send(socketfd,msg,sizeof(msg_t),0)==-1){
        ERRLOG("send error");
    }

    while(1){
        memset(msg->text,0,sizeof(msg->text));
        if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
            ERRLOG("recv error");
        }


        if(strcmp(msg->text,"over")==0){
            break;
        }

        printf("%s\n",msg->text);
    }

    return ;
}

你可能感兴趣的:(c语言,服务器,运维,c语言,c#,数据库)