我正在使用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);
答案 0 :(得分:0)
如果您要将程序块放在select()中,那么没有理由让它在read()中阻塞。鉴于此,您可以避免由setting your socket(s) to non-blocking mode阻止read()的任何机会。
那么,加上修复你对select()的使用(正如RemyLebeau在评论中所建议的那样)可以让你得到你想要的行为。