14.7:C++网络编程的多路复用和IO模型!(课程共7100字,2段代码举例)

本课程深入讲解C++网络编程中的多路复用技术,包括基于select和epoll函数的实现,以及IO模型的基础概念和应用场景。通过学习,你将掌握如何使用select和epoll实现多客户端与服务端通信,了解阻塞IO、非阻塞IO和异步IO的优缺点。课程特别强调了编程中应注意的细节问题,如文件描述符限制、IO阻塞时间、数据处理和安全性等。
摘要由CSDN通过智能技术生成

🌷🌷🌷🌷① 基于select函数的多路复用
🌷🌷🌷🌷② 基于epoll函数的多路复用

① 基于select函数的多路复用

select函数是一种多路复用技术,它可以同时监视多个文件描述符的状态,当某个文件描述符就绪时,select函数会返回该文件描述符的信息。在C++网络编程中,我们可以利用select函数实现多个客户端和一个服务端之间的通信。以下是一个基于select函数的C++网络编程例子:

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <cstring>

int main() {
    int server_fd, client_fd;
    struct sockaddr_in server_addr{}, client_addr{};
    char buffer[1024]{};
    fd_set read_fds, all_fds;
    int max_fd, fd_num;

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        std::cerr << "Failed to create socket" << std::endl;
        return -1;
    }

    // 绑定地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(8080);
    if (bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Failed to bind address" << std::endl;
        return -1;
    }

    // 监听连接
    if (listen(server_fd, 5) < 0) {
        std::cerr << "Failed to listen connections" << std::endl;
        return -1;
    }

    // 初始化文件描述符集合
    FD_ZERO(&all_fds);
    FD_SET(server_fd, &all_fds);
    max_fd = server_fd;

    // 循环等待客户端连接
    while (true) {
        read_fds = all_fds;
        fd_num = select(max_fd + 1, &read_fds, nullptr, nullptr, nullptr);
        if (fd_num < 0) {
            std::cerr << "Failed to select" << std::endl;
            return -1;
        }

        // 处理新的客户端连接
        if (FD_ISSET(server_fd, &read_fds)) {
            socklen_t client_len = sizeof(client_addr);
            client_fd = accept(server_fd, (struct sockaddr *) &client_addr, &client_len);
            if (client_fd < 0) {
                std::cerr << "Failed to accept client connection" << std::endl;
                return -1;
            }
            std::cout << "New client connected, fd=" << client_fd << std::endl;
            FD_SET(client_fd, &all_fds);
            max_fd = std::max(max_fd, client_fd);
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兔子平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值