lwip stack netconn api сохранить соединение

В настоящее время я работаю со стеком lwip для реализации сервера Modbus, но функция «поддержки активности» не работает. Может ли кто-нибудь взглянуть на мою проблему?

код:

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); , но это не даст правильного решения. Соединение останется открытым, но я не могу подключиться снова.

Так есть ли другие настройки, которые я не использовал? Или нужны изменения в коде?


person Conara    schedule 07.04.2015    source источник
comment
Под поддержанием активности вы подразумеваете постоянные соединения HTTP?   -  person Joel Cunningham    schedule 11.04.2015
comment
Привет. Нет, я имею в виду функцию поддержания активности протокола TCP. Примером является протокол http, но я пытаюсь реализовать сервер Modbus с функциональностью поддержания активности.   -  person Conara    schedule 11.04.2015


Ответы (2)


LWIP_TCP_KEEPALIVE управляет компиляцией для поддержки поддержки активности TCP, и по умолчанию каждое соединение отключает поддержку активности.

Вышеприведенное приложение использует API-интерфейс netconn для управления своим соединением, и нет API-интерфейса netconn для включения параметра SO_KEEPALIVE. Чтобы сделать это, вам нужно будет использовать API сокетов LwIP, подобный BSD, и вызов setsockopt():

int optval = 1; setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));

person Joel Cunningham    schedule 11.04.2015
comment
Привет, спасибо за ваш ответ! Это многое объясняет! В этом случае я собираюсь использовать BSD-подобный API сокетов! Большое спасибо! - person Conara; 11.04.2015
comment
Привет, я думал об этом, и у меня есть один вопрос. API сокетов BSD построен поверх API Netconn, так как же возможно, что сокет BSD имеет эту функцию, а API Netconn — нет. использовать для этого необработанный API? - person Conara; 14.04.2015
comment
Есть некоторые операции, которые выполняет API сокетов, которые работают непосредственно с печатной платой (блоком управления протоколом), который находится на уровне ниже, чем netconn. Если вы посмотрите на sockets.c около строки 2080 мы видим, что SO_KEEPALIVE в конечном итоге вызывает ip_set_option(), чтобы включить опцию поддержания активности - person Joel Cunningham; 15.04.2015

Как включить Keep-Alive когда Raw API

  1. в 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
  1. при вызове tcp_connect(pcb,...)
pcb->keep_intvl = 1000; // send "keep-alive" every 1000ms
  1. в цикле()...
if(pcb_client->keep_cnt==pcb_client->keep_cnt_sent)
{
    tcp_client_connection_close(pcb_client, client_s);
}

эти настройки делают таймаут 10 секунд после отключения сервера

person user13755530    schedule 16.06.2020