接着上文IO多路复用(一)– Select、Poll、Epoll,接下来将演示一个TCP回射程序,源代码来自于该博文I/O多路复用之Select总结,在这里将其进行了整合,突出select、poll和epoll不同方法之间的比较,但是代码的结构相同,为了突出方法之间的差别,可能有的代码改动的并不合理,实际中使用并非这么写。

程序逻辑

该程序的主要逻辑如下:

服务器:

  1. 开启服务器套接字
  2. 将服务器套接字加入要监听的集合中(select的fd_set、poll的pollfd、epoll调用epoll_ctl)
  3. 进入循环,调用IO多路复用的API函数(select/poll/epoll_create),如果有事件产生:
    3.1. 服务器套接字产生的事件,添加新的客户端到监听集合中
    3.2. 客户端套接字产生的事件,读取数据,并立马回传给客户端

客户端:

  1. 开启客户端套接字
  2. 将客户端套接字和标准输入文件描述符加入要监听的集合中(select的fd_set、poll的pollfd、epoll调用epoll_ctl)
  3. 进入循环,调用IO多路复用的API函数(select/poll/epoll_create),如果有事件产生:
    3.1. 客户端套接字产生的事件,则读取数据,将其输出到控制台
    3.2. 标准输入文件描述符产生的事件,则读取数据,将其通过客户端套接字传给服务器

multiplexing.h

具体代码如下,首先是头文件

multiplexing.cpp

然后是函数的实现,从各个函数的实现可以看到select、poll、epoll在使用过程中的区别,具体看代码注释

服务器代码

客户端代码

运行结果

服务端:

客户端:

完整代码可以访问笔者github:https://github.com/yearsj/Cli…



如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!

基于 OpenCLAW + 飞书构建企业级运维智能助手实践

一、引言 在云原生与分布式架构普及的今天,传统运维模式面临着告警分散、操作繁琐、响应滞后、风险不可控等挑战。本文介绍如何基于 OpenCLAW 大模型网关...

阅读全文

CI/CD(七)镜像全球分发

环境 代码托管:gitlab CI:tekton pipline/task: 阿里云 serverless容器(spot实例且按秒计费) 任务管理:redis 镜像分发工具:crane 效果 核心实现 就近...

阅读全文

基于Informer事件实现多阶梯放量(应用预热)

背景 流量控制是保证服务稳定性的重要手段之一。大数据应用服务因为有缓存构建的过程,需要在启动后通过小流量出发缓存构建再才接收全量流量,若未构建缓存会...

阅读全文

欢迎留言