Linux开发词典
做了一个小级别的实验项目,对之前所学过的知识有个综合性的总结。在线词典实验涉及有,Linux C语言的开发、网络套接字编程、多进程开发、sqlite3数据库接口调用、文件读写等操作,make编译及Makefile文件的编写。。

项目介绍

项目总体划分为客户端、和服务端两个部分。客户端(也是APP)一方面为使用的用户提供简单的注册、登录、查询等操作,另一方面负责与服务端进行TCP通信,向服务器发送请求。而真正提供服务的是服务端进程,它不仅能和数据库进行交互,而且要接收用户的请求,把服务提供给用户。

用户通过客户端程序访问部署在服务端的词典,具体可以实现的功能有:

注册用户/用户登录
用户查询词典(查询英文单词的解释信息)
用户查询自己的历史查询记录

具体设计流程

运行客户端,首先出现一个主菜单,用户输入‘1’为注册,‘2‘为登录,‘3’为退出。当用户输入‘2’,登录成功后,又会进入二级服务菜单。这时用户输入‘1’为查询单词,‘2‘为查询历史,‘3’为退出。

以上是客户端应用的实现,底层调用的网络接口免不了要跟服务端交互。至于请求的类型和数据,需要我们自己根据需求来设计,与服务端统一保持一致即可。

服务端,主要负责接收客户端的请求信息,另一方面与数据库(调用相关函数创建)进行交互。由于客户端不只一个,我们用多进程的方法来处理多个客户端的请求;分析不同的请求信息,比如查询历史,服务端接收到这一命令后,就向数据库的历史记录表查询相关信息,再将结果处理,再返回到客户端。

虽然可以将词典的内容做成一个数据表,载入数据库,这样查询起来也十分方便,但是太过麻烦。所以我们将单词与相关解释信息放到一个文件中,查询单词时,到这个文件中匹配信息即可。

代码实现(代码量较大,只展示部分)

共用头文件 common.h

#ifndef __COMMON_H__
#define __COMMON_H__#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
#include <signal.h>
#include <time.h>#define   N  32
typedef struct {int type;char name[N];char data[256];
}MSG;#define  R  1   // user - register
#define  L  2   // user - login
#define  Q  3   // user - query
#define  H  4   // user - history#define  DATABASE  "my.db" //创建的数据库#define SERADDR "127.0.0.1"   //这里笔者偷个懒,使用网络回送地址,就不进行远程通信了
#define SERPORT 5001          //服务端占用 5001 这个端口#endif

客户端文件 client.c

#include "common.h"int  do_register(int sockfd, MSG *msg); //注册用户
int do_login(int sockfd, MSG *msg);     //用户登录
int do_query(int sockfd, MSG *msg);     //查询单词
int do_history(int sockfd, MSG *msg);   //查询历史
int SubMenu(int sockfd);                //二级子菜单int main(int argc, const char *argv[])
{int sockfd;struct sockaddr_in  serveraddr;int n;MSG  msg;if((sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0){perror("fail to socket.\n");return -1;}bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(SERADDR);serveraddr.sin_port = htons(SERPORT);if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){perror("fail to connect");return -1;}while(1){printf("*****************************************************************\n");printf("* 1.register          2.login              3.quit               *\n");printf("*****************************************************************\n");printf(">");scanf("%d", &n);getchar();switch(n){case 1:do_register(sockfd, &msg);break;case 2:if(do_login(sockfd, &msg) == 1){SubMenu(sockfd);  }break;case 3:close(sockfd);exit(0);break;default:printf("Invalid data cmd.\n");}}return 0;
}int SubMenu(int sockfd)
{int n;MSG  msg;while(1){printf("-----------------------------------------------------\n");printf("- 1.query_word   2.history_record   3.quit          -\n");printf("-----------------------------------------------------\n");printf(">");scanf("%d", &n);getchar();switch(n){case 1:do_query(sockfd, &msg);break;case 2:do_history(sockfd, &msg);break;case 3:close(sockfd);exit(0);break;default :printf("Invalid data cmd.\n");}}return 0;
}///
//省略一堆底层函数实现
//

服务端文件 server.c

#include "common.h"int do_client(int acceptfd, sqlite3 *db); //客户端请求入口
void do_register(int acceptfd, MSG *msg, sqlite3 *db);//注册用户实现
int do_login(int acceptfd, MSG *msg, sqlite3 *db);//用户登录实现
int do_query(int acceptfd, MSG *msg, sqlite3 *db);//用户查询单词实现
int do_history(int acceptfd, MSG *msg, sqlite3 *db);//查询历史记录
int history_callback(void* arg,int f_num,char** f_value,char** f_name);//查询历史函数使用的回调
int do_searchword(int acceptfd, MSG *msg, char word[]);//查询单词函数的回调
int get_date(char *date);//获取时间int main(int argc, const char *argv[])
{int sockfd;struct sockaddr_in  serveraddr;int acceptfd;sqlite3 *db;pid_t pid;if(sqlite3_open(DATABASE, &db) != SQLITE_OK){printf("%s\n", sqlite3_errmsg(db));return -1;}else{printf("open DATABASE success.\n");}if((sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0){perror("fail to socket.\n");return -1;}bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(SERADDR);serveraddr.sin_port = htons(SERPORT);if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){perror("fail to bind.\n");return -1;}if(listen(sockfd, 5) < 0){printf("fail to listen.\n");return -1;}signal(SIGCHLD, SIG_IGN); //处理僵尸进程while(1){if((acceptfd = accept(sockfd, NULL, NULL)) < 0){perror("fail to accept");return -1;}if((pid = fork()) < 0){perror("fail to fork");return -1;}else if(pid == 0)  {//son processclose(sockfd);do_client(acceptfd, db);}else  {//father processclose(acceptfd);}}return 0;
}int do_client(int acceptfd, sqlite3 *db)
{MSG msg;while(recv(acceptfd, &msg, sizeof(msg), 0) > 0){printf("type:%d\n", msg.type);switch(msg.type){case R:do_register(acceptfd, &msg, db);break;case L:do_login(acceptfd, &msg, db);break;case Q:do_query(acceptfd, &msg, db);break;case H:do_history(acceptfd, &msg, db);break;default:printf("Invalid data msg.\n");}}printf("client exit.\n");close(acceptfd);exit(0);return 0;
}///
//省略一堆底层函数实现
//

