初级会员
- 积分
- 178
- 金钱
- 178
- 注册时间
- 2020-9-8
- 在线时间
- 20 小时
|
发表于 2023-11-8 14:48:28
|
显示全部楼层
本帖最后由 464506176 于 2023-11-8 15:46 编辑
我也遇到这个问题了,不过是407作为[backcolor=rgba(16, 110, 190, 0.18)]Client
研究了几天,正点原子的例程遇到以上情况,会在 i = alloc_socket(conn, 0)里面挨个把
/** The global array of available sockets */
static struct lwip_sock sockets[NUM_SOCKETS];
填满,
006 sockets[0].conn = 536933532
006 sockets[1].conn = 536933492
006 sockets[2].conn = 536933452
006 sockets[3].conn = 0
006 sockets[3].newconn = 536933412
这样后面就会:因为tcp_slowtmr: no active pcbs
而导致:
lwip_socket(PF_INET, SOCK_STREAM, 0) = -1 / ENOBUFS (could not create netconn)
不能创建 netconn,永远连接失败了,即使服务器重启或网线恢复连接也不行。
程序里closesocket(g_sock)了也不对,这部分资源没有被释放,还是失败。
至于怎么解决呢?我只是个画PCB的硬件小可爱,暂时没找到办法。只能直接让单片机重启了
好了,找到原因了:
/* 连接远程IP地址 */
err = connect(g_sock, (struct sockaddr *)&atk_client_addr, sizeof(struct sockaddr));
if (err == -1)
{
printf("连接失败:%d\r\n",g_sock);
// g_sock = -1; //这里之前g_sock=0,强制赋值-1,导致后面的closesocket失效,没有释放相应的资源
closesocket(g_sock);
g_sock = -1; //改到这里就对了
// netconn_delete(conn_his);
myfree(SRAMIN, tbuf);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
vTaskDelay(200);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
vTaskDelay(200);
goto sock_start;
}
|
|