因此,如果你查看我的帖子历史,你会知道我一直在使用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
在您的接收回调中,您必须检查pbuf指针p是否为NULL
在这种情况下,连接在另一端关闭,您需要调用tcp_close
。服务器变得无法访问的原因是因为您正在取消引用空指针,这将触发硬故障。