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);
Wenn mein Programm ordnungsgemäß funktioniert, ist Debug-Druck wie folgt: – kishan
'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. –