LwIP raw API 上的 TCP 服务器 - 关于 tcp_close 的问题并接受回调

TCP Server on LwIP raw API - question about tcp_close and accept callback

我使用 this 简单的回显服务器作为示例。 它创建一个侦听连接,接收一个数据包,将其发回,然后关闭连接。

在初始化函数中,accept回调是这样注册在lwip中的:

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 只注册了一次?这样可以吗?

好的,所以根据这个 answer 到 lwip 邮件列表上的相同问题,这是正确的行为。 tcp_accept注册一个端口回调,调用tcp_close时不会注销。