# tcpchatt **Repository Path**: jackackcheng/tcpchatt ## Basic Information - **Project Name**: tcpchatt - **Description**: 网络编程 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-17 - **Last Updated**: 2021-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 在线群聊 #### 项目介绍 绑定云服务IP实现在线多人聊天功能,只是黑白界面,比较简陋。 #### 项目思路 1. 定义一个头文件chat.h,在文件内定义了多个宏和结构体。  PIP表示客户端使用的ip,IP表示服务器绑定的ip,PORT客户端和服务器相同的端口号。  NAMESIZE表示用户名字最大长度,MSGSIZE表示消息最大长度,以便于在客户端的buf数组格式化存储用户的名字和消息。  用户的结构体,该结构体保存用户的名字和消息。  带头双向链表结构体,保存前一个、后一个节点和自己的套接字变量。 2. 创建DLNode.c文件,内含带头双链表的创建节点,增加和删除节点功能。 3. 客户端创建套接字,并定义一个套接字结构体,使用该结构体调用connect函数和该套接字连接。  定义buf缓冲区,定义user用户结构体变量。  将标准输入改为非阻塞态,从标准输入读取内容。读到内容,将用户名和内容格式化保存在user结构体变量内发给服务器,然后非阻塞式接收消息,读到消息格式化取出并打印。 3. 服务器bind绑定IP和PORT,然后置为listen监听态。  每当accept接收到一个用户,就保存该用户套接字,头插在链表内部。   创建一个线程去处理该用户,并将该线程置为分离态,无需父进程回收,避免主服务器进程一直阻塞在回收线程上。   在线程内部,阻塞式接收用户消息,接收到后依次遍历链表,转发消息给每一个用户。当接收到内容长度为0,意味着用户已经退出,则把该套接字从链表内删除并关闭该套接字,最后该线程退出,被系统回收。