TCP-сервер на LwIP raw API - вопрос о tcp_close и прием обратного вызова

Я использую это простое эхо-сообщение сервер в качестве примера. Он создает прослушивающее соединение, получает пакет, отправляет его обратно, а затем закрывает соединение.

В функции инициализации обратный вызов 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);

В документации говорится, что tcp_close освободит структуру печатной платы. Все обратные вызовы, которые используются для tcp-сервера, регистрируются в этой структуре.

Но когда клиент отправляет новый пакет и запускает новое соединение, вызывается обратный вызов accept! Несмотря на то, что tcp_accept(echo_pcb, echo_accept); (т.е. регистрация обратного вызова) выполняется только один раз в функции init, и эта структура echo_pcb уже освобождена после tcp_close.

Так что я в замешательстве. Почему все остальные обратные вызовы регистрируются несколько раз, а accept регистрируется только один раз? Можно ли так делать?


person Amomum    schedule 28.09.2018    source источник


Ответы (1)


Итак, согласно этому ответ на тот же вопрос в списке рассылки lwip, это правильное поведение. tcp_accept регистрирует обратный вызов для порта, и он не будет отменен при вызове tcp_close.

person Amomum    schedule 05.10.2018
comment
accept создает новое соединение. Это то новое соединение, которое вы закрываете, а не прослушивающий сокет. - person nos; 06.10.2018
comment
@nos в основном, да - person Amomum; 06.10.2018