程序功能简述:程序实现了多用户的注册,登录,查寻,历史查寻,退出功能,在对数据库读写和修改的时候设计只有登录的账号可以读写和修改与该登录账号相关的信息,每个账号的信息相对独立,这避免了多用户操作是对数据库访问的冲突。
用了最少整整四天才完成这个工作,但是还是有点bug,记录下自己的代码。
整个电子词典是分块做的:包含的Dic_Server.c,Dic_Client.c,db.c,query.c,xprtcl.c,dict.h,xprtcl.h,dict.txt(单词文件)
下面是Dic_Server.c代码:主要用创建子进程实现服务器端的并发操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
#include <sqlite3.h>
#include <time.h>
#include "dict.h"
#include "xprtcl.h"
#define MY_PORT 8888
#define DATABASE "dict.db"
#define T_USERS "users" /* table name for login users */
#define T_HISTORY "history" /* table name for query history */
#define MAXLEN_SQL 256
extern int db_init();
extern void db_close();
extern int dictd_init();
extern int tbl_query_history(int, const char *);
extern int tbl_insert_users(const char *, const char *);
extern int login_users(const char *, const char *);
extern int query_dictionary(const char * ,const char *,char *);
void do_register(int connfd, xprotocol_t *packet)
{
uint16_t rc = RC_SUCCESS;
if (tbl_insert_users(packet->hdr.usrname, packet->data.req_register.passwd) < 0)
{
rc = RC_EREGISTER;
}
/* reuse the input packet buffer */
packet->hdr.cmd_type = RPL_Register;
packet->hdr.ret_code = rc;
/* send reply back to the client */
if (xp_send(connfd, packet) < 0) {
dprintf("xp_send error");
}
return;
}
void do_login(int connfd, xprotocol_t *packet)
{
uint16_t rc = RC_SUCCESS;
int login;
login = login_users(packet->hdr.usrname, packet->data.req_login.passwd);
if ( login < 0)
{
rc = RC_EREGISTER;
}
if(login == 1)
{
rc = RC_LOGINED;
}
/* reuse the input packet buffer */
packet->hdr.cmd_type = RPL_Login;
packet->hdr.ret_code = rc;
/* send reply back to the client */
if (xp_send(connfd, packet) < 0) {
dprintf("xp_send error");
}
return;
}
void do_query(int connfd, xprotocol_t *packet)
{
uint16_t rc = RC_SUCCESS;
char sqlstr[MAXLEN_SQL];
char *errmsg;
sqlite3 *g_db = NULL;
int result;
time_t timep;
struct tm *p;
char buf[100];
if(query_dictionary(packet->word_data.req_query.word,
"/mnt/hgfs/source test/Dictionary/dict.txt",packet->data.rpl_query.text) < 0)
{
rc = RC_EREGISTER;
}
time(&timep);
p = gmtime(&timep);
bzero(buf,100);
sprintf(buf,"%4d-%02d-%02d %02d:%02d:%02d",1900+p->tm_year, 1+p->tm_mon,p->tm_mday,
p->tm_hour,p->tm_min,p->tm_sec);
buf[sizeof(buf)] = '