System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 单线程实现阻塞式多路IO复用的方法技术_技高网
当前位置: 首页 > 专利查询>杨蒙蒙专利>正文

单线程实现阻塞式多路IO复用的方法技术

技术编号:43870723 阅读:4 留言:0更新日期:2024-12-31 18:55
本发明专利技术公开了单线程实现阻塞式多路IO复用的方法,开创性地仅用单线程和阻塞套接字就实现了多路IO复用,方法包括以下步骤:S1:创建监听套接字、已连接客户链表、读文件描述符集,阻塞监听等待首个新客户连接;S2:监听到新客户连接请求时,创建新链节保存生成的客户通信套接字;S3:向读文件描述符集中依次加入监听套接字和客户通信套接字,监视筛选其中的可读套接字,若监听套接字可读则执行步骤S2;若有客户通信套接字可读,则读取客户数据;之后清空读文件描述符集并迭代执行步骤S3。本发明专利技术克服了现有的多路IO复用通信系统中服务端架构不够轻量化、线程开销大、持续占用CPU等问题,仅用单线程即可响应多客户连接和数据传输请求。

【技术实现步骤摘要】

本专利技术涉及通信,尤其涉及单线程实现阻塞式多路io复用的方法。


技术介绍

1、在互联网、大数据、航空航天等领域,都不可避免要涉及到网络通信的使用,因此产生了在各种场景中利用网络套接字实现多机相互通信的需求,而在网络通信中,c/s网络架构下的客户端和服务端连接通信方式是很常见的,在c/s网络架构中,服务端往往通过网络协议与多个客户端建立连接并传输数据。

2、目前常见的服务端架构中,服务端需要实时监控客户连接请求和数据传输请求,面对多个客户端同时连接的资源调度管理问题,较简单的处理方式是服务端为每个客户的连接各自分配一个或多个线程,以实现对客户连接和数据传输的快速响应,但是这种处理方式需要消耗大量的配置资源,需要的设备建设和运营成本很高,服务端网络的运行压力也很大,特别是在小型的嵌入式设备中,计算资源尤为紧缺,因此需要对服务端架构进行优化,以更少的线程开销满足一定量的客户端连接需求。中国专利公开号cn114237937a,公开日为2022年03月25日,名称为“一种多线程的数据传输方法和装置”公开了一种数据传输方法,其通过实时监听各个套接字接口,将接收数据缓存至套接字接口关联的消息队列,通过消息队列线程依次读取消息队列内的接收数据并解析,根据接收的数据类型向主控服务器或控制客户端发送数据包,提高数据处理效率,然而此方法采用了多个线程来实现监听和响应,资源开销大,且其中的线程采用非阻塞式的运行方式,需要持续占用系统资源,服务端架构不够轻量化。


技术实现思路

1、本专利技术克服了现有的多路io复用通信系统中服务端架构不够轻量化、线程开销大且持续占用系统资源等问题,提供了单线程实现阻塞式多路io复用的方法,通过将监听套接字和客户通信套接字放在同一个读文件描述符集中同时进行监视,在监听套接字可读时接受监听队列中新的客户连接请求,在客户通信套接字可读时接收客户传输的数据,只需要使用单个线程即可实现服务端与多个客户端的连接与通信,使服务端架构更轻量化,无客户请求时线程空闲会进入阻塞状态以释放占用的大部分系统资源,并且单线程结构避免了多线程调度和切换的开销,通信网络运行更高效稳定,同时保证了服务端程序在单核或多核cpu上均可以运行。并且通过创建已连接客户链表及新连接客户的链节插入链表尾部、从链表头结点开始查询各客户通信套接字可读性以及按次序响应客户通信需求,便捷地实现了针对多客户的先来先服务的响应机制;通过分别对每个通信套接字tcp内置的心跳包开启和参数设置,保证了对于阻塞套接字的通信断链检测和处理机制。

2、为了实现上述目的,本专利技术采用以下方案:

