【网络编程】IO多路复用

这篇具有很好参考价值的文章主要介绍了【网络编程】IO多路复用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


        IO多路复用是一种高效的I/O处理方式,它允许单个进程能够同时监视多个文件描述符(sockets、文件等),并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作,以提高系统的性能和响应速度

一、概念


1. IO多路复用的核心

        文件描述符集合:使用一个数据结构(如数组或位图)来管理多个文件描述符,通常使用select、poll或epoll等系统调用来监视这些文件描述符。

        阻塞与非阻塞:IO多路复用可以与阻塞和非阻塞I/O一起使用。非阻塞I/O允许程序立即返回,而不必等待数据准备好。

        事件驱动:当一个或多个文件描述符准备好进行读取或写入操作时,IO多路复用会触发相应的事件,从而通知应用程序执行相应的操作。

        单线程/多线程:IO多路复用可以由单个线程或多个线程来处理,取决于应用程序的需求。通常,单个线程可以管理多个文件描述符。

2. 四种IO模型

阻塞IO模型(Blocking IO)

        ① 阻塞IO模型是最简单的IO模型之一;
        ② 当程序执行IO操作时,它会被阻塞,直到IO操作完成为止;
        ③ 这种模型的效率较低,因为程序在等待IO完成期间无法执行其他任务。

【网络编程】IO多路复用,系统编程,网络编程,网络,tcp/ip,网络协议,服务器,数据库


非阻塞IO模型(Non-blocking IO)

        ① 非阻塞IO模型允许程序在等待IO完成时继续执行其他任务;
        ② 当程序请求IO操作时,它会立即返回,不会被阻塞;
        ③ 程序需要不断轮询以检查IO操作是否完成,这可能会导致CPU资源浪费。

【网络编程】IO多路复用,系统编程,网络编程,网络,tcp/ip,网络协议,服务器,数据库


多路复用IO模型(IO Multiplexing)

        ① 多路复用IO模型使用了一种机制,允许程序同时等待多个IO操作的完成;
        ② 通常使用select、poll或epoll等系统调用来实现;
        ③ 程序可以同时监视多个文件描述符,只有当其中某个文件描述符有IO事件发生时,程序才会被唤醒处理该事件。


异步IO模型(Asynchronous IO)

        ① 异步IO模型中,程序发起IO操作后立即返回,不会阻塞;
        ② 当IO操作完成时,系统会通知程序,然后程序处理完成的数据;
        ③ 这种模型的效率很高,因为程序不需要轮询,但实现复杂度较高。

        因此IO复用的核心基本思想为:先构造一张有关描述符的表,然后调用一个函数。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。函数返回时告诉进程哪些描述符已就绪,可以进行I/O操作。

3. IO复用的优点

  • 高效利用CPU:相较于传统的多线程/多进程模型,IO多路复用可以减少线程/进程的创建和切换开销,提高CPU的利用率。

  • 减少资源占用:减少了每个连接的资源消耗,因为不再需要为每个连接创建一个线程或进程。

  • 简化程序逻辑:IO多路复用可以简化程序的逻辑,使得代码更易于维护和理解。

二、代码实现(TCP服务器端为例)

【网络编程】IO多路复用,系统编程,网络编程,网络,tcp/ip,网络协议,服务器,数据库

1. 创建监听套接字socket

	// 创建套接字socket
	int ser_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (ser_socket == -1)
	{
		perror("socket");
		return -1;
	}

	int reuse = 1;
	//设置套接字属性,  SO_REUSEADDR 允许端口重用 
    if(setsockopt(ser_socket, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse))<0)
    {
        perror("setsockopt error");
        return -1;
    }


2. 初始化套接字和服务器自己的IP地址结构体(包括端口号)

// 初始化地址结构体 // IP地址+PORT端口号
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;   						//地址簇
	addr.sin_port = atoi(argv[1]);								//端口(一般以传参的传进来)
	// addr.sin_addr.s_addr = inet_addr("192.168.1.25");	//IP地址
	addr.sin_addr.s_addr = htonl(INADDR_ANY);			//用特殊的"0.0.0.0"这个IP来绑定本机IP地址


3. 绑定bind

