Frage Fehler beim Akzeptieren: Ressource vorübergehend nicht verfügbar


Ich versuche, Single-Thread-Server in Linux (red-Hut) in C zu erstellen, die auf mehrere Sockets hören.

Ich muss nicht blockierende Sockets verwenden, wenn ich die Flags wie folgt auf nicht blockierend setze:

int flagss = fcntl(socketfds[j],F_GETFL,0); 
flagss |= O_NONBLOCK;
fcntl(socketfds[j],F_SETFL,flagss);

Ich bekomme:

ERROR on accept: Resource temporarily unavailable

Sonst funktioniert alles perfekt.


6
2017-10-03 13:11


Ursprung


Antworten:


Ressource vorübergehend nicht verfügbar ist EAGAIN und das ist nicht wirklich ein Fehler. Es bedeutet: "Ich habe im Moment keine Antwort für dich und du hast mir gesagt, dass ich nicht warten soll, also komme ich ohne Antwort zurück."

Wenn Sie einen hörenden Socket auf nicht blockierend einstellen, wie Sie es scheinen, accept soll errno auf diesen Wert setzen, wenn keine Clients versuchen, eine Verbindung herzustellen. Sie können auf eine eingehende Verbindung warten, indem Sie die Taste drücken select (traditionell) oder poll (semantisch äquivalente, neuere Schnittstelle, bevorzugt, es sei denn, Sie müssen auf einem alten Unix ohne es laufen) oder epoll (optimiert für Tausende von Deskriptoren, Linux-spezifische) Systemaufrufe.

Natürlich wirst du verwenden poll (oder eine der Alternativen), um auf Daten auf dem abhörenden Socket oder einem der Datensockets zu warten.


13
2017-10-03 13:18