Es kann Fälle geben, in denen ein Socket als bereit gemeldet wird, aber wenn Sie es überprüfen, ändert sich der Status.
Eines der guten Beispiele ist die Annahme von Verbindungen. Wenn eine neue Verbindung eintrifft, wird ein abhörender Socket als bereit zum Lesen gemeldet. Wenn Sie anrufen, um zu akzeptieren, kann die Verbindung von der anderen Seite geschlossen werden, bevor überhaupt etwas gesendet wird und bevor wir accept
anriefen. Natürlich ist die Handhabung dieses Falls vom Betriebssystem abhängig, aber es ist möglich, dass accept
einfach blockiert, bis eine neue Verbindung hergestellt wird, was dazu führt, dass unsere Anwendung auf unbestimmte Zeit wartet, was die Verarbeitung anderer Sockets verhindert. Wenn sich Ihr abhörender Socket in einem nicht blockierenden Modus befindet, wird dies nicht passieren und Sie werden oder einen anderen Fehler erhalten, aber accept
wird sowieso nicht blockieren.
Einige Kernel hatten (ich hoffe, es ist jetzt behoben) einen interessanten Fehler mit UDP und select
. Wenn ein Datagramm eintrifft, wacht select
mit dem Socket auf, wobei das Datagramm als bereit zum Lesen markiert ist. Die Datagramm-Prüfsummenvalidierung wird verschoben, bis ein Benutzercode recvfrom
(oder eine andere API, die UDP-Datagramme empfangen kann) aufruft. Wenn der Code recvfrom
aufruft und der Validierungscode eine Prüfsummenabweichung feststellt, wird ein Datagramm einfach gelöscht und recvfrom
wird bis zum Eintreffen eines nächsten Datagramms blockiert. Eines der Patches zur Behebung dieses Problems (zusammen mit der Problembeschreibung) finden Sie unter here.
Aha, danke dafür. :) – CaptainCodeman