// 绑定地址结构体bind
	int b = bind(ser_socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
	if(b == -1)
	{
		perror("bind");
		return -1;
	}
	printf("绑定成功\n");


4. 开启监听listen

int l = listen(ser_socket, 3);
	if (l == -1)
	{
		perror("listen");
		return -1;
	}
	printf("监听成功\n");//ser_socket由 待链接套接字 变成 监听套接字


5. 创建文件描述符集合,并初始化

        这里呢设置了套接字超时,就是在规定的时间内如果没有客户端连接,则退出服务器。

//设置套接字接收超时
	struct timeval tv;
	tv.tv_sec = 5; //超时秒数
	tv.tv_usec = 0;
    setsockopt(ser_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 

	// 等待连接accept
	struct sockaddr_in c_addr;		//用来存放客户端链接成功之后的IP加端口
	int addrlen = sizeof(c_addr);
	int new_socekt = accept(ser_socket, (struct sockaddr *)&c_addr, &addrlen);
	if (new_socekt == -1)
	{
		printf("延时时间到了,服务器退出了\n");
		perror("accept");
		return -1;
	}
	// new_socekt 链接成功之后,用来通信的套接字
	printf("客户端【%s】【%u】连接成功\n", inet_ntoa(c_addr.sin_addr), c_addr.sin_port);
	//客户端的IP跟端口,IP是你客户端本身自带的,但是端口是系统随机分配的啊

	// 接收消息read/recv
	char buf[1024];
	while(1)
	{
		bzero(buf, sizeof(buf));
		read(new_socekt, buf, sizeof(buf));
		// recv(new_socekt, buf, sizeof(buf), 0);
		printf(" client %s\n", buf);
	}


6. 资源释放,关闭套接字

close(new_socekt);
	// shutdown(new_socekt, SHUT_RDWR);

三、使用场景


       1. 网络服务器: IO复用常用于网络服务器,特别是需要同时处理大量客户端连接的情况,例如Web服务器、聊天服务器和在线游戏服务器。

       2. 网络代理: 代理服务器需要同时监听多个客户端和服务器连接,以便在它们之间传递数据,这是IO复用的典型应用场景。

        3. 聊天应用: 实时聊天应用通常需要处理多个客户端的消息,IO复用可以用于同时监视多个客户端连接,以便实时传递消息。

        4. 文件传输应用: 文件传输服务器需要同时处理多个文件上传或下载请求,使用IO复用可以有效管理这些请求。

        更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            系统、网络编程

                                     探索C++

                                             6818(ARM)开发板实战文章来源地址https://www.toymoban.com/news/detail-702494.html

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉🎉🎉感谢关注🎉🎉🎉

到了这里,关于【网络编程】IO多路复用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP/IP网络编程 第十六章:关于IO流分离的其他内容

    两次I/O流分离 我们之前通过2种方法分离过IO流,第一种是第十章的“TCPI/O过程(Routine)分离”。这种方法通过调用fork函数复制出1个文件描述符,以区分输入和输出中使用的文件描述符。虽然文件描述符本身不会根据输入和输出进行区分,但我们分开了2个文件描述符的用途

    2024年02月16日
    浏览(29)
  • 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页 文章收录专栏:网络socket编程之温度采集智能存储与上报项目,本

    2024年04月10日
    浏览(34)
  • 网络编程代码实例:IO复用版

    网络编程代码实例:IO复用版。 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com) Environment-and-network-programming-examples: 环境和网络编程实例 (gitee.com) 使用传输控制协议(TCP) 服务端多进程,一个服务端可连接多个客户端 用户在客户端终端输入,可多次

    2024年02月02日
    浏览(27)
  • 【高并发网络通信架构】引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

    目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_create 方法 6.epoll_ctl 方法 7.epoll_wait 方法 8.struct epoll_event 结构体 四,代码实现 select 操作流程 s

    2024年02月12日
    浏览(43)
  • 【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

    目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_create 方法 6.epoll_ctl 方法 7.epoll_wait 方法 8.struct epoll_event 结构体 四,代码实现 select 操作流程 s

    2024年02月14日
    浏览(32)
  • 使用Linux系统IO多路复用中eopll创建基于TCP通信协议的多人聊天室

    一.1.搭建好TCP的通信模型 2.创建红黑树根节点 3.将套接字事件添加到红黑树中,使其被监听 4.当套接字事件发生,表示有客户端连接,将连接事件加入到红黑树节点当中 5.每当连接事件发生时,表示客户端发送信息到服务器 6.每当有事件准备就绪时,将对应的红黑树节点信息

    2024年02月13日
    浏览(34)
  • Linux TCP/UDP socket 通信和IO多路复用

    主机字节序 16 位值 == 网络字节序 16 位值 主机字节序 32 位值 == 网络字节序 32 位值 主机字节序的字符串IP地址  == 网络字节序的整形IP地址 将监听的套接字和本地IP和端口进行关联 给监听的套接字设置监听,开始检测客户端链接 等待并接受客户端的连接,阻塞函数,没有客

    2024年02月05日
    浏览(44)
  • 网络模型与 IO 多路复用

      socket也称作“套接字”,用于描述IP地址和端口,是一个通信链路的描述符。应用程序通常通过“套接字”向对端发出请求或者应答网络请求。   socket是连接运行在网络上的两个程序之间的通信端点。通信的两端都有socket,它是一个通道,数据在两个socket之间进行传输

    2024年02月01日
    浏览(36)
  • TCP服务器的演变过程:IO多路复用机制select实现TCP服务器

    手把手教你从0开始编写TCP服务器程序,体验开局一块砖,大厦全靠垒。 为了避免篇幅过长使读者感到乏味,对【TCP服务器的开发】进行分阶段实现,一步步进行优化升级。 本节,在上一章节的基础上,将并发的实现改为IO多路复用机制,使用select管理每个新接入的客户端连

    2024年02月03日
    浏览(45)
  • IO多路复用中select的TCP服务器模型和poll服务模型

    服务器端 客户端 poll客户端

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包