加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Linux通过改进的epoll达成对不同超时时间的数据包重传

发布时间:2021-11-20 15:25:49 所属栏目:教程 来源:互联网
导读:用背景: epoll模型是当前Linux网络编程的主流模型,可以高效解决多个事件并发的问题。在进行网络编程时,往往要对每一个发出的数据包进行ACK确认,若在指定的时间内没有收到ACK,则需要重传或者丢弃该数据包。那么如果在epoll模型中实现该功能呢? 先来看看
用背景:
 
epoll模型是当前Linux网络编程的主流模型,可以高效解决多个事件并发的问题。在进行网络编程时,往往要对每一个发出的数据包进行ACK确认,若在指定的时间内没有收到ACK,则需要重传或者丢弃该数据包。那么如果在epoll模型中实现该功能呢?
 
先来看看传统的做法:程序维护一个“已发出但是没收到ACK”的数据包记录R,记录包括数据包内容、数据包发送的时间戳t以及超时时间T。当需要进行数据包发送时,在发出数据包的同时把该数据包加入记录R,接下来程序继续执行。在这个方法中,程序需要通过一种手段定时检测当前时间now是否大于记录R中的每一个数据包的t+T,若大于,则说明数据包接收ACK超时,可以通过多线程技术或者在程序主循环中每循环一次检测一次。
 
现在的问题是:一般的epoll模型,程序都会阻塞在epoll_wait调用上,程序没有办法循环检测记录R,有人会说,epoll_wait不是有超时时间么?的确,但是这个超时只能针对一个数据包的情况,试想一下,若程序当前依次发出了10个数据包,各自的超时时间分别为3秒、5秒、2秒等等,那么epoll_wait的超时时间应该设置多长呢?答案是没有办法。因为前面的数据包万一设置的epoll_wait超时时间比较长,后面来了一个超时时间短的,由于epoll_Wait的阻塞,就会错失后面超时时间短的数据包的重发机会。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读