电子词典的服务器端程序

摘要:
用了最少整整四天才完成这个工作,但是还是有点bug,记录下自己的代码。

程序功能简述:程序实现了多用户的注册,登录,查寻,历史查寻,退出功能,在对数据库读写和修改的时候设计只有登录的账号可以读写和修改与该登录账号相关的信息,每个账号的信息相对独立,这避免了多用户操作是对数据库访问的冲突。

用了最少整整四天才完成这个工作,但是还是有点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)] = '

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vcf格式文件转化为Excel(csv)格式文件(R语言的write.csv,write.table功能,Excel表的文件导入功能)Linux上的oracle巡检脚本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++中.cpp和.hpp的区别

原文地址:https://blog.csdn.net/qzx9059/article/details/89210571 c++中 cpp和hpp我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元。一个程序可以由一个编译单元组成,也可以由多个编译单元组成。一个.cpp对应一个.obj,然后将所有的.obj链接起来(通...

如何对list进行洗牌操作

标准库函数 std::random_shuffle 提供了一个洗牌功能,但是参数只能是随机迭代器。vector可以,但list不行。 那么如何对list进行洗牌呢?一个比较简单的方法就是先从list构造一个临时的vector,对此临时的vector进行洗牌,然后再把洗牌后的vector复制回原来的list中。 代码如下: template<typen...

编译预处理命令--define和ifdef的使用

这里将对常用的预处理命令进行学习。 一、宏定义  ·defined  格式:`defined     宏名      数值      或者 `define      宏名   注意:后面没有‘;‘,和单片机不一样; 二、文件包含处理 ·include  include 的格式在不同的编译器里是不一样的:  在quartus 中为:·include "def...

linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。 以下是一个插件式设计的示例: 1、主执行程序:main.cpp #include #include #include "SMSGamePlugin.h" int...

03点云文件常用格式转换(pcd,txt,ply,obj,stl)

1.  pcd转txt 1 #include <iostream> 2 #include <fstream> 3 #include <pcl/io/pcd_io.h> 4 5 int main(int argc, char *argv[]) 6 { 7 8 pcl::PointClou...

C++ -- VLD(Visual LeakDetector)内存泄露库的使用

https://blog.csdn.net/xp178171640/article/details/80828530https://blog.csdn.net/xiaoyafang123/article/details/83655356 VLD简介 由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一...