在 C++ 网络编程中,结合 select、epoll、poll 这些 I/O 多路复用技术与多线程编程,可以实现一个高效的并发服务器。使用 pthread 创建多线程可以让每个线程处理不同的客户端请求,提升服务器的并发处理能力。
下面是关于如何使用 select、poll 和 epoll 结合 pthread 实现多线程网络编程的详细讲解和代码示例。
1. pthread 基本概念
pthread是 POSIX 标准的多线程库,在 Linux 上使用广泛,通常通过pthread_create创建线程,通过pthread_join等方式管理线程。- 线程可以共享内存空间和文件描述符,所以在网络编程中,可以让每个线程处理独立的客户端请求。
2. 使用 pthread 和 select 示例
服务器主线程使用 select 接受新连接,子线程处理客户端通信
#include <iostream>
#include <pthread.h>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/select.h>
const int PORT = 8080;
const int MAX_CLIENTS = 10;
const int BUFFER_SIZE = 1024;
struct ThreadArgs
{
int client_socket;
};
void* handle_client(void* args)
{
ThreadArgs* threadArgs = (ThreadArgs*)args;
int client_socket = threadArgs->client_socket;
char buffer[BUFFER_SIZE];
while (true)
{
int valread = read(client_socket, buffer, BUFFER_SIZE);
if (valread <= 0)
{
std::cout << "Client disconnected" << std::endl;
close(client_socket);
break;
}
buffer[valread] = '\0';
std::cout << "Message from client: " << buffer << std::endl;
// Echo back the message to the client
send(client_socket, buffer, strlen(buffer), 0);
}
delete threadArgs;
pthread_exit(NULL);
}
int main()
{
int server_fd, new_socket;
struct sockaddr_in address;
socklen_t addrlen = sizeof(address);
fd_set readfds;
int client_sockets[MAX_CLIENTS] = {0};
// 创建服务器套接字
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0)
{
std::cerr << "Socket creation failed" << std::endl;
return -1;
}
// 初始化地址
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定服务器套接字
if (bind(server_fd, (struct sockaddr *)&address, size

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



