在线英英词典
项目功能描述:
用户注册和登录验证:服务器端将用户信息和历史记录保存在数据库中,客户端填写用户名和密码,服务器端在数据库中查找、匹配、返回结果。
单词在线翻译:根据客户端输入的单词在字典文件中搜索,
历史记录查询:
项目分析:
项目流程:
定义数据库中表的结构;
定义消息结构体;
分析服务器和客户端流程;
编码实现。
第一步:
先在数据库中建立两个表: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=