Der richtige Umgang mit EWOULDBLOCK mit Polling auf einem nicht blockierenden Socket

StackOverflow https://stackoverflow.com/questions/3673828

  •  01-10-2019
  •  | 
  •  

Frage

Ich habe nun schon seit einiger Zeit auf einem Polling-TCP-Daemon arbeitet. Vor kurzem habe ich gelesen, dass nicht-blockierende Sockets manchmal ein EWOULDBLOCK Fehler während eines Sende werfen kann () oder recv (). Mein Verständnis ist, dass, wenn recv () löst eine EWOULDBLOCK, diese (in der Regel) ein Mittel, dass es nichts zu empfangen. Aber was ich bin unklar, unter welchen Umständen send () würde einen EWOULDBLOCK werfen, und was wäre die richtige Verfahren für den Umgang mit einer solchen Veranstaltung?

Wenn send () eine EWOULDBLOCK wirft, sollte der Dämon einfach von diesem Ereignis weitergehen, auf die nächste? Mit Hilfe eine Abfrageschnittstelle wie epoll, wird ein neues Ereignis ausgelöst werden, wenn der Deskriptor zum Schreiben bereit ist?

War es hilfreich?

Lösung

, was ich bin unklar, ist, unter welchen Umstände send () würde ein Wurf EWOULDBLOCK

Wenn der Sendepuffer (typischerweise durch das O gehalten, aber wie auch immer, irgendwo in dem TCP / IP-Stack) voll ist und das Gegenstück hat keines des Bits gesendet, um es aus dem Puffer noch (so die anerkannt Stapel muss alles im Puffer für den Fall aufzubewahren eine resend ist erforderlich).

, was richtiges Verfahren wäre für eine solche Ereignisbehandlung?

In der einen oder anderen Sie, bis das Gegenstück warten müssen hat acknowledge einige der Pakete an ihn gesendet, wodurch die TCP / IP-Stack und so für mehr um Platz zu schaffen „Senden“. Sowohl klassische select und modernere epoll (und in anderen Betriebssystemen, kqueue & c) bieten intelligente Möglichkeiten, um solche Warte auszuführen (ob Sie warten etwas, etwas schreiben zu lesen, oder „je nachdem, was der beiden geschieht zuerst“). Yep, beobachtete-Deskriptoren immer bereit (sei es zum Lesen oder zum Schreiben) ist die typischer Grund für epoll Ereignisse!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top