Я использую этот простой эхо-сервер в качестве примера.Он создает прослушивающее соединение, получает пакет, отправляет его обратно и затем закрывает соединение.
В функции инициализации, обратный вызов 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 регистрируется только один раз?Можно ли так делать?