前言
在职坐标学习的过程中,每学一门编程后面都对应相应的开发项目。
软件开发环节中需求分析尤为重要,它关系着程序各个模块功能的实现、项目进度以及最终产品的质量。作为初学者在第一次面对如此集成化的开发任务时或多或少会一脸茫然,不知道如何下手,也不知道如何将之前所学内容全部结合起来运用,这时切记不用慌张,不要畏惧。反复核对项目的相应业务需求以及所需要注意的问题,自己把其总结揉合起来写进txt文档,随后用智能体根据需求分析txt文档生成项目需求分析说明书(SRS),仔细比对生成的SRS与项目的要求是否一致,实现的大致框架清不清晰,对于不满足的地方可以自己进行修改或者将需求告知智能体让其进行修改,每问题之后随即让智能体生成对应的技术规格说明书(TS),对比SRS,我们需要更加仔细地浏览一遍TS上的所有内容,反复修改直到符合项目要求。有了SRS和TS对于项目开发会有很大帮助。作为刚入行的小白,由于项目经验的不足,可以依靠AI给出的TS获取启发,在开发的过程中学习总结AI给出的这一套开发思路、流程,在学习中不断进步。
一、项目需求分析:
该项目是一个基于 TCP 协议的客户端-服务器架构系统。该系统旨在实现远程命令执行、用户管理、即时通讯及心跳检测等功能。
- 核心功能模块
🖥️ 服务器端
配置与存储:通过配置文件读取 IP 和端口;使用文本文件存储用户账号密码;使用链表动态维护在线客户端信息(IP、时间、用户名、sockfd),并需使用互斥锁/信号量处理多线程并发访问。
多客户端支持:基于 TCP 协议,采用多线程机制支持多个客户端同时连接。
远程命令执行:接收客户端命令(如 ls -l, pwd, ifconfig 等),在服务器端执行并将结果返回给客户端显示。
💻 客户端
用户认证:提供注册和登录功能。注册时检测用户名重复;登录时进行密码验证,连续 3次 错误即退出。
即时通讯:支持查询在线用户列表,并能向指定用户发送文字消息(类似 QQ 聊天)。 - 连接与协议机制
💓 心跳检测
客户端利用 SIGALRM 定时(3秒间隔)发送心跳包。
服务器若连续 5次(即15秒)未收到心跳包,将记录异常并断开连接。
📦 通信协议
设计了统一的数据包格式(包含类型、大小、数据内容)。
定义了多种数据包类型,包括:登录(TYPE_LOGIN)、注册(TYPE_REG)、消息(TYPE_MSG)、心跳(TYPE_HEART)、命令(TYPE_CMD)、查看在线(TYPE_ONLINE)及响应包。 - 非功能性需求
📝 日志记录:服务器需记录所有连接、命令执行、断开及心跳超时等信息(包含时间、IP、命令内容等)。
⚙️ 性能与健壮性:要求代码高效、节约资源,严禁内存泄漏、野指针或数组越界,所有变量和内存需初始化。
🛠️ 可维护性
代码规范:采用模块化设计(多个 .c 文件 + Makefile),函数功能单一(不超过50行)。
命名规范:变量、函数、宏定义需遵循特定的命名规则(如宏全大写、函数小写加下划线等),确保代码易读易维护。
二、项目业务流程
流程一:客户端连接与认证
-
客户端启动 → 创建 TCP Socket → connect() 连接服务端
-
服务端 accept() → 分配 client_info_t → 创建工作线程
-
用户选择注册/登录 → 发送 TYPE_REG/TYPE_LOGIN 包
-
服务端验证:注册检查用户名重复、登录检查密码匹配和是否已在线
-
认证成功 → 插入会话链表 → 进入业务循环;失败 3 次 → 断开连接
流程二:远程命令执行
-
客户端输入命令 → 封装 TYPE_CMD 包发送
-
服务端收到 → 安全检查(危险命令黑名单)→ popen() 执行 → 结果封装 为 TYPE_MSG 返回
-
客户端接收线程异步显示结果
流程三:心跳保活机制
• 客户端:SIGALRM 每 3 秒触发 → 发送 TYPE_HEART 包
• 服务端工作线程:收到心跳 → 调用 heartbeat_reset() 将 count 归零
• 服务端心跳线程:每 3 秒遍历链表 → count++;达到 5(15秒)→ 关闭 socket、删除节点、记录日志
• 采用"两遍遍历"策略避免死锁:持锁收集超时列表,解锁后执行 close/remove
流程四:私聊与群聊
• 私聊:客户端发送 TYPE_MSG(data = "目标用户名 消息内容")→ 服务 端 session_list_find_by_name() 查找目标 → send_message() 转发
• 群聊:客户端发送 TYPE_GROUP_MSG → 服务端遍历链表 → 向除发送者外的所有客户 端广播;仅 1 人在线时返回提示
流程五:并发与同步
• 会话链表:pthread_mutex_t 保护所有增删查操作
• 日志文件:全局 log_mutex 保护多线程写入
• 账户文件:account_mutex 保护读写操作 • 锁顺序约定:account_mutex → list->mutex → log_mutex,避免死锁
三、开发任务规划
根据TS让AI给出为期七天的项目开发流程,可以按照流程进行开发,逐一深入。
Day 1 ██████░░░░░░░░░░░░░░ 基础设施 + 协议层
Day 2 ████████████░░░░░░░░ 服务端框架 + 链表 + 日志
Day 3 ██████████████████░░ 认证 + 命令 + handler
Day 4 ████████████████████ 心跳 + 聊天(服务端完成)
Day 5 ████████████████████ 客户端全部完成
Day 6 ████████████████████ 联调测试 + Bug修复
Day 7 ████████████████████ 审查收尾 + 交付
四、总结
总之,处在AI时代的我们应该学会如何正确使用AI,会用AI的同时也要避免过度依赖AI,通过自己认真思考得到的答案会在我们的脑子里留下很深刻的印象。