Bootstrap

网络编程-在线英英词典项目

在线英英词典
项目功能描述:
用户注册和登录验证:服务器端将用户信息和历史记录保存在数据库中,客户端填写用户名和密码,服务器端在数据库中查找、匹配、返回结果。
单词在线翻译:根据客户端输入的单词在字典文件中搜索,
历史记录查询:
项目分析:
项目流程:
定义数据库中表的结构;
定义消息结构体;
分析服务器和客户端流程;
编码实现。
第一步:
先在数据库中建立两个表:usr和record
在这里插入图片描述usr表是用户账号信息表
record表是用户查询单词记录表
还有词典库:dict.txt
代码:
服务器:
dicts.h

/*===============================================
*   文件名称:dicts.h
*   创 建 者:     
*   创建日期:2022年09月18日
*   描    述:
================================================*/
 #ifndef _DICTS_H_
 #define _DICTS_H_
  #define N 64

  #define R 1//user register
  #define L 2//user login
  #define Q 3//user query
  #define H 4//user history

  #define DATABASE "my.db"
  //定义通信双方的信息结构体
  typedef struct {
   
      int type;
      char name[N];
      char  data[512];
  }MSG;
//服务器函数声明
int do_client(int acceptfd,sqlite3 *db);
void  do_register(int acceptfd,MSG *msg,sqlite3 *db);
int do_login(int acceptfd,MSG *msg,sqlite3 *db);
int  do_query(int acceptfd,MSG *msg,sqlite3 *db);
int do_history(int acceptfd,MSG *msg,sqlite3 *db);
int history_callback(void *arg,int f_num,char **f_value,char **f_name);
int do_searchword(int acceptfd,MSG *msg,char word[]);
int get_date(char *date);
#endif

dicts.c

/*===============================================
*   文件名称:dicts.c
*   创 建 者:     
*   创建日期:2022年09月18日
*   描    述:
================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>  
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sqlite3.h>
#include <signal.h>
#include <strings.h>
#include "dicts.h"

//服务器函数定义

int do_client(int acceptfd,sqlite3 *db)
{
   
    MSG msg;
    while(recv(acceptfd,&msg,sizeof(msg),0)>0)
    {
   
        printf("type:%d\n",msg.type);
        switch(msg.type)
        {
   
            case R:
                do_register(acceptfd,&msg,db);
                break;
            case L:
                do_login(acceptfd,&msg,db);
                break;
            case Q:
                do_query(acceptfd,&msg,db);
                break;
            case H:
                do_history(acceptfd,&msg,db);
                break;
            default:
                printf("Invalid data msg\n");
        }

    }
    printf("client exit.\n");
    close (acceptfd);
    exit(0);
    return 0;
}



void do_register(int acceptfd,MSG *msg,sqlite3*db)
{
   
    char *errmsg;
    char sql[1024]={
   0};

    //char **resultp;
    //int nrow,ncolumn;
    memset (sql,0,sizeof(sql));
    sprintf(sql,"insert into usr values('%s','%s')",msg->name,msg->data);
    printf("%s\n",sql);
  
    if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
    {
   
        printf("%s\n",errmsg);
        strcpy(msg->data,"usr name already exist.");
    }

    else
    {
   
        printf("client register ok!\n");
        strcpy(msg->data,"OK!");
    }

    if(send(acceptfd,msg,sizeof(MSG),0)<0)
    {
   
        perror("send");
        return ;
    }
    return ;

}
int  do_login(int acceptfd,MSG *msg,sqlite3 *db)
{
   
    char sql[1024]={
   0};
    char *errmsg;
    int nrow;
    int ncloumn;
    char**resultp;
    memset(sql,0,sizeof(sql));
    sprintf(sql,"select * from usr where name=
;