高并发服务器-使用多线程(Multi-Thread)实现【C语言】
在上期的socket套接字的使用详解中(socket套接字的使用详解)最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多线程的方式来解决。
(图片来源网络,侵删)
程序流程
- 创建监听套接字:使用 socket 函数创建套接字 lfd。
- 绑定套接字:使用 bind 函数将套接字绑定到指定的 IP 地址和端口。
- 监听连接请求:使用 listen 函数开始监听连接请求。
- 等待并接受客户端连接:使用 accept 函数等待并接受客户端连接请求。
- 获取客户端地址信息:使用 getpeername 函数获取已连接客户端的 IP 地址和端口号。
- 创建线程处理客户端请求:使用 pthread_create 函数创建新线程处理该连接,并设置线程为分离属性。
- 线程处理客户端通信:在 handle_client 函数中处理与客户端的通信,包括读取请求、处理数据、发送响应。
- 主线程继续监听新的连接请求:主线程关闭新的客户端套接字,由新线程处理。继续循环等待新的客户端连接请求。
示例代码:
#include #include #include #include #include #include #include #include // 处理客户端通信的函数 void *handle_client(void *arg) { int cfd = *(int *)arg; free(arg); struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); //getpeername 函数获取与套接字 cfd 关联的远程(客户端)地址信息,并将其存储在 client_addr 结构体中。 getpeername(cfd, (struct sockaddr *)&client_addr, &client_addr_len); char client_ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip)); int client_port = ntohs(client_addr.sin_port); printf("Client connected: IP [%s], PORT [%d], FD [%d]\n", client_ip, client_port, cfd); char buf[1024]; int n; while ((n = read(cfd, buf, sizeof(buf))) > 0) { for (int i = 0; i客户端:
#include #include #include #include #include #include #define PORT 8888 #define BUFFER_SIZE 1024 #define SERVER_IP "127.0.0.1" int main() { int sock = 0, valread; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; char input_buffer[BUFFER_SIZE] = {0}; char *hello = "Hello from client"; int opt = 1; // 创建 TCP 套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0))
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。