基于数据库及TCP网络编程实现的电子词典

目录

一、前言

二、项目介绍

三、功能实现

3.1. 用户注册

3.1.1 功能演示

3.1.2 功能函数实现

3.2. 用户登录

3.2.1 功能演示

3.2.2 功能函数实现

3.3. 查询单词

3.3.1 功能演示

3.3.2 功能函数实现

3.4. 历史查询

3.4.1 功能演示

3.4.2 功能函数实现

四、代码实现

4.1 服务器程序 server.c

4.2 客户端程序 client.c

五、总结


一、前言

        今天是培训的第62天,这两个月的时间里,先后学习了C语言、shell编程、makefile编程、数据结构、IO进程和网络编程,时间紧任务重,但只学习知识不去运用肯定是不行的,所以通过今天这个项目,对所学知识进行回顾和融会贯通,同样也是一个短期的成果展示。

二、项目介绍

        主要利用数据库和TCP网络编程,制作一个服务器和客户端程序,实现:一用户注册,二用户登录,三用户在线查询单词,四查询用户历史记录功能。

        服务器程序等待客户端连接,接收客户端发来的数据,根据不同的数据包类型,决定是执行注册操作、还是登录操作,如果是注册程序还需遍历数据库用户表,判断用户名是否重复注册,如果是登录操作还需与数据库用户表对比,判断用户名和密码是否匹配;接着如果用户登录成功,再根据数据包类型,决定执行单词查询操作,或者查询历史操作,并将期间该用户的查询到的单词数据库入表,以提供后续的查询历史操作。

        客户端程序提供可视化界面,提示用户按需求操作,根据用户选择组装相应的数据包发送给服务器,根据数据的应答数据包,显示对应的提示,用户登录成功后,跳转到单词查询的二级界面,以提供接下来的服务。

三、功能实现

3.1. 用户注册

3.1.1 功能演示

3.1.2 功能函数实现

        server.c

//用户注册函数
void do_register(int connectfd, msg_t *msg, sqlite3 *db)
{
	char sqlstr[STR_NUM] = {0};
	char *errmsg;

	//使用sqlite3_exec函数调用插入函数判断是否能够插入成功
	//由于用户名设置为主键,所以如果用户名已经存在就会报错
	sprintf(sqlstr, "INSERT INTO usr VALUES('%s', '%s')", msg->name, msg->data);
	if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		sprintf(msg->data, "User %s already exist!!!", msg->name);
	}
	else
	{
		strcpy(msg->data, "Register was successful!!!");
	}
	if (-1 == send(connectfd, msg, sizeof(msg_t), 0))
	{
		perror("fail to send");
		exit(-1);
	}
	return;
}

        client.c


//用户注册函数
void do_register(int socketfd, msg_t *msg)
{
	//指定操作码
	msg->type = REGISTER;
	//输入用户名
	printf("input your name:");
	scanf("%s", msg->name);
	//输入密码
	printf("input your password:");
	scanf("%s", msg->data);
	//发送数据
	if (-1 == send(socketfd, msg, sizeof(msg_t), 0))
	{
		p
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值