3、单线程实现阻塞式多路io复用的方法,其特征在于,包括以下步骤:

4、s1:在服务端线程创建用于监听客户连接请求的监听套接字listenfd,创建用于保存客户通信套接字cltsock的已连接客户链表,创建初始为空的fd_set类型的读文件描述符集rdfdset,调用cltsock = accept(listenfd, ...)阻塞监听等待首个新客户连接;

5、s2:监听到新客户连接请求时,创建新链节保存函数accept()响应客户连接请求所生成的客户通信套接字cltsock,将所述新链节插入到已连接客户链表的尾部;

6、s3:向读文件描述符集rdfdset中依次加入监听套接字listenfd和已连接客户链表中的客户通信套接字cltsock,调用函数select()监视读文件描述符集rdfdset并筛选其中的可读套接字,若没有监视到可读套接字则在函数select()处阻塞等待,否则依次对筛选出的可读套接字做出以下响应:

7、若监听套接字listenfd可读则调用函数accept()并执行步骤s2;若有客户通信套接字cltsock可读,则读取该套接字对应接收到的客户数据;

8、在对所有可读套接字做出响应后清空读文件描述符集rdfdset并迭代执行步骤s3。

9、作为优选,所述步骤s3中,筛选出可读套接字并依次做出响应的方式为:调用函数select()依次判断读文件描述符集rdfdset中的各个套接字是否可读,将其中不可读的套接字剔除,读文件描述符集rdfdset变为可读套接字集,然后调用函数fd_isset()依次判断监听套接字listenfd和客户通信套接字cltsock是否在可读套接字集中,若监听套接字listenfd在可读套接字集中则对客户连接请求做出响应,对在可读套接字集中的客户通信套接字cltsock做出数据接收响应。

10、作为优选,调用函数fd_isset()依次判断监听套接字listenfd和客户通信套接字cltsock是否在筛选出的可读套接字集中的过程包括:

11、调用fd_isset(listenfd,&rdfdset)判断监听套接字listenfd是否仍在该文件集rdfdset中,通过函数返回值判断监听队列是否为空,若监听队列为非空状态则调用函数accept()执行步骤s2;

12、将已连接客户链表中保存的各个客户通信套接字cltsock分别作为传入参数fd依次调用fd_isset(fd,&rdfdset),根据返回值判断客户通信套接字cltsock是否可读,若可读则对该客户通信套接字cltsock进行读取并缓存和使用所接收到的客户数据。

13、作为优选,所述步骤s1中,服务端创建监听套接字listenfd的方式为:

14、调用socket()函数创建一个套接字并调用setsockopt()函数设置套接字的so_reuseaddr套接字选项,再调用bind()函数将此套接字与系统分配的具体ip地址进行绑定,然后以此套接字作为传入参数调用listen()函数创建监听队列以将此套接字转换得到监听套接字listenfd。

15、作为优选,监听套接字listenfd和客户通信套接字cltsock均采用阻塞套接字,创建和使用所述阻塞套接字时选择不调用fcntl函数修改其套接字属性。

16、作为优选,所述步骤s3中,调用函数select()监视读文件描述符集rdfdset并筛选其中的可读套接字时,若判断有客户已断开连接,则关闭该客户所对应的客户通信套接字cltsock并从已连接客户链表中删除其对应的链节。

17、作为优选,判断客户已断开连接的方式至少包括:

18、从客户端通信套接字cltsock中读出了约定关闭时的握手指令数据,所述握手指令数据的格式由服务端与客户端提前约定;

19、调用函数recv或recvfrom或read读取客户端通信套接字时函数的返回值小于0;

20、预设置sig_pipe信号的捕捉程序并捕捉到了对应客户端关闭的sig_pipe信号。

21、作为优选,所述步骤s2中,创建新链节保存客户通信套接字cltsock的过程包括:

22、当监听套接字listenfd的监听队列中至少有一条客户本文档来自技高网...

【技术保护点】

1.单线程实现阻塞式多路IO复用的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,所述步骤S3中,筛选出可读套接字并依次做出响应的方式为:调用函数select()依次判断读文件描述符集rdfdset中的各个套接字是否可读,将其中不可读的套接字剔除,读文件描述符集rdfdset变为可读套接字集,然后调用函数FD_ISSET()依次判断监听套接字ListenFd和客户通信套接字CltSock是否在可读套接字集中,若监听套接字ListenFd在可读套接字集中则对客户连接请求做出响应,对在可读套接字集中的客户通信套接字CltSock做出数据接收响应。

3.根据权利要求2所述的单线程实现阻塞式多路IO复用的方法,其特征在于,调用函数FD_ISSET()依次判断监听套接字ListenFd和客户通信套接字CltSock是否在筛选出的可读套接字集中的过程包括:

4.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,所述步骤S1中,服务端创建监听套接字ListenFd的方式为:

<p>5.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,监听套接字ListenFd和客户通信套接字CltSock均采用阻塞套接字,创建和使用所述阻塞套接字时选择不调用fcntl函数修改其套接字属性。

6.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,所述步骤S3中,调用函数select()监视读文件描述符集rdfdset并筛选其中的可读套接字时,若判断有客户已断开连接,则关闭该客户所对应的客户通信套接字CltSock并从已连接客户链表中删除其对应的链节。

7.根据权利要求6所述的单线程实现阻塞式多路IO复用的方法,其特征在于,判断客户已断开连接的方式至少包括:

8.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,所述步骤S2中,创建新链节保存客户通信套接字CltSock的过程包括:

9.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,所述服务端线程运行在类Unix操作系统中,使用&作为运行参数或在服务端线程中通过system系统调用并传入shell指令使服务端线程的程序在系统后台运行。

10.根据权利要求1所述的单线程实现阻塞式多路IO复用的方法,其特征在于,生成所述客户通信套接字CltSock后,若其为TCP套接字,则分别调用函数setsockopt(CltSock,SOL_SOCKET, SO_KEEPALIVE, …)、setsockopt(CltSock, SOL_TCP, TCP_KEEPIDLE, …)、setsockopt(CltSock, SOL_TCP, TCP_KEEPINTVL, …)、setsockopt(CltSock, SOL_TCP,TCP_KEEPCNT, …)以开启TCP心跳检测及设置相关心跳参数。

...

【技术特征摘要】

1.单线程实现阻塞式多路io复用的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的单线程实现阻塞式多路io复用的方法,其特征在于,所述步骤s3中,筛选出可读套接字并依次做出响应的方式为:调用函数select()依次判断读文件描述符集rdfdset中的各个套接字是否可读,将其中不可读的套接字剔除,读文件描述符集rdfdset变为可读套接字集,然后调用函数fd_isset()依次判断监听套接字listenfd和客户通信套接字cltsock是否在可读套接字集中,若监听套接字listenfd在可读套接字集中则对客户连接请求做出响应,对在可读套接字集中的客户通信套接字cltsock做出数据接收响应。

3.根据权利要求2所述的单线程实现阻塞式多路io复用的方法,其特征在于,调用函数fd_isset()依次判断监听套接字listenfd和客户通信套接字cltsock是否在筛选出的可读套接字集中的过程包括:

4.根据权利要求1所述的单线程实现阻塞式多路io复用的方法,其特征在于,所述步骤s1中,服务端创建监听套接字listenfd的方式为:

5.根据权利要求1所述的单线程实现阻塞式多路io复用的方法,其特征在于,监听套接字listenfd和客户通信套接字cltsock均采用阻塞套接字,创建和使用所述阻塞套接字时选择不调用fcntl函数修改其套接字属性。

6.根据权利要求1所述的单线程实现阻塞式多路io复用的方法,其特征在于,所...

【专利技术属性】
技术研发人员:杨蒙蒙高倩李泽龙
申请(专利权)人:杨蒙蒙
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1