# 电子词典项目 **Repository Path**: LTSKF/electronic-dictionary-project ## Basic Information - **Project Name**: 电子词典项目 - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-04 - **Last Updated**: 2025-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: Linux, Cpp, TCP ## README # 电子词典项目 #### 简介 **电子词典项目** 电子词典项目,支持同一局域网下的远程访问,查询单词,历史记录等功能 #### 安装教程 1. 下载源码 2. 编译源码 3. 运行程序 4. 回来给我一个小星星 #### 使用说明 1. 需要能够gcc编译器 2. 支持数据库Sqlite 3. Linux系统环境 #### 参与贡献 1. Ltskf - ltskf@qq.com #### 技术要点 1. C语言编程语法 2. Linux系统编程 3. Sqlite数据库 4. Linux网络编程 5. Linux进程管理 -- 已弃用于ad8e7b72c58c8581997e9aeb8892c29b40fecfe8 6. TCP/IP协议 7. Epoll多路复用 -- 将服务器端限制在Linux端进行部署 #### 项目介绍 1. 发送信息封装操作 ``` c typedef struct { int type; // 记录用户的操作状态 char name[32]; // 用户名称 char date[256]; // 数据部分 }MSG_TXT; ``` 模仿TCP/IP协议,封装了发送信息的结构体,方便发送信息 2. 清晰明了的TCP连接代码,多种检测判断避免各种错误 ``` c // 创建一个套接字作为网络连接的端点 int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("请检查网络连接情况"); exit(-1); } // 将套接字绑定 struct sockaddr_in client_addr = {0}; client_addr.sin_family = AF_INET; client_addr.sin_port = 0; // 赋值0系统会自动分配 client_addr.sin_addr.s_addr = htonl(INADDR_ANY); int ret = bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr)); if(ret == -1){ perror("请检查网络信息"); exit(-1); } ``` 3. 丰富的注释信息,小白来了也能看懂 ``` c /// @brief 用户登陆 /// @param sockfd 套接字 /// @return 0 登陆失败 1 登陆成功 int user_login(int sockfd){ // 创建一个MSG_T结构体 MSG_TXT msg = {0}; msg.type = MSGTYPE_L; ...... ``` 4. 支持Sqlite数据库链接,方便存储用户信息和历史记录 ``` c // 首先连接数据库 char db_addr[] = "./Dictionary.db"; // 修正为字符数组 if (sqlite3_open(db_addr, &db) == SQLITE_OK) { puts("数据库连接成功"); } else { puts("数据库连接失败,请检查数据库文件是否存在"); exit(-1); } ``` 5. Epoll 多路复用,支持多客户端同时连接,解决多进程线程占用内存大的问题。 ``` c // 将监听套接字添加到 epoll 实例中 struct epoll_event ev; ev.events = EPOLLIN; ev.data.fd = sockfd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sockfd, &ev) == -1) { perror("epoll_ctl: listen_sock"); exit(-1); } ``` 6. 函数功能封装,降低项目的冗余,提高项目的可读性,对项目进行解耦,方便维护和升级 ``` c int find_word(char *date, char *buf) ``` 7. FIFO标准文件IO,读取字典查询单词,特殊的算法将解释信息打包交给服务器处理。 ``` c FILE *fp = fopen("Dictionary.txt", "r"); if (fp == NULL) { perror("无法打开文件"); return 0; } char line[259]; int found = 0; ...... ``` 8. 独特的数据库设计,每个用户都有自己的历史记录 ``` c void record_client_history_query(int sockfd,char *data, char *name){ char sql[200]={0}; sprintf(sql, "create table if not exists %s(data text, date text);", name); char *errmsg; int ret=sqlite3_exec(db, sql, NULL, NULL, &errmsg); if(ret!=0) { printf("建表失败%s\n", errmsg); return ; } ...... ``` 9. 不同的打印信息,客户端更直观,服务器更详细,项目经理再也不用担心我的bug处理能力了 ``` c ret=sqlite3_exec(db,sql,NULL,NULL,&errmsg); if(ret!=0) { printf("插入失败%s\n",errmsg); } ``` ``` c ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(ret == -1){ perror("请检查服务器信息或者联系服务器维护人员"); exit(-1); } ``` 10. git项目管理,方便溯源和追踪代码 ![git](./git.png) 11. Makedown文档对项目进行介绍,圈外人来了也知道是干什么的