2017-12-29 23 views
-1

Ich benutze die read() Funktion, um Daten von einem Socket zu lesen. Aber manchmal wird es blockieren und das Programm wird hängen.Wie kann man die Funktion zum Entsperren der Lesefunktion verwenden?

Also habe ich die select() Funktion verwendet, um eine Zeitüberschreitung zu machen. Aber ich habe immer noch ein Problem.

Also, bitte sag mir, wie soll ich beide Funktionen nutzen?

Mein Code ist wie folgt:

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

Wenn mein Programm ordnungsgemäß funktioniert, ist Debug-Druck wie folgt: – kishan

+1

'select()' ändert die Parameter, die Sie übergeben. Sie müssen 'readfds' und' tv' für jede Schleifeniteration zurücksetzen. Außerdem prüfen Sie den Rückgabewert von 'read()' nicht auf Fehler, bevor Sie 'recv_buf' verwenden. –

Antwort

0

Wenn Sie Ihren Programmblock innerhalb wählen haben werden(), dann gibt es keinen Grund, jemals sie haben innen Lese-Block(). In Anbetracht dessen können Sie jede Möglichkeit vermeiden, dass read() jemals blockiert, indem Sie setting your socket(s) to non-blocking mode.

Das plus die Verwendung von select() zu fixieren (wie von RemyLebeau in seinem Kommentar vorgeschlagen) sollte Ihnen das gewünschte Verhalten bringen.

Verwandte Themen