下面是“socket多人聊天程序C语言版(一)”的完整攻略。
一、前置知识
在学习本文前,需要掌握以下C语言知识:
- socket编程基础
- 线程基础
- 指针基础
二、程序结构
本程序主要分为四个模块:客户端、服务端、公共头文件和Makefile。
1. 公共头文件
- common.h:包含了各种结构体和宏定义,以及客户端和服务端公共使用的函数的声明。
2. 客户端
- client.c:客户端主文件,包含了主函数和各种客户端相关的函数的实现。
3. 服务端
- server.c:服务端主文件,包含了主函数和各种服务端相关的函数的实现。
4. Makefile
- Makefile:编译程序的文件,包含了编译链接的命令和参数。
三、程序实现
1. 公共头文件实现
在该文件中,定义了四个结构体和一些常量:
- CLIENT
:用来记录客户端信息的结构体,包括客户端名字(name
)、客户端套接字(client_sock_fd
)和客户端地址(client_addr
)。
- USER_LIST
:用于记录所有已连接的客户端信息的链表结构体。
- MSG
:用于记录消息的结构体,包括消息内容(content
)和消息发送者的名字(name
)。
- THREAD_INFO
:用于记录线程的信息,包括线程ID(tid
)和所属的客户端(client
)。
- MAX_NAME_LEN
:定义了客户端名字的最大长度。
- MSG_SIZE
:定义了消息内容的最大长度。
- CLIENT_NUM
:定义了可以同时连接的客户端数量。
在该文件中,还申明了一系列函数,包含了common.h
文件的声明。
2. 客户端实现
2.1 void* recv_msg_thread(void* arg)
当客户端接收到新的消息时,该线程负责接收并将消息打印到客户端的终端上。
该函数包含两个参数:
- arg
:线程信息的指针,记录了该线程的ID和其所属的客户端。
- 返回值:无。
2.2 void* send_msg_thread(void* arg)
该线程负责将客户端发送的消息发送给服务端。
该函数包含两个参数:
- arg
:该线程所属的客户端的指针。
- 返回值:无。
2.3 int main(int argc, char* argv[])
该函数作为客户端程序的入口。在该函数中,客户端需要完成以下步骤:
- 通过命令行参数获取服务端IP地址和端口号。
- 创建一个套接字。
- 连接服务端。
- 通过新开两个线程分别接收和发送消息。
- 在主线程中等待客户端输入并发送消息。
3. 服务端实现
3.1 void* client_thread(void* arg)
该线程作为服务端接受客户端连接的响应程序,用于处理客户端发出的请求。
该函数包含一个参数:
- arg
:客户端的套接字。
- 返回值:无。
3.2 int main(int argc, char* argv[])
该函数作为服务端程序的入口。在该函数中,服务端需要完成以下步骤:
- 通过命令行参数获取服务端IP地址和端口号。
- 创建一个服务器套接字。
- 绑定服务器套接字和IP地址、端口号。
- 开始监听连接请求。
- 当有新的客户端连接请求时,启动一个新线程处理该请求。
四、使用示例
1. 客户端运行示例
首先需要使用Makefile编译客户端程序:
make client
然后开启客户端程序,需要提供服务端的IP地址和端口号:
./client IP port
例如,连接IP为127.0.0.1,端口号为8000的服务端:
./client 127.0.0.1 8000
成功连接服务端后,客户端会提示用户输入用户名。输入完毕后,用户就可以在客户端上进行聊天了。
2. 服务端运行示例
首先需要使用Makefile编译服务端程序:
make server
然后开启服务端程序,需要提供IP地址和端口号:
./server IP port
例如,运行在127.0.0.1的8000端口上:
./server 127.0.0.1 8000
服务端成功运行后,将等待客户端连接。当有客户端连接时,服务端将在终端上输出连接的客户端信息。客户端连接成功后,可以进行聊天。
五、总结
本文介绍了socket多人聊天程序C语言版的实现方法。该程序实现了服务端和多个客户端之间的消息传输,使得多个客户端在同一个聊天室内进行聊天。本文结合具体示例详细讲解了该程序的实现过程,希望本文能够对希望学习socket编程的读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:socket多人聊天程序C语言版(一) - Python技术站