c++开发实战之网络编程(四 服务端多线程)

在 C++ 网络编程中,结合 selectepollpoll 这些 I/O 多路复用技术与多线程编程,可以实现一个高效的并发服务器。使用 pthread 创建多线程可以让每个线程处理不同的客户端请求,提升服务器的并发处理能力。

下面是关于如何使用 selectpollepoll 结合 pthread 实现多线程网络编程的详细讲解和代码示例。

1. pthread 基本概念

  • pthread 是 POSIX 标准的多线程库,在 Linux 上使用广泛,通常通过 pthread_create 创建线程,通过 pthread_join 等方式管理线程。
  • 线程可以共享内存空间和文件描述符,所以在网络编程中,可以让每个线程处理独立的客户端请求。

2. 使用 pthreadselect 示例

服务器主线程使用 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值