# Linux网络词典 **Repository Path**: D41C/linux-network-dictionary ## Basic Information - **Project Name**: Linux网络词典 - **Description**: 一个完整的 C/S(客户端/服务器)架构网络词典系统(Linux系统),采用 C 语言开发。服务器端负责监听客户端连接、用户认证、单词查询和历史记录管理;客户端提供友好的交互界面,支持用户注册、登录、单词查询和历史记录查询功能。系统通过 Socket 实现网络通信,服务器端采用多进程模型支持多客户端并发访问,使用 SQLite3 数据库存储用户信息和查询历史 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-19 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: Linux, C语言, TCP ## README # 基于 C/S 架构的网络词典系统(Linux系统) ## 一、项目简介 一个完整的 C/S(客户端/服务器)架构网络词典系统(Linux系统),采用 C 语言开发。服务器端负责监听客户端连接、用户认证、单词查询和历史记录管理;客户端提供友好的交互界面,支持用户注册、登录、单词查询和历史记录查询功能。系统通过 Socket 实现网络通信,服务器端采用多进程模型支持多客户端并发访问,使用 SQLite3 数据库存储用户信息和查询历史。 ## 二、核心功能 ### 服务器端功能 1. **用户管理**:处理用户注册和登录请求,验证用户身份。 2. **单词查询**:从词典文件中查询单词解释并返回给客户端。 3. **历史记录管理**:记录用户的查询历史,支持查询和自动清理旧记录(保留最新 10 条)。 4. **多客户端并发**:采用多进程模型,支持多个客户端同时连接和操作。 ### 客户端功能 1. **用户交互**:提供清晰的菜单界面,支持注册、登录、查询单词和历史记录。 2. **密码安全**:输入密码时无明文显示,支持退格操作。 3. **查询功能**:输入单词查询解释,支持退出查询模式。 4. **历史记录查询**:查看个人查询历史记录。 ## 三、技术栈 ### 服务器端 - **开发语言**:C 语言 - **网络编程**:Socket(TCP 协议) - **数据库**:SQLite3(轻量级嵌入式数据库) - **并发处理**:多进程(fork 子进程处理客户端请求) - **信号处理**:捕获 SIGCHLD 信号,回收子进程避免僵尸进程 - **数据存储**:文件(词典词库)+ 数据库(用户信息、查询历史) ### 客户端 - **开发语言**:C 语言 - **网络编程**:Socket(TCP 协议) - **终端交互**:菜单界面、密码隐藏输入(termios 库) - **数据传输**:自定义结构体封装请求和响应数据 ## 四、环境准备 ### 1. 依赖安装 - **SQLite3 开发库**:用于服务器端数据库操作 ```bash # Ubuntu/Debian sudo apt-get install libsqlite3-dev # CentOS/RHEL sudo yum install sqlite-devel # macOS(Homebrew) brew install sqlite3 ``` - **编译工具**:GCC/G++ ```bash sudo apt-get install gcc # Ubuntu/Debian ``` ### 2. 词典文件准备 创建 `dict.txt` 词典文件,格式要求:**每行一个单词 + 空格 + 解释**(示例): ```txt apple 苹果,苹果树 book 书,书籍;预订 computer 计算机,电脑 network 网络,网状系统 program 程序;编程 ``` ## 五、编译与运行 ### 1. 服务器端编译与运行 #### 编译命令 将服务器端源文件(假设命名为 `dict_server.c`)与 SQLite3 库链接编译: ```bash gcc dict_server.c -o dict_server -lsqlite3 ``` #### 运行服务器 启动服务器时需指定监听的 IP 地址和端口: ```bash ./dict_server <监听IP> <监听端口> ``` 示例: ```bash ./dict_server 127.0.0.1 8888 ``` 启动成功后输出: ``` 服务器启动成功!!! ``` ### 2. 客户端编译与运行 #### 编译命令 将客户端源文件(假设命名为 `dict_client.c`)编译: ```bash gcc dict_client.c -o dict_client ``` #### 运行客户端 启动客户端时需指定服务器的 IP 地址和端口: ```bash ./dict_client <服务器IP> <服务器端口> ``` 示例: ```bash ./dict_client 127.0.0.1 8888 ``` 启动成功后显示主菜单: ``` ***************************** * 1.注册 2.登录 3.退出* ***************************** 请输入主菜单功能码:(1|2|3) ``` ## 六、使用说明 ### 1. 客户端操作流程 #### 注册(功能码 1) - 输入用户名和密码(密码无明文显示)。 - 注册成功提示“注册:OK”,失败提示原因(如用户名已存在)。 #### 登录(功能码 2) - 输入用户名和密码(密码无明文显示)。 - 登录成功提示“登录成功!”并进入查询菜单;失败提示原因(如用户名或密码错误)。 #### 查询菜单(登录后) ``` ***************************************** * 1.查询单词 2.查询历史记录 3.退出* ***************************************** 请输入功能菜单功能码:(1|2|3) ``` #### 查询单词(功能码 1) - 输入要查询的单词(输入 `#` 退出查询模式)。 - 系统返回单词解释或“未找到单词”。 #### 查询历史记录(功能码 2) - 系统返回用户的查询历史记录(按时间降序排列),无记录时提示“暂无查询历史”。 #### 退出(功能码 3) - 退出当前功能或程序。 ### 2. 示例操作 ``` # 客户端启动后 ***************************** * 1.注册 2.登录 3.退出* ***************************** 请输入主菜单功能码:(1|2|3) 1 请输入您的用户名:testuser 请输入您的密码:******** 注册:OK ***************************** * 1.注册 2.登录 3.退出* ***************************** 请输入主菜单功能码:(1|2|3) 2 请输入您的用户名:testuser 请输入您的密码:******** 登录成功! ***************************************** * 1.查询单词 2.查询历史记录 3.退出* ***************************************** 请输入功能菜单功能码:(1|2|3) 1 请输入要查询的单词(输入#退出) apple 查询中... >>> 苹果,苹果树 请输入要查询的单词(输入#退出) # ***************************************** * 1.查询单词 2.查询历史记录 3.退出* ***************************************** 请输入功能菜单功能码:(1|2|3) 2 2024-05-20 15:30:45:apple ***************************************** * 1.查询单词 2.查询历史记录 3.退出* ***************************************** 请输入功能菜单功能码:(1|2|3) 3 ``` ## 七、项目结构 ``` . ├── dict_server.c # 服务器端核心代码 ├── dict_client.c # 客户端核心代码 ├── dict.txt # 词典词库文件(需手动创建) ├── my.db # SQLite3 数据库文件(服务器运行后自动生成) └── README.md # 项目说明文档 ``` ## 八、核心模块解析 ### 1. 服务器端核心模块 #### 网络通信模块 - **Socket 创建与监听**:`socket()` 创建 TCP 套接字,`bind()` 绑定 IP 和端口,`listen()` 开始监听客户端连接。 - **客户端连接处理**:`accept()` 阻塞等待客户端连接,`fork()` 创建子进程处理该客户端的所有请求,父进程继续监听新连接。 - **数据传输**:通过 `recv()` 接收客户端请求,`send()` 返回响应结果,基于自定义 `MSG` 结构体封装数据。 #### 数据库操作模块 - **数据库初始化**:启动时自动创建 `usr`(用户表)和 `record`(历史记录表),并为 `record` 表创建复合索引(优化历史查询效率)。 - **用户表(usr)**:字段为 `name`(主键,用户名)和 `pass`(密码),支持注册和登录验证。 - **历史记录表(record)**:字段为 `name`(用户名)、`date`(查询时间)、`word`(查询单词),支持历史记录的插入和查询。 - **安全优化**:使用参数化 SQL(`sqlite3_prepare_v2` + `sqlite3_bind_text`)避免 SQL 注入攻击。 #### 词典查询模块 - **文件读取**:打开 `dict.txt` 词典文件,逐行读取内容。 - **精确匹配**:通过 `strncmp` 匹配单词,确保只返回完全匹配的结果(避免部分匹配)。 - **结果处理**:提取单词后的解释内容,封装到响应消息中返回给客户端。 #### 历史记录管理模块 - **记录插入**:每次单词查询成功后,自动记录查询时间(`getdate()` 函数获取当前时间)和单词,插入 `record` 表。 - **记录清理**:`clean_old_records()` 函数确保每个用户的历史记录不超过 10 条,自动删除最早的记录。 - **记录查询**:按查询时间降序排列,通过回调函数 `history_callback()` 逐条返回历史记录。 ### 2. 客户端核心模块 #### 网络通信模块 - **Socket 创建与连接**:`socket()` 创建 TCP 套接字,`connect()` 连接服务器。 - **数据传输**:通过 `send()` 发送请求(注册、登录、查询等),`recv()` 接收服务器响应。 #### 终端交互模块 - **菜单界面**:主菜单和查询菜单,清晰引导用户操作。 - **密码隐藏输入**:使用 `termios` 库禁用终端回显功能,输入密码时不显示明文,支持退格操作。 - **输入验证**:严格检查用户输入的功能码,确保输入有效。 ## 九、注意事项 1. **词典文件格式**:`dict.txt` 必须严格遵循「单词 + 空格 + 解释」的格式,否则可能导致查询失败。 2. **端口占用问题**:若启动服务器时提示「绑定失败」,可能是端口被占用,需更换其他未使用的端口(如 8889、9999)。 3. **客户端消息格式**:客户端发送的 `MSG` 结构体必须与服务器定义一致,否则会导致数据解析错误。 4. **数据库权限**:确保服务器运行用户有读写当前目录的权限(用于创建和修改 `my.db` 数据库文件)。 5. **并发限制**:服务器端多进程模型支持的并发数受系统进程数限制,若需支持更高并发,可考虑改用多线程或 I/O 多路复用(`select`/`poll`/`epoll`)。 6. **终端兼容性**:客户端的密码隐藏功能依赖 `termios` 库,在部分 Windows 终端(如 CMD)可能不兼容,建议在 Linux 或 macOS 终端运行。 ## 十、扩展方向 1. **密码加密**:使用 MD5、SHA256 等算法对用户密码进行加密存储,提高安全性。 2. **中文支持**:优化词典文件和字符串处理逻辑,支持中文单词和解释。 3. **多线程模型**:服务器端改用多线程替代多进程,减少系统资源占用,支持更高并发。 4. **日志功能**:添加日志模块,记录服务器运行状态、客户端请求、错误信息等,便于调试和维护。 5. **图形化界面**:开发配套的图形化客户端(使用 GTK+、Qt 等库),提供更友好的交互体验。 6. **网络协议优化**:使用 JSON 或 Protobuf 替代自定义二进制协议,提高协议的可读性和兼容性。 7. **断线重连**:客户端添加断线重连机制,提高系统稳定性。