Does lwip socket in RTOS supports select()?

baoshi
Posts: 23
Joined: Tue Dec 02, 2014 8:35 pm

Does lwip socket in RTOS supports select()?

Postby baoshi » Tue Jun 30, 2015 12:00 am

Hi,

I created the following code to test the socket API in esp_iot_rtos_sdk.

Code: Select all

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    tv.tv_sec = 0;
    tv.tv_usec = timeout_ms * 1000;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}


The socket was created using

Code: Select all

 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)


It seems that the timeout feature of select() is not functional. select() always returns in ~46us when no data is available to read.

Is there anything I did wrongly or it is not supported in the SDK?

Thanks

Baoshi

baoshi
Posts: 23
Joined: Tue Dec 02, 2014 8:35 pm

Re: Does lwip socket in RTOS supports select()?

Postby baoshi » Tue Jun 30, 2015 12:17 am

I got it.
It seems tv_sec is internally counted by FreeRTOS tick. I did the following trick and the timeout works.

Code: Select all

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    // It seems esp_iot_rtos_sdk interprets timeout by FreeRTOS ticks.
    tv.tv_sec = timeout_ms / portTICK_RATE_MS;
    tv.tv_usec = 0;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}

tobewinner
Posts: 45
Joined: Tue Jan 19, 2016 2:39 pm

Re: Does lwip socket in RTOS supports select()?

Postby tobewinner » Wed Jun 22, 2016 2:56 pm

baoshi wrote:I got it.
It seems tv_sec is internally counted by FreeRTOS tick. I did the following trick and the timeout works.

Code: Select all

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    // It seems esp_iot_rtos_sdk interprets timeout by FreeRTOS ticks.
    tv.tv_sec = timeout_ms / portTICK_RATE_MS;
    tv.tv_usec = 0;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}

in RTOS_SDK 1.3 the tv_sec seems to be tick.
in RTOS_SDK 1.4 the tv_sec seems to be the real seconds (CPU running at 80MHZ, and half seconds with CPU running at 160MHZ)

Who is online

Users browsing this forum: No registered users and 17 guests