在使用 RT-Thread 中的客户端 socket 连接服务器时,如果连接中断后再次连接同一个服务器,可能会出现连接延迟的情况。这可能是由于 TIME_WAIT 状态引起的。
在 TCP 连接中,当客户端主动关闭连接后,连接状态会进入 TIME_WAIT 状态,等待一段时间后才能释放资源。如果在 TIME_WAIT 状态下,客户端再次连接同一个服务器,可能会出现连接延迟的情况。
要解决这个问题,可以通过以下方法:
增加 TIME_WAIT 时间:可以通过修改 TCP 系统参数,增加 TIME_WAIT 时间,让连接状态更长时间保持在 TIME_WAIT 状态下,从而减少连接延迟的可能。在 RT-Thread 中,可以通过修改 lwipopts.h 文件中的 LWIP_TCP_TIME_WAIT_DELAY 宏定义来实现。
修改连接方式:可以修改连接方式,使用不同的连接方式来避免 TIME_WAIT 状态的影响。例如,可以使用长连接或者连接池等方式,复用连接,减少连接频率,从而降低出现连接延迟的可能。
以下是一个示例代码,用于增加 TIME_WAIT 时间:
/* 修改 TCP TIME_WAIT 时间 */
#define LWIP_TCP_TIME_WAIT_DELAY 120
int main(void)
{
/* 启动网络协议栈 */
netif_device_start_all();
/* 设置 TCP TIME_WAIT 时间 */
lwip_init();
sys_sem_t sem;
sys_sem_new(&sem, 0);
/* 在启动 lwip 后等待 10 秒钟,等待 TCP TIME_WAIT 时间生效 */
rt_thread_delay(RT_TICK_PER_SECOND * 10);
/* 连接服务器 */
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(1234);
inet_aton("192.168.1.1", &server_addr.sin_addr);
connect(fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
/* 进入线程循环 */
while (1) {
rt_thread_mdelay(1000);
}
}
在上面的代码中,通过修改 lwipopts.h 文件中的 LWIP_TCP_TIME_WAIT_DELAY 宏定义将 TIME_WAIT 时间从默认的 2 秒增加到了 120 秒。在启动 lwip 后等待 10 秒钟,等待 TCP TIME_WAIT 时间生效,然后再连接服务器,这样可以减少连接延迟的可能。
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~