网络编程项目:电子辞典

项目要求:

  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://xiahunao.cn/news/2779356.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++ shell - 在线 C++ 编译器

C shell - 在线 C 编译器 1. C shell2. Example program3. Options4. ExecutionReferences 1. C shell C Shell v2 https://cpp.sh/ https://cpp.sh/about.html C Shell v2, free online compiler, proudly uses emscripten to compile your code. emscripten is a clang-ba…

Hadoop:认识MapReduce

MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据&#xff0c;通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业&#xff0c;如文本处理、数据分析和大规模数据集的聚合等。然而&#xff0c;MapReduce也有…

假期作业 8

1、若有以下说明语句&#xff1a;int a[12]{1,2,3,4,5,6,7,8,9,10,11,12};char c’a’,d,g;则数值为4的表达式是&#xff08; B&#xff09;。 A&#xff09;a[g-c] B&#xff09;a[4] C&#xff09;a[‘d’-‘c’] D&#xff09;a[‘d’-c] 2、假…

9.3使用最小花费爬楼梯(LC746-E)

算法&#xff1a; 动规五部曲&#xff1a; 1.确定dp数组以及下标含义 dp[i]的定义&#xff1a;到达第i台阶所花费的最少体力为dp[i]。 2.确定递归公式 调到dp[i]&#xff0c;不仅需要体力花费&#xff08;dp[i - 1]或dp[i - 2] 跳1/2阶&#xff09;&#xff0c;还需要金钱…

【小记】目标雅思~

Apps and WebSites 沪江英语 传送门&#xff1a;听力板块/有声热点 FOR 精读练习 使用方法&#xff1a; 调整读速0.75x&#xff0c;盲听默写&#xff1b;对于听不清的部分&#xff0c;再多听几遍 网易公开课 传送门&#xff1a;TED 、可汗学院、国际名校公开课 FOR 泛听 &a…

特殊形势下如何自主创新创业

当下的经济形势相信每个人都有不断的判断&#xff0c;但比较一致的观点是经济下行趋势十分明显&#xff0c;无论是传统的建筑以及相应的建材、家居、家电行业&#xff0c;还是曾红极一时的IT行业&#xff0c;甚至是芯片业行&#xff0c;都出现了严重的需求不足、产能过剩。从而…

Linux: GDB 调试工具

目录 概念&#xff1a; Linux 下 debug 和 release 的区别&#xff1a; GDB 的使用 &#xff1a; 激活和进入工作模式&#xff1a; 查看文件的内容&#xff1a; 运行调试的文件&#xff1a; 打断点&#xff1a; 查看断点&#xff1a; 删除断点&#xff1a; 禁用断点…

猫头虎分享已解决Bug ‍ || Error: Target container is not a DOM element (React)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

shell脚本之文件处理命令及字符切片处理

目录 一、文件处理工具 1、tr命令 1.1 转换字符 1.2 压缩字符及删除字符 2、seq命令 3、cut命令 ​4、tac命令 5、rev命令 6、sort命令 ​​​​​7、uniq命令 ​8、echo命令 9、date命令 二、字符串切片处理 1、取字符串的长度 2、跳过字符串最前边的字符 3、…

C++入门(上)

文章目录 1:什么是C2.C的发展史3:C关键字(C98)4:命名空间4.1:命名空间的概念4.2:命名空间的定义4.3:命名空间的使用4.3.1加命名空间的名称以及域作用限定符4.3.2:使用using将命名空间中某个成员引入4.3.3:使用using namespace 命名空间名称展开命名空间代码1代码2 5:C输入与输出…

用C语言列出Linux或Unix上的网络适配器

上代码&#xff1a; 1. #include <sys/socket.h> 2. #include <stdio.h> 3. 4. #include <netdb.h> 5. #include <ifaddrs.h> 6. 7. int main() { 8. struct ifaddrs *addresses; 9. if(getifaddrs(&addresses) -1) { 10. printf("…

Linux:信号的保存

文章目录 信号相关概念信号递达信号未决信号阻塞内核中的示意图 信号集的操作函数 前面对于信号的产生中对操作系统有了一个基础的认知&#xff0c;对于一个真正的操作系统来说&#xff0c;进程是由操作系统进行调度的&#xff0c;那操作系统本身也是代码&#xff0c;是由谁进行…

Python并发编程之多线程

前言 本文介绍并发编程中另一个重要的知识 - 线程。 线程介绍 我们知道一个程序的运行过程是一个进程&#xff0c;在操作系统中每个进程都有一个地址空间&#xff0c;而且每个进程默认有一个控制线程&#xff0c;打个比方&#xff0c;在一个车间中有很多原材料通过流水线加工…

MYSQL分区NOW()不支持

传说同事写个复杂的SQL代码,跑一次需要7-10秒, 复杂如上,我也懒得去分析 IF IF IF是怎么回事了! 发现此表是分区表,后面要求加上了分区时间,以便利用到分区裁剪技术. 因为需求是查近10天来到期还款的人和金额.就是今天应该还款的人, 一般还款周期是7天. 给个10天的范围挺可以的…

第3集《佛说四十二章经》

和尚尼慈悲、诸位法师、诸位同学&#xff0c;阿弥陀佛&#xff01; 请大家打开讲议第四面&#xff0c;三、随文释义。 前面讲到本经的修学纲要是顿渐兼收&#xff0c;理事无碍。本经的修学有两个主题&#xff1a; (一)顿教法门&#xff1a; 顿教法门是一种智慧的观照。修学…

腾讯云4核8G服务器多少钱一年?

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

C++:理解拷贝在变量,指针,引用以及构造函数里的意义

变量&#xff0c;指针&#xff0c;引用 //拷贝与拷贝构造函数 //拷贝&#xff08;copy&#xff09;&#xff1a;拷贝数据&#xff0c;拷贝内存 //始终是在拷贝值&#xff0c;但是指针存储的是内存的地址&#xff0c;变量存储的是数据的值 //特别注意&#xff0c;在引用里面的拷…

新年加载中特效 —— 后期需要添加备注和消化

代码来源&#xff1a;链接: https://www.bilibili.com/video/BV1qA4m1573V/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8&…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

ChatGPT高效提问—prompt常见用法(续篇十一)

ChatGPT高效提问—prompt常见用法(续篇十一) 1.1 增加角色 ​ 在prompt里可以适当增加角色,来满足一些特殊场景的需求。先来看一个不带角色的简单示例。 输入prompt: ​ ChatGPT输出: ​ 如上所示,问题比较难,ChatGPT的答案也确实晦涩难懂。试想一下,如果将这个解释将…