TCP控制块中定义了以下几种回调函数:
err_t (* sent)(void *arg, struct tcp_pcb *pcb, u16_t space);
err_t (* recv)(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
err_t (* connected)(void *arg, struct tcp_pcb *pcb, err_t err);
err_t (* poll)(void *arg, struct tcp_pcb *pcb);
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)
以 err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)为例,当处于监听状态的控制块监听到连接时,该函数会被调用,在程序中,我们会定义这样一个回调函数,比如
err_t TCP_Server_Accept(void *arg,
struct tcp_pcb *pcb,err_t err)
{ tcp_recv(pcb,usr_recv);//设置下位机接收到数据后的回调函数
return ERR_OK;
}
于是,我们还会编写下位机接收到数据后的回调函数,如下
err_t usr_recv(void *arg,
struct tcp_pcb *pcb,struct pbuf *p,err_t err)
{......}
我有两个问题:
- TCP_Server_Accept和 usr_recv两个函数中的形参struct tcp_pcb *pcb是同一个pcb吗?这个pcb如何产生的?我的理解是这两个就是同一个pcb,都是服务器端用来通信的那个pcb,当服务器和客户端通信建立时,这个pcb就自动产生,不知道理解的有没有问题。。。。
- TCP控制块中的回调函数形参void *arg是个什么意思?