LwIP原始API上的TCP Server-关于tcp_close和接受回调的问题

时间:2018-09-28 22:59:18

标签: c tcp lwip

我以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);

Documentationtcp_close将释放pcb结构。用于tcp服务器的所有回调都已使用此结构注册。

但是,当客户端发送新数据包并启动新连接时,将调用accept回调!即使tcp_accept(echo_pcb, echo_accept);(即回调注册)在init函数中仅执行一次,并且echo_pcb结构在tcp_close之后已经释放。

所以我很困惑。为什么所有其他回调都被多次注册,但是accept只被注册一次?这样可以吗?

1 个答案:

答案 0 :(得分:0)

好的,因此根据answer,对lwip邮件列表中的相同问题,这是正确的行为。 tcp_accept注册端口的回调,并且在调用tcp_close时不会取消注册。