网络编程项目:电子辞典

项目要求:

  1. 登录注册功能,不能重复登录,重复注册。用户信息也存储在数据库中。
  2. 单词查询功能
  3. 历史记录功能,存储单词,意思,以及查询时间,存储在数据库
  4. 基于TCP,支持多客户端连接(多进程、多线程、多路复用)
  5. 采用数据库保存用户信息与历史记录
  6. 将dict.txt的数据导入到数据库中保存。
  7. 返回上级、按下ctrl+c退出客户端后,该客户端退出登录

server.c

int do_register(int sockfd, MSG_T *msg, sqlite3 *db);
int do_login(int sockfd, MSG_T *msg, sqlite3 *db);
int do_searchword(MSG_T *msg, char *word);
int do_query(int sockfd, MSG_T *msg, sqlite3 *db);
int history_callback(void *arg, int colCount, char **colValue, char **colName);
int do_history(int sockfd, MSG_T *msg, sqlite3 *db);
int do_client(int acceptfd, sqlite3 *db);int main(int argc, const char *argv[])
{int sockfd, acceptfd;struct sockaddr_in server_addr;struct sockaddr_in client_addr;socklen_t addrlen = sizeof(client_addr);char ip_addr[16]; //存放ip地址sqlite3 *db = NULL;char *errmsg = NULL;char sql[1024] = "";pid_t pid;//数据库操作if (sqlite3_open(DATABASE, &db) != SQLITE_OK) //打开数据库{printf("%s\n", sqlite3_errmsg(db));return -1;}sprintf(sql, "create table if not exists user(name text primary key, passwd text);");if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) //创建用户表{printf("%s\n", errmsg);return -1;}memset(sql, 0, sizeof(sql));sprintf(sql, "create table if not exists record(name text, date text, word text);");if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) //创建记录表{printf("%s\n", errmsg);return -1;}// 申请socketif ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("fail to socket\n");return -1;}server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("192.168.3.107");server_addr.sin_port = htons(8888);bzero(&(server_addr.sin_zero), sizeof(server_addr.sin_zero));//绑定套接字if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0){perror("bind error\n");return -1;}//将套接字设为监听模式if (listen(sockfd, 5) < 0){perror("listen error\n");exit(1);}printf("listen success.\n");//处理僵尸进程signal(SIGCHLD, SIG_IGN);while (1){//接收客户端的连接请求if ((acceptfd = accept(sockfd, (struct sockaddr *)&client_addr, &addrlen)) < 0){perror("accept error\n");return -1;}if (inet_ntop(AF_INET, &client_addr.sin_addr, ip_addr, addrlen) < 0){perror("inet_ntop error\n");return -1;}printf("client(%s:%d) is connected!\n", ip_addr, htons(client_addr.sin_port));//创建子进程if ((pid = fork()) < 0){perror("fork error\n");return -1;}else if (pid == 0) //子进程,处理客户端请求{close(sockfd);do_client(acceptfd, db);}else //父进程,用来接收客户端的连接请求{close(acceptfd); }}return 0;
}

client.c

int do_register(int sockfd, MSG_T *msg)
int do_login(int sockfd, MSG_T *msg)
int do_query(int sockfd, MSG_T *msg)
int do_history(int sockfd, MSG_T *msg)
int main(int argc, const char *argv[])
{int sockfd;struct sockaddr_in server_addr;int input_nbr;MSG_T send_msg;// 申请socketif ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket error\n");return -1;}	server_addr.sin_family  = AF_INET;server_addr.sin_addr.s_addr = inet_addr("192.168.3.107");server_addr.sin_port = htons(8888);bzero(&(server_addr.sin_zero), sizeof(server_addr.sin_zero));//连接服务器if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) < 0){perror("connect error\n");return -1;}while (1){printf("***********************************************\n");printf("\t  1.注册   2.登录   3.退出  \n");printf("***********************************************\n");printf("请选择功能:");scanf("%d", &input_nbr);getchar();//回收垃圾字符// 一级菜单switch (input_nbr){case 1:do_register(sockfd, &send_msg);break;case 2:if (do_login(sockfd, &send_msg) == 1){goto _login;}break;	case 3:close(sockfd);exit(0);break;default:printf("请输入正确的选项 \n");break;}}//二级菜单,登录后进行单词查询
_login:while(1){system("clear");printf("***********************************************\n");printf("\t   1.查询单词  2.历史查询  3.退出\n");printf("***********************************************\n");printf("请选择功能:");input_nbr = 0;scanf("%d", &input_nbr);getchar();//回收垃圾字符switch (input_nbr){case 1:do_query(sockfd, &send_msg);break;case 2:do_history(sockfd, &send_msg);break;case 3:close(sockfd);exit(0);break;default:printf("input_nbr error\n");break;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++引用(内含和指针的对比)

1.引用的概念 概念&#xff1a;引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用一块内存空间。 类型& 引用变量名(对象名) 引用实体&#xff1b;&#xff08;&这个符…

leetcode 394. 字符串解码

本题主要思路是使用两个栈&#xff1a;一个用于存储倍数&#xff08;数字&#xff09;&#xff0c;另一个用于存储解码结果&#xff08;字符串&#xff09;。在遍历输入字符串时&#xff0c;根据不同的字符执行相应的操作&#xff0c;最终得到解码后的字符串。 具体来说&#x…

从零开始实现消息队列(二)

从零开始实现消息队列 .核心API交换机类型持久化网络通信Connection和Channel 消息应答模块划分 . 核心API 对于Broker来说,要实现以下核心API,通过这些API来实现消息队列的基本功能. 创建队列(queueDeclare)销毁队列(queueDelete)创建交换机(exchangeDeclare)销毁交换机(exc…

Duilib List 控件学习

这是自带的一个示例; 一开始运行的时候List中是空的,点击Search按钮以后就填充列表框; 先看一下列表框列头是在xml文件中形成的; <List name="domainlist" bkcolor="#FFFFFFFF" ... menu="true"> <ListHeader height="24…

中国电子学会2019年3月份青少年软件编程Scratch图形化等级考试试卷三级真题(选择题、判断题)

一、单选题(共 25 题&#xff0c;每题 2 分&#xff0c;共 50 分) 1. 要使以下代码运行后画出如图所示三角形风车,则以下代码中①②③④处应分别填入多少?( ) A.3 4 90 120 B.4 3 90 120 C.3 4 120 90 D.4 3 120 90 2.运行下列脚本&#xff0c;i的值为&#xff08; &am…

VitePress-14- 配置-titleTemplate 的作用详解

作用描述 1、titleTemplate 是标题的后缀&#xff1b;2、可以自定义标题的后缀&#xff1b;3、可以自定义整个的标题以及后缀&#xff0c;语法如下&#xff1a; titleTemplate: :title 链接符号 自己定义的后缀 【:title】&#xff1a;从页面的第一个 <h1> 标题推断出的…

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置

第一步&#xff1a;导入 import promptAction from ohos.promptAction 第二步&#xff1a;在build下方写入 pageTransition(){PageTransitionEnter({ duration: 1200 }).slide(SlideEffect.Right)PageTransitionExit({ delay: 100 }).translate({ x: 100.0, y: 100.0 }).opac…

统计数字出现次数的数位动态规划解法-数位统计DP

在处理数字问题时,我们经常遇到需要统计一定范围内各个数字出现次数的情况。这类问题虽然看起来简单,但当数字范围较大时,直接遍历统计的方法就变得不再高效。本文将介绍一种利用数位动态规划(DP)的方法来解决这一问题,具体来说,是统计两个整数a和b之间(包含a和b)所有…

掌握Go的加密技术:crypto/rsa库的高效使用指南

掌握Go的加密技术&#xff1a;crypto/rsa库的高效使用指南 引言crypto/rsa 库概览RSA 加密算法基本原理crypto/rsa 库的功能和应用 安装和基本设置在 Go 项目中引入 crypto/rsa 库基本环境设置和配置 密钥生成与管理生成 RSA 密钥对密钥存储和管理 加密和解密操作使用 RSA 加密…

代码随想录算法训练营第五十天|518. 零钱兑换Ⅱ

518. 零钱兑换Ⅱ 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路 本题相当于求装满容量为amount的背包有多少种方法&#xff0c;又由于零钱可以重复使用&#xff0c;属于完全背包的题型。将01背包完全装满的思路在494. 目…

【Redis快速入门】初识Redis、Redis安装、图形化界面

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

【Java程序设计】【C00259】基于Springboot的人事管理系统(有论文)

基于Springboot的人事管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的人事管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后&#xff0c;可以对首页&a…

在vscode 中配置 pyside6 环境

在vscode中编写pyside环境配置 start 记录一下在 vscode 中编写 pyside6 程序&#xff0c;环境如何配置。 前提 请自行安装好 python。请自行安装好 vscode。安装 vscode 插件 Python&#xff0c;PYQT Integration。 配置环境 1.借助 pip 安装我们的pyside6 pip install…

【PowerShell】修改Windows网络配置的常用命令

PowerShell&#xff08;PS&#xff09;是一种强大的任务自动化和管理框架&#xff0c;具有丰富的命令和语法&#xff0c;可以用于编写脚本来管理Windows操作系统和其他应用程序。它的开放式架构和跨平台支持使得它成为一个灵活和可扩展的工具。 在网络配置方面&#xff0c;Powe…

python - 模块使用详解

前言 Python有非常强大的第三方库&#xff0c;也有非常多的内置模块帮助开发人员实现某些功能&#xff0c;无需开发人员自己造轮子。本文介绍Python的模块。 什么是模块 模块简单来说就是一系列功能的集合体&#xff0c;如果将程序的开发比喻成拼图&#xff0c;模块就是各种…

PHP特性知识点总结

如果想观感更好看到图片,可以去我的gitbook或者github去看 github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun gitbook:http://22kaka.fun description: 专门出的关于php的特性比较,后面好像也有java的特性。 🏀 PHP特性知识点…

【开源】JAVA+Vue.js实现森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

如果把vue组件动态添加到body上?

tools.js: import Vue from vue/*** param Component 组件实例的选项对象* param props 组件实例中的prop*/ export function create(Component, props) {const comp new (Vue.extend(Component))({ propsData: props }).$mount()document.body.appendChild(comp.$el)comp.re…

中国电子学会2019年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(选择题、判断题)

一、单选题(共 25 题&#xff0c;每题 2 分&#xff0c;共 50 分) 1.怎样修改图章的颜色&#xff1f;&#xff08; &#xff09; A. 只需要一个数字来设置颜色 B. 设置 RGB 的值 C. 在画笔中设置颜色、饱和度、亮度 D. 在外观中设置或修改角色颜色特效 2.以下程序的执…

用code去探索理解Llama架构的简单又实用的方法

除了白月光我们也需要朱砂痣 我最近也在反思&#xff0c;可能有时候算法和论文也不是每个读者都爱看&#xff0c;我也会在今后的文章中加点code或者debug模型的内容&#xff0c;也许还有一些好玩的应用demo&#xff0c;会提升这部分在文章类型中的比例 今天带着大家通过代码角度…