Стек lwip netconn api сохранить соединение "keep-alive"
В настоящее время я работаю со стеком lwip для реализации сервера Modbus, но функция keep-alive не работает. Может кто-нибудь посмотреть на мою проблему?
код:
static void prvweb_ParseHTMLRequest( struct netconn *pxNetCon )
{
struct netbuf *pxRxBuffer;
portCHAR *pcRxString;
unsigned portSHORT usLength;
static unsigned portLONG ulPageHits = 0;
while(netconn_recv( pxNetCon, &pxRxBuffer) != ERR_OK)
{
vTaskDelay( webSHORT_DELAY );
}
if( pxRxBuffer != NULL )
{
/* Where is the data? */
netbuf_data( pxRxBuffer, ( void * ) &pcRxString, &usLength );
if(( NULL != pcRxString )
&& ( !strncmp( pcRxString, "GET", 3 ) ))
{
/*********************************
Generate HTML page
*********************************/
/* Write out the dynamically generated page. */
netconn_write( pxNetCon, cDynamicPage, (u16_t) strlen( cDynamicPage ), NETCONN_COPY );
}
netbuf_delete( pxRxBuffer );
}
netconn_close( pxNetCon );
netconn_delete( pxNetCon );
}
Я изменил следующие настройки:
#ifndef LWIP_TCP_KEEPALIVE
#define LWIP_TCP_KEEPALIVE 1
#endif
#ifndef TCP_KEEPIDLE_DEFAULT
#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */
#endif
#ifndef TCP_KEEPINTVL_DEFAULT
#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */
#endif
#ifndef TCP_KEEPCNT_DEFAULT
#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */
#endif
Есть ли другие вещи, которые я должен сделать в своем коде? Если я попытался это сделать, сервер завершит соединение после передачи HTML-страницы. Я пытался удалить netconn_close( pxNetCon); и / или netconn_delete( pxNetCon);, но это не даст правильного решения. Соединение останется открытым, но я не могу подключиться снова.
Так есть ли другие настройки, которые я не использовал? Или в коде нужны модификации?
1 ответ
LWIP_TCP_KEEPALIVE контролирует компиляцию в поддержку keepalive TCP, и по умолчанию каждое соединение отключает keepalive.
Вышеупомянутое приложение использует API-интерфейс netconn для управления своим соединением, и нет API-интерфейса netconn для включения опции SO_KEEPALIVE. Для этого вам необходимо использовать BSD-подобный API сокетов LwIP и вызову setsockopt():
int optval = 1;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
Как включить Keep-Alive при Raw API
- в lwipopts.h
#define LWIP_TCP_KEEPALIVE 1 // enable "kepp-alive"
#define TCP_KEEPIDLE_DEFAULT 1000 // keep_idle : dont' send keep-alive until keep_idle after connecting
#define TCP_KEEPCNT_DEFAULT 9U // keep_cnt : increase when no response after sending keep-alive every keep_intvl
- при вызове tcp_connect(pcb, ...)
pcb->keep_intvl = 1000; // send "keep-alive" every 1000ms
- в цикле()...
if(pcb_client->keep_cnt==pcb_client->keep_cnt_sent)
{
tcp_client_connection_close(pcb_client, client_s);
}
эти настройки делают тайм-аут 10 секунд после отключения сервера