以下是一个基本的带有线程池的TCP服务器的C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

#define THREAD_POOL_SIZE 10
#define BUFFER_SIZE 1024

void *handle_connection(void *);

int main(int argc, char **argv) {
    int server_socket, client_socket;
    struct sockaddr_in server_address, client_address;
    socklen_t client_address_len = sizeof(client_address);
    int port_number, thread_pool_size, i;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s port_number\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    port_number = atoi(argv[1]);
    thread_pool_size = THREAD_POOL_SIZE;

    if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Error creating socket");
        exit(EXIT_FAILURE);
    }

    memset(&server_address, 0, sizeof(server_address));
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(port_number);

    if (bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address)) < 0) {
        perror("Error binding socket");
        exit(EXIT_FAILURE);
    }

    if (listen(server_socket, SOMAXCONN) < 0) {
        perror("Error listening on socket");
        exit(EXIT_FAILURE);
    }

    pthread_t thread_pool[thread_pool_size];

    for (i = 0; i < thread_pool_size; i++) {
        if (pthread_create(&thread_pool[i], NULL, handle_connection, (void *) &server_socket) != 0) {
            perror("Error creating thread");
            exit(EXIT_FAILURE);
        }
    }

    for (i = 0; i < thread_pool_size; i++) {
        if (pthread_join(thread_pool[i], NULL) != 0) {
            perror("Error joining thread");
            exit(EXIT_FAILURE);
        }
    }

    close(server_socket);

    return EXIT_SUCCESS;
}

void *handle_connection(void *arg) {
    int server_socket = *(int *) arg;
    int client_socket;
    struct sockaddr_in client_address;
    socklen_t client_address_len = sizeof(client_address);
    char buffer[BUFFER_SIZE];
    ssize_t bytes_read;

    while (1) {
        if ((client_socket = accept(server_socket, (struct sockaddr *) &client_address, &client_address_len)) < 0) {
            perror("Error accepting connection");
            continue;
        }

        memset(buffer, 0, BUFFER_SIZE);

        if ((bytes_read = read(client_socket, buffer, BUFFER_SIZE)) < 0) {
            perror("Error reading from socket");
            close(client_socket);
            continue;
        }

        printf("Received message: %s\n", buffer);

        if (write(client_socket, buffer, bytes_read) < 0) {
            perror("Error writing to socket");
            close(client_socket);
            continue;
        }

        close(client_socket);
    }
}

该代码创建了一个TCP服务器,该服务器使用10个线程来处理客户端连接。服务器监听传递给它的端口号,并接受客户端的连接。一旦连接建立,服务器读取客户端发送的数据,并将其回传给客户端。在这个例子中,我们只是简单地将收到的消息打印到控制台上。然后,服务器关闭客户端的连接

linux的c写带有线程池的tcp 服务

原文地址: https://www.cveoy.top/t/topic/hrbx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录