TCP-сервер на LwIP raw API - вопрос о tcp_close и принятии обратного вызова - PullRequest
0 голосов
/ 29 сентября 2018

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

В функции инициализации, обратный вызов 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 освободит структуру pcb.Все обратные вызовы, которые используются для tcp-сервера, зарегистрированы с этой структурой.

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

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

1 Ответ

0 голосов
/ 06 октября 2018

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

...