C语言实现带线程池的Linux TCP服务器
以下是一个基本的带有线程池的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个线程来处理客户端连接。服务器监听传递给它的端口号,并接受客户端的连接。一旦连接建立,服务器读取客户端发送的数据,并将其回传给客户端。在这个例子中,我们只是简单地将收到的消息打印到控制台上。然后,服务器关闭客户端的连接。
代码解释:
-
**头文件包含:**代码首先包含了必要的头文件,如
<stdio.h>、<stdlib.h>、<string.h>、<unistd.h>、<sys/socket.h>、<netinet/in.h>和<pthread.h>,它们提供了进行网络编程、进程控制和线程管理所需的功能。 -
**常量定义:**代码定义了两个常量:
THREAD_POOL_SIZE用于指定线程池的大小,BUFFER_SIZE用于指定缓冲区的大小。 -
**
handle_connection()函数:**该函数用于处理单个客户端连接。它接收一个指向服务器套接字的指针作为参数。该函数在一个循环中不断接收来自客户端的数据,并将其回传给客户端。 -
**
main()函数:**该函数是程序的入口点。它执行以下操作:- 获取命令行参数中的端口号。
- 创建一个TCP套接字。
- 绑定套接字到指定的端口号。
- 监听连接请求。
- 创建一个包含指定数量线程的线程池,并将每个线程分配给
handle_connection()函数。 - 等待所有线程完成并退出。
- 关闭服务器套接字。
运行代码:
-
编译代码:
gcc server.c -o server -lpthread -
运行代码:
./server <port_number>
注意:
- 该代码只是示例代码,它展示了如何使用线程池来处理多个客户端连接,但它没有实现更复杂的网络协议或错误处理。
- 您需要根据自己的需求对代码进行修改和扩展。
- 在实际应用中,您应该使用更可靠的错误处理和资源管理机制。
原文地址: https://www.cveoy.top/t/topic/oT2c 著作权归作者所有。请勿转载和采集!