# 服务器聊天程序 **Repository Path**: CanCERCEll123/server-chat-program ## Basic Information - **Project Name**: 服务器聊天程序 - **Description**: 利用 socket编写的聊天程序,包括服务器端和客户端。使用到多线程和多进程服务 - **Primary Language**: C/C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-19 - **Last Updated**: 2024-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 项目要求:综合项目:设置聊天室字体颜色,通过链表插入和删除,记录介入客户端信息,并在聊天室实现服务器转发各客户端信息的操作,最终实现模拟真实QQ聊天室的场景。 ## 项目设计 ### **服务器进程**: 1. **服务器初始化**:解析命令行参数,创建并绑定套接字,开始监听连接请求。 2. **文件描述符管理**:使用`select`函数监控多个文件描述符,处理新连接和现有连接的数据收发。 3. **客户端管理**:使用链表存储客户端信息,支持客户端加入、发送消息、退出等操作。 4. **颜色分配**:根据客户端的套接字描述符分配不同颜色。其中,系统信息用绿色表示,客户机的消息用hash算法获得颜色表示。 5. **发送线程**:创建一个独立线程,用于读取管理员输入并广播给所有客户端。 6. **消息处理**:接收客户端消息,处理客户端退出或断开连接的情况,并将消息广播给其他客户端。 ### **客户机进程** 1. **参数解析**:检查命令行参数是否正确,包括服务器IP地址和端口号。 2. **套接字创建**:创建一个TCP套接字,并设置服务器地址信息。 3. **连接服务器**:尝试与服务器建立连接,失败则报错退出。 4. **信号处理**:设置信号处理器,用于处理子进程退出和用户中断信号。 5. **多进程处理**: * **父进程**:负责读取用户输入并发送消息到服务器。如果用户输入“quit”,则发送退出指令并终止程序。 * **子进程**:负责接收服务器发来的消息并打印到终端。 6. **颜色分配**:根据客户端的套接字描述符生成哈希值,并据此从预定义的颜色数组中选择一个颜色,用于标识不同的客户端消息。 ### **链表设计** 1. **错误日志宏**:`ERRLOG` 宏用于记录错误信息并退出程序。 2. **常量定义**:定义了一些常量,如链表节点的最大数量、名称长度等。 3. **数据类型定义**:定义了 `datatype` 为 `int`。 4. **结构体定义**:`usr_info_t` 结构体包含客户端地址、是否接受连接、用户名、是否命名、指向下一个节点的指针和一个标志位。 5. **全局变量**:`info_head` 是链表的头指针。 6. **函数声明**: * `LinkListNodeCreate`:创建一个新的链表节点。 * `LinkListInsertHead`:在链表头部插入一个新节点。 * `LinkListSearchUsrByAcceptfd`:根据接受的文件描述符查找对应的用户节点。