2017-12-29 44 views
-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); 
+0

私のプログラムが正常に動作していれば、デバッグのプリントは以下のようになります。 – kishan

+1

'select()'は渡すパラメータを変更します。各ループ反復で 'readfds'と' tv'をリセットする必要があります。また、 'recv_buf'を使う前にエラーの' read() 'の戻り値をチェックしていません。 –

答えて

0

あなたは()選択の内側にあなたのプログラムのブロックを持っているつもりなら、その後、今までそれが(読み取り内のブロック持ってする理由は)ありません。それで、setting your socket(s) to non-blocking modeによってブロックされたread()の可能性を避けることができます。

これは、(RemyLebeauのコメントで示唆されているように)select()の使用方法を修正することで、必要な動作を得ることができます。

関連する問題