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时不会注销。
我使用 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时不会注销。