实验结果展示

————————————————
版权声明:本文为CSDN博主「王建峰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/feit2417/java/article/details/82724385

基于Linux系统开发在线词典相关推荐

  1. Mac是不是基于Linux系统开发?

    程序员在使用中,常常会觉得MacOS和Linux很相似,特别是命令行的操作.所以很多人认为MacOS基于Linux开发的,也许是Linux的一个发行版. 但事实上,目前的MacOS是基于 NeXTst ...

  2. 华为自研系统鸿蒙为什么也要基于linux来开发?

    众所周知,目前国内已有众多的国产系统,基本上均源自linux,以linux为基础进行二次开发.比如红旗linux.深度等等. 但不知道为什么,一说起某系统是基于linux而来,很多网友就瞧不起,并且会 ...

  3. linux usb显卡驱动,基于Linux系统的USB显卡多用户平台开发

    摘要: 自上个世纪九十年代以来,Linux系统得到了快速的发展,由于Linux继承了UNIX的以网络为核心的设计思想,采用模块化的设计结构,使得Linux取得了广泛的应用.于此同时,计算机硬件也取得了 ...

  4. javaweb基于JSP+Servlet开发在线个人理财系统+论文 课程设计 大作业源码

    基于JSP+Servlet开发在线个人理财系统+论文(大作业/毕业设计) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk+Tomcat+SQLServer数据库 运行效果图 ...

  5. QT项目设计:基于Linux系统的车载系统,地图、音视频播放、天气显示、优美界面 详细教程

    文章目录 QT车载系统 一.音频播放 二.视频播放 三.地图显示 四.天气功能 五.界面美化 化作尘其它开源项目: 单片机项目: Linux项目: QT车载系统 哔哩哔哩视频链接:https://ww ...

  6. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

  7. 鸿蒙基于linux系统,鸿蒙操作系统(HarmonyOS)是基于Linux的吗?尽管已知道它是基于微内核的...

    此前由于媒体传得沸沸扬扬,说华为的鸿蒙操作系统是基于Linux内核开发的,兼容安卓等,但是现实的情况是:鸿蒙操作系统(HarmonyOS)是基于微内核的,参考华为鸿蒙操作系统(HarmonyOS)主要 ...

  8. 目录 - 《ARM嵌入式Linux系统开发从入门到精通》 - 免费试读 - book.csdn.net

    第一部分 ARM Linux系统移植 第1章 嵌入式系统开发入门...... 2 1.1 嵌入式系统介绍..... 2 1.1.1 嵌入式系统概述..... 2 1.1.2 嵌入式系统组成..... ...

  9. 基于Linux系统的边界网关协议的设计与实现

    基于Linux系统的边界网关协议的设计与实现 3.6 BGP和RMer系统间通信 RMer系统和BGP系统之间采用的是UNIX本地的服务器客户端模式进行通信,它们创建的socket的地址格式为AF_U ...

  10. 嵌入式Linux系统开发入门宝典(第2版)

    距离<嵌入式Linux系统开发入门宝典>第1版已经有6年了,由于是第一次写作,对章节的划分,语言的组织,知识点的推敲,以及本人习惯用五笔输入法打字,有很多地方出现一些诡异的文字.另外,既然 ...

最新文章

  1. 2022-2028年中国废矿物油行业市场研究及前瞻分析报告
  2. 如何获得10倍的用户增长?| 文末福利
  3. 冲销已过账外向交货单
  4. 基于pygame的射击小游戏制作(三)让外星人动起来
  5. 1进程 ppid_杀死僵尸进程,你需要这些神奇的Linux命令行
  6. linux shell for 循环变量,shell for循环、循环变量值付给其他shell脚本的方法
  7. php 工商银行公众号支付代码_微信支付PHP SDK之微信公众号支付代码详解
  8. Clojure 1.8提升了性能和开发体验
  9. Excel数据透视表学习
  10. rabbitmq 消息确认机制ACK
  11. 校赛第二轮 —— 国产电影保护月是国产电影之福 / 祸
  12. AutoJs学习-传感器图像
  13. 超酷炫技:10 个牛逼的单行代码编程技巧
  14. 安装anaconda出现This Python interpreter is in a conda environment, but the environment has not been acti
  15. Premiere Pro 常用快捷键
  16. 数字IC设计---反相器相关知识
  17. 计算机维修轿车,解决方案:轿车电脑故障维修两例
  18. 【dgl学习】dgl中edges.src/edges.dst/edges.data解释
  19. SQL Server2019配置管理器无法连接到 WMI 提供程序
  20. bernoulli vs binominal vs multinoulli vs multinomial

热门文章

  1. 啊哈算法---快速排序(C语言)
  2. win10系统中如何把自带的IE11降级回IE8?
  3. 【蓝牙】设备管理器找不到蓝牙
  4. 极光im php,极光IM- 微信小程序 SDK - 极光文档
  5. android编写计算器代码,Android入门计算器编写代码
  6. Vivado保姆级安装
  7. Hadoop——快速入门
  8. Python 电子书下载列表
  9. visio作图|入门教程+mathtype资源
  10. html 文字 转 语音,把文字变成语音的软件