提问者:小点点

TCPLwIP服务器不响应来自TCP客户端的[FIN,确认字符]?


因此,如果你查看我的帖子历史,你会知道我一直在使用LwIP尝试TCP的一个项目。我无法在服务器端捕获数据,但现在我已经解决了这个问题。但是现在我有了一个新的问题。

我连接到TCP服务器(STM32-核-144),wireshark显示服务器和客户端之间发生的三方握手,然后我向服务器发送消息,服务器根据编程进行响应,现在我终止客户端的连接,客户端发送一个设置了[FIN,确认字符]标志的数据包,但服务器从不回复[FIN,确认字符]。我使用一个名为大力士的应用程序进行TCP传输,当我按下“断开连接”时,它会显示消息连接关闭,而它从未真正发生过,从wireshark可以看出。

我还使用另一个应用程序来检查,这个应用程序以预定义的间隔连续发送TCP数据包,它创建连接,发送数据包,接受响应然后关闭连接,间隔后它再次重复这个过程。当我启动这个应用程序时,第一个连接被创建,数据被客户端发送和接收,客户端发送了[FIN,确认字符]标志,但从那里开始服务器没有响应。

我做了一个ping测试,似乎一旦断开连接,服务器就变得无法访问。

这是我的代码:-

 /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LWIP_Init();
  /* USER CODE BEGIN 2 */


  IP_ADDR4(&myIPADDR,192,168,33,2);
  IP_ADDR4(&destip,192,168,33,101);

  tcp_pcb = tcp_new();

  err_t err = tcp_bind(tcp_pcb, &myIPADDR, 4100);

  if(err == ERR_OK)
    {
      tcp_pcb = tcp_listen_with_backlog(tcp_pcb, 2);

      tcp_accept(tcp_pcb, tcp_echoserver_accept);
    }

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      ethernetif_input(&gnetif);
      sys_check_timeouts();

  }
  /* USER CODE END 3 */
}
err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
{


    tcp_arg(tcp_newpcb, tcp_newpcb);
    tcp_recv(newpcb, recv_callback);
    return ERR_OK;

}

err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{

    sprintf(data, "this is the message: '%s'", p->payload);

    tcp_recved(tpcb, p->len);
    tcp_write(tpcb, data,p->len+23, 0x02);

    pbuf_free(p);

    err = ERR_OK;
    return err;
}

这是我在大力士中按下断开按钮后显示的是wireshark

13366   6286.571000 192.168.33.101  192.168.33.2    TCP 54  52649 → 4100 [FIN, ACK] Seq=12 Ack=35 Win=65358 Len=0

13367   6286.883778 192.168.33.101  192.168.33.2    TCP 54  [TCP Retransmission] 52649 → 4100 [FIN, ACK] Seq=12 Ack=35 Win=65358 Len=0

13369   6287.498291 192.168.33.101  192.168.33.2    TCP 54  [TCP Retransmission] 52649 → 4100 [FIN, ACK] Seq=12 Ack=35 Win=65358 Len=0

13371   6288.709492 192.168.33.101  192.168.33.2    TCP 54  [TCP Retransmission] 52649 → 4100 [FIN, ACK] Seq=12 Ack=35 Win=65358 Len=0

13374   6291.112720 192.168.33.101  192.168.33.2    TCP 54  [TCP Retransmission] 52649 → 4100 [FIN, ACK] Seq=12 Ack=35 Win=65358 Len=0

共1个答案

匿名用户

在您的接收回调中,您必须检查pbuf指针p是否为NULL在这种情况下,连接在另一端关闭,您需要调用tcp_close。服务器变得无法访问的原因是因为您正在取消引用空指针,这将触发硬故障。