高并发服务器-使用多线程(Multi-Thread)实现【C语言】

07-21 1132阅读

在上期的socket套接字的使用详解中(socket套接字的使用详解)最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多线程的方式来解决。

高并发服务器-使用多线程(Multi-Thread)实现【C语言】
(图片来源网络,侵删)

程序流程

  1. 创建监听套接字:使用 socket 函数创建套接字 lfd。
  2. 绑定套接字:使用 bind 函数将套接字绑定到指定的 IP 地址和端口。
  3. 监听连接请求:使用 listen 函数开始监听连接请求。
  4. 等待并接受客户端连接:使用 accept 函数等待并接受客户端连接请求。
  5. 获取客户端地址信息:使用 getpeername 函数获取已连接客户端的 IP 地址和端口号。
  6. 创建线程处理客户端请求:使用 pthread_create 函数创建新线程处理该连接,并设置线程为分离属性。
  7. 线程处理客户端通信:在 handle_client 函数中处理与客户端的通信,包括读取请求、处理数据、发送响应。
  8. 主线程继续监听新的连接请求:主线程关闭新的客户端套接字,由新线程处理。继续循环等待新的客户端连接请求。

示例代码:

#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)) 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]