Ich bemerkte etwas seltsam bei der Arbeit mit einem einfachen C-basierten Server Programm auf meinem Linux (4.10.3) -System. Ich habe versehentlich am Telefon listen()
zweimal auf einem Socket (aus dem Server-Prozess) genannt bind()
auf früher aufgerufen. Mir ist aufgefallen, dass die beiden Listen ohne Fehler abgehört haben. In der Tat scheint es egal zu sein, wie viele Anrufe zu hören ich mache, alle Anrufe zu hören, gelingen.hören angerufen Socket mehr als einmal - erwartetes Verhalten?
Ich erwartete alle Anrufe zu hören, nachdem die erste fehlgeschlagen mit EADDRINUSE
. Fehle ich etwas? Linux/POSIX man pages nicht scheinen dazu etwas zu sagen. Ich habe einen Hinweis über dieses Verhalten auf der folgenden Web-Seite finden:
https://www.mkssoftware.com/docs/man3/listen.3.asp
Eine Anwendung kann mithören() mehr als einmal auf dem gleichen Sockel. Dadurch wird der aktuelle Rückstand für den abhörenden Socket aktualisiert. Sollten mehr Verbindungen als der neue Backlog-Wert vorhanden sein, werden die überschüssigen ausstehenden Verbindungen zurückgesetzt und gelöscht.
Es ist mir unklar, ob dies auch für Linux gilt. Und so ist meine Frage: was passiert, wenn auf dieselbe Buchse mehr als einmal von der gleiche Prozess aufgerufen wird? (Anscheinend gibt es keine sichtbaren Nebenwirkungen im Benutzerraum, aber tut der Linuxkernel etwas spezielles im Kernraum?)
Thanks.
Die [POSIX-Spezifikation für 'hören'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html), wie ich es lese, gibt das Verhalten für diesen Fall nicht an, was bedeutet Portabler Code sollte dies vermeiden. – zwol
Ich würde EADDRINUSE nicht erwarten. Das würde beim vorhergehenden 'bind()' Schritt passieren. Vielleicht EINVAL. – EJP
@zwol: Sie haben Recht, ein tragbares Programm sollte es vermeiden. Ich war nur neugierig, was der Linux-Kernel macht. – userRG