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