c - LwIP 原始 API 上的 TCP 服务器 - 关于 tcp_close 和接受回调的问题

标签 c tcp lwip

我正在使用this以简单的 echo-server 为例。 它创建一个监听连接,接收数据包,将其发回,然后关闭连接。

在初始化函数中,accept回调在lwip中注册如下:

void
echo_init(void)
{
    echo_pcb = tcp_new();
    ...
    echo_pcb = tcp_listen(echo_pcb);
    tcp_accept(echo_pcb, echo_accept);

每次回显 session 后服务器都会关闭连接,如下所示:

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 时不会取消注册。

关于c - LwIP 原始 API 上的 TCP 服务器 - 关于 tcp_close 和接受回调的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52563580/

相关文章:

java - 将套接字连接绑定(bind)到不同机器上的不同端口?

Linux TCP 堆栈 - 对等重置或连接断开的通知

c - 多播 UDP 在我的主板上不起作用

tcp - 如何将 lwIP tcp/ip 堆栈与微 Controller stm32f4(客户端)一起使用

c - 为什么我得到 24 作为此代码的输出

c - 在翻译单元中使用 extern

java - Java 中的简单网络聊天

tcp - lwip 初始化网络接口(interface)

c - 如何将 2 个 char 变量组合并存储在一个整型变量中?

任何人都可以举一个例子说明这个优先级很重要吗?