linux的c写带有线程池的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个线程来处理客户端连接。服务器监听传递给它的端口号,并接受客户端的连接。一旦连接建立,服务器读取客户端发送的数据,并将其回传给客户端。在这个例子中,我们只是简单地将收到的消息打印到控制台上。然后,服务器关闭客户端的连接
原文地址: https://www.cveoy.top/t/topic/hrbx 著作权归作者所有。请勿转载和采集!