lwIP 细节之三:TCP 回调函数是何时调用的(编辑中)
Posted 研究是为了理解
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lwIP 细节之三:TCP 回调函数是何时调用的(编辑中)相关的知识,希望对你有一定的参考价值。
使用 lwIP 协议栈进行 TCP 裸机编程
,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。
以下代码注册 TCP 回调函数:
tcp_err(pcb, errf); //注册 TCP 接到 RST 标志或发生错误回调函数 errf
tcp_connect(pcb, ipaddr, port, connected); //注册 TCP 监听到新连接回调函数 connecter
tcp_recv(pcb, recv); //注册 TCP 接收到数据回调函数 recv
tcp_sent(pcb, sent); //注册 TCP 发送数据成功回调函数 sent
tcp_poll(pcb, poll, interval); //注册 TCP 周期性执行回调函数 poll
errf 回调函数
在 TCP 控制块中,函数指针 errf
指向用户实现的 TCP 错误处理函数,当 TCP 连接发送错误时,由协议栈调用此函数。
函数指针 errf
的类型为 tcp_err_fn
,该类型定义在 tcp.h
中:
/** Function prototype for tcp error callback functions. Called when the pcb
* receives a RST or is unexpectedly closed for any other reason.
*
* @note The corresponding pcb is already freed when this callback is called!
*
* @param arg Additional argument to pass to the callback function (@see tcp_arg())
* @param err Error code to indicate why the pcb has been closed
* ERR_ABRT: aborted through tcp_abort or by a TCP timer
* ERR_RST: the connection was reset by the remote host
*/
typedef void (*tcp_err_fn)(void *arg, err_t err);
从注释得知,错误处理函数在接收到 RST
标志,或者连接意外关闭时,由协议栈调用。
注意,当这个函数调用的时候,TCP 控制块已经释放掉了。
协议栈通过宏 TCP_EVENT_ERR(last_state,errf,arg,err)
调用 errf
指向的错误处理函数,宏 TCP_EVENT_ERR
定义在 tcp_priv.h
中:
#define TCP_EVENT_ERR(last_state,errf,arg,err) \\
do \\
LWIP_UNUSED_ARG(last_state); \\
if((errf) != NULL) \\
(errf)((arg),(err)); \\
while (0)
可以看到这个宏的第 4 个参数就是传递给错误处理函数的错误码。
以关键字 TCP_EVENT_ERR
搜索源码,可以搜索到 4 处使用:
TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST);
TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD);
TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);
TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);
用到了 3 个错误码:ERR_RST
、ERR_CLSD
和 ERR_ABRT
,分别表示连接复位、连接关闭和连接异常。
以上是关于lwIP 细节之三:TCP 回调函数是何时调用的(编辑中)的主要内容,如果未能解决你的问题,请参考以下文章