我以this简单的echo服务器为例。 它创建一个侦听连接,接收数据包,将其发送回,然后关闭连接。
在初始化函数中,如下所示在lwip中注册了accept回调:
void
echo_init(void)
{
echo_pcb = tcp_new();
...
echo_pcb = tcp_listen(echo_pcb);
tcp_accept(echo_pcb, echo_accept);
每次回显会话结束后,服务器都会关闭连接,如下所示:
void
echo_close(struct tcp_pcb *tpcb, struct echo_state *es)
{
tcp_arg(tpcb, NULL);
tcp_sent(tpcb, NULL);
tcp_recv(tpcb, NULL);
tcp_err(tpcb, NULL);
tcp_poll(tpcb, NULL, 0);
if (es != NULL)
{
mem_free(es);
}
tcp_close(tpcb);
Documentation说tcp_close
将释放pcb结构。用于tcp服务器的所有回调都已使用此结构注册。
但是,当客户端发送新数据包并启动新连接时,将调用accept回调!即使tcp_accept(echo_pcb, echo_accept);
(即回调注册)在init
函数中仅执行一次,并且echo_pcb
结构在tcp_close
之后已经释放。
所以我很困惑。为什么所有其他回调都被多次注册,但是accept只被注册一次?这样可以吗?