-1
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);
私のプログラムが正常に動作していれば、デバッグのプリントは以下のようになります。 – kishan
'select()'は渡すパラメータを変更します。各ループ反復で 'readfds'と' tv'をリセットする必要があります。また、 'recv_buf'を使う前にエラーの' read() 'の戻り値をチェックしていません。 –