如何使用select函数来取消阻塞读取功能

时间:2017-12-29 11:41:31

标签: sockets select

我正在使用read()函数从套接字读取数据。但有时它会阻塞,程序会挂起。

所以,我使用select()函数来超时。但我仍有一些问题。

那么,请告诉我,我应该如何使用这两种功能?

我的代码如下:

do{
    rv = select(n, &readfds, NULL, NULL, &tv);

    #ifdef WIFI_DEBUG_PRINT
    ESP_LOGI(Display, "\nselect returns= %d\n",rv);
    #endif

    if (rv > 0) 
    {
        if (FD_ISSET(s, &readfds)) 
        {
            bzero(recv_buf, sizeof(recv_buf));

            read(s, recv_buf, sizeof(recv_buf)-1);

            strcat(response_buffer,recv_buf);

            printf("\nrecv_buf= %s\n",recv_buf);
        }
    }

    _delay_ms_kt(100);  //https://esp32.com/viewtopic.php?f=2&t=809&p=10191&hilit=esp_task_wdt_feed#p10191
                        //see above link to understand reason to put delay here.
                        //https://github.com/espressif/arduino-esp32/issues/595
                        //same.....
}while(rv>0);

1 个答案:

答案 0 :(得分:0)

如果您要将程序块放在select()中,那么没有理由让它在read()中阻塞。鉴于此,您可以避免由setting your socket(s) to non-blocking mode阻止read()的任何机会。

那么,加上修复你对select()的使用(正如RemyLebeau在评论中所建议的那样)可以让你得到你想要的行为。