【lwIP(第六章)】超时事件处理

文章介绍了超时事件处理的基本概念,如在TCP连接和ARP缓存中的应用,并详细阐述了如何管理超时事件,包括使用lwip_cyclic_timer结构体进行事件注册,通过sys_timeouts_init初始化,sys_untimeout函数删除超时事件,以及查询和处理超时事件的方法。
摘要由CSDN通过智能技术生成

一、超时事件处理简介

为每个与外界网络连接的任务都设定了timeout属性,即等待超时时间,例如TCP建立连接超时、ARP缓存表项的时间管理等,都需要超时操作来处理

在这里插入图片描述


二、超时事件如何管理

申请所需的超时事件

/* 轮询超时事件结构体 */
typedef void (* lwip_cyclic_timer_handler)(void); 
struct lwip_cyclic_timer 
{ 
	u32_t interval_ms; 					/* 超时时间 */ 
	lwip_cyclic_timer_handler handler; 	/* 超时处理函数 */ 
};

管理超时事件

typedef void (* sys_timeout_handler)(void *arg); 
struct sys_timeo 
{ 
	struct sys_timeo *next; 	/* 下一个超时事件的指针 */ 
	u32_t time; 			/* 当前超时事件的等待时间 */ 
	sys_timeout_handler h; 	/* 指向超时的回调函数 */ 
	void *arg; 			/* 超时的回调函数形数 */ 
};

三、超时事件如何注册

void sys_timeouts_init(void) 
{ 
	size_t i; /* 遍历轮询超时事件数组 */ 
	
	for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) 
	{ 
	/* 注册超时事件 */ 
			sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer,
	        LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); 
	} 
}

在这里插入图片描述


四、超时事件如何删除

void sys_untimeout(sys_timeout_handler handler, void *arg) 
{ 
	struct sys_timeo *prev_t, *t; 
	
	if (next_timeout == NULL){ 
		return; 
	} 
	
	/* 从链表头开始遍历这个链表 */ 
	for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next){ 
		/* 查找删除的超时事件,判断超时事件的回调函数与函数参数释放一致 */ 
		if ((t->h == handler) && (t->arg == arg)) 
		{ 
		if (prev_t == NULL) { 
			next_timeout = t->next; } 
		else { 
			prev_t->next = t->next; } 
			memp_free(MEMP_SYS_TIMEOUT, t); 
			return; 
		} 
	} 
	return; 
}

在这里插入图片描述

五、超时事件如何查询

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值