Skip to content

Commit d037ca3

Browse files
committed
[telnet]fix telnet tcp connection exception, set keepalive and send timeout
1 parent b77ba3f commit d037ca3

1 file changed

Lines changed: 49 additions & 1 deletion

File tree

telnet/telnet.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,55 @@ static void telnet_thread(void* parameter)
509509
{
510510
continue;
511511
}
512-
512+
513+
#if (defined(LWIP_SO_SNDTIMEO) && LWIP_SO_SNDTIMEO) || defined(RT_USING_DFS_NET) || defined(SAL_USING_POSIX)
514+
/* set send timeout */
515+
struct timeval snd_to = {0};
516+
snd_to.tv_sec = 0;
517+
snd_to.tv_usec = 5000 * 1000;
518+
if (setsockopt(telnet->client_fd, SOL_SOCKET, SO_SNDTIMEO, (void *)&snd_to, sizeof(snd_to)) < 0)
519+
{
520+
closesocket(telnet->client_fd);
521+
rt_kprintf("telnet:set socket send timeout failed\n");
522+
continue;
523+
}
524+
#endif /* (defined(LWIP_SO_SNDTIMEO) && LWIP_SO_SNDTIMEO) || defined(RT_USING_DFS_NET) || defined(SAL_USING_POSIX) */
525+
526+
/* set keepalive */
527+
rt_int32_t keepalive_en = 1;
528+
if (setsockopt(telnet->client_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive_en, sizeof(keepalive_en)) < 0)
529+
{
530+
closesocket(telnet->client_fd);
531+
rt_kprintf("telnet:set socket keepalive failed\n");
532+
continue;
533+
}
534+
535+
#if (defined(LWIP_TCP_KEEPALIVE) && LWIP_TCP_KEEPALIVE) || defined(RT_USING_DFS_NET) || defined(SAL_USING_POSIX)
536+
int keepidle = 5;
537+
if (setsockopt(telnet->client_fd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&keepidle, sizeof(keepidle)) < 0)
538+
{
539+
closesocket(telnet->client_fd);
540+
rt_kprintf("telnet:set socket keepidle failed\n");
541+
continue;
542+
}
543+
544+
int keepintvl = 1;
545+
if (setsockopt(telnet->client_fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepintvl, sizeof(keepintvl)) < 0)
546+
{
547+
closesocket(telnet->client_fd);
548+
rt_kprintf("telnet:set socket keepintvl failed\n");
549+
continue;
550+
}
551+
552+
int keepcnt = 3;
553+
if (setsockopt(telnet->client_fd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcnt, sizeof(keepcnt)) < 0)
554+
{
555+
closesocket(telnet->client_fd);
556+
rt_kprintf("telnet:set socket keepcnt failed\n");
557+
continue;
558+
}
559+
#endif /* (defined(LWIP_TCP_KEEPALIVE) && LWIP_TCP_KEEPALIVE) || defined(RT_USING_DFS_NET) || defined(SAL_USING_POSIX) */
560+
513561
rt_kprintf("telnet: new telnet client(%s:%d) connection, switch console to telnet...\n", inet_ntoa(addr.sin_addr), addr.sin_port);
514562

515563
/* process the new connection */

0 commit comments

Comments
 (0)