利用C语言基于poll实现TCP回声服务器的多路复用模型

简介: 此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。

利用C语言实现基于 poll的TCP回声服务器,可以高效地处理多个客户端连接,这种模型被称为多路复用。下面是一个精简而专业的指南,展示了如何通过 poll来实现这一目标。

关键概念

  • TCP服务器:一种在网络编程中常用的服务器模型,用于提供可靠的、面向连接的通信。
  • 回声服务器:这种服务器简单地将接收到的数据回发给发送者。
  • poll系统调用poll提供了一种方式,允许程序监视多个文件描述符集合中的事件,是多路复用编程的一种方式。

实现步骤

  1. 初始化服务器

    • 创建一个TCP套接字。
    • 将套接字绑定到服务器地址(IP地址和端口)。
    • 监听套接字,准备接受客户端连接。
  2. 设置 poll

    • 创建 pollfd结构体数组,以跟踪和管理多个套接字。
    • 将监听套接字加入到 pollfd数组中,设置相应的事件为 POLLIN,以表明我们对可读事件感兴趣。
  3. 事件循环

    • 使用 poll系统调用等待事件发生。poll调用将阻塞,直到一个或多个套接字准备好进行I/O操作。

    • 遍历 pollfd数组,检查哪些套接字有事件发生。

      • 如果监听套接字有事件发生,接受新的客户端连接,并将新的套接字添加到 pollfd数组中。
      • 如果是已连接的客户端套接字上有事件发生,读取数据并回发给客户端。如果读取到的数据长度为0(客户端关闭连接),则关闭套接字并从 pollfd数组中移除。
  4. 数据处理

    • 从活跃的客户端套接字读取数据。
    • 将接收到的数据原封不动地发送回客户端。
  5. 清理与资源管理

    • 一旦服务完成,关闭所有打开的套接字。
    • 确保在退出程序前释放所有分配的资源。

示例代码

下面是一个简化的示例代码,展示了如何使用 poll来实现多路复用的TCP回声服务器:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>

#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024

int main() {
    int sockfd, newsockfd, portno = 12345;
    struct sockaddr_in serv_addr, cli_addr;
    socklen_t clilen;
    struct pollfd fds[MAX_CLIENTS];
    int nfds = 1, current_size = 0, i, ret;
    char buffer[BUFFER_SIZE];

    // 创建TCP套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("ERROR opening socket");
        exit(1);
    }

    // 绑定到本地地址
    memset((char *)&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);

    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        perror("ERROR on binding");
        exit(1);
    }

    // 监听
    listen(sockfd, 5);

    // 初始化pollfd结构
    memset(fds, 0 , sizeof(fds));
    fds[0].fd = sockfd;
    fds[0].events = POLLIN;

    // 循环等待
    while (1) {
        ret = poll(fds, nfds, -1);
        if (ret < 0) {
            perror("ERROR on poll");
            exit(1);
        }

        // 检查是否是新连接
        if (fds[0].revents & POLLIN) {
            clilen = sizeof(cli_addr);
            newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
            if (newsockfd < 0) {
                perror("ERROR on accept");
                continue;
            }
            fds[nfds].fd = newsockfd;
            fds[nfds].events = POLLIN;
            nfds++;
        }

        // 检查数据接收
        for (i = 1; i < nfds; i++) {
            if (fds[i].revents & POLLIN) {
                memset(buffer, 0, BUFFER_SIZE);
                ret = read(fds[i].fd, buffer, BUFFER_SIZE);
                if (ret < 0) {
                    perror("ERROR reading from socket");
                    close(fds[i].fd);
                    continue;
                } else if (ret == 0) {
                    close(fds[i].fd);
                    fds[i].fd = -1; // 标记为不用
                } else {
                    write(fds[i].fd, buffer, ret);
                }
            }
        }
    }

    close(sockfd);
    return 0;
}

此代码仅为示例,展示了如何基于 poll实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。

目录
相关文章
|
2月前
|
数据可视化 Linux 网络安全
如何使用服务器训练模型
本文介绍了如何使用服务器训练模型,包括获取服务器、访问服务器、上传文件、配置环境、训练模型和下载模型等步骤。适合没有GPU或不熟悉Linux服务器的用户。通过MobaXterm工具连接服务器,使用Conda管理环境,确保训练过程顺利进行。
116 0
如何使用服务器训练模型
|
2月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
67 2
|
2月前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
73 1
|
2月前
|
存储 PyTorch API
NVIDIA Triton系列09-为服务器添加模型
本文介绍了如何为NVIDIA Triton模型仓库添加新模型。通过示例模型`inception_graphdef`的配置文件`config.pbtxt`,详细解释了模型名称、平台/后端名称、模型执行策略、最大批量值、输入输出节点及版本策略等配置项。内容涵盖了模型的基本要素和配置细节,帮助读者更好地理解和使用Triton服务器。
37 0
|
2月前
|
机器学习/深度学习 人工智能 并行计算
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
41 0
|
2月前
|
网络协议 Python
Python创建一个TCP服务器
Python创建一个TCP服务器
23 0
|
3天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
|
4天前
|
SQL 弹性计算 安全
阿里云上云优选与飞天加速计划活动区别及购买云服务器后续必做功课参考
对于很多用户来说,购买云服务器通常都是通过阿里云当下的各种活动来购买,这就有必要了解这些活动的区别,同时由于活动内的云服务器购买之后还需要单独购买并挂载数据盘,还需要设置远程密码以及安全组等操作之后才能正常使用云服务器。本文就为大家介绍一下目前比较热门的上云优选与飞天加速计划两个活动的区别,以及通过活动来购买云服务器之后的一些必做功课,确保云服务器可以正常使用,以供参考。
|
7天前
|
弹性计算 安全 开发工具
灵码评测-阿里云提供的ECS python3 sdk做安全组管理
批量变更阿里云ECS安全组策略(批量变更)
|
24天前
|
存储 人工智能 弹性计算
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理。通过合理优化资源分配、利用自动伸缩及高效数据管理,ECS能显著提升AI系统的性能与效率,降低运营成本,助力科研与企业用户在AI领域取得突破。
45 6