Normalerweise ist nur eine Verwendung jedes Sockels zulässig

763
baum

Wenn Sie versuchen, einen bereits verwendeten Port (z. B. zwei Instanzen desselben Socket-Servers) unter Windows zu überwachen, erhalten Sie Folgendes:

[WinError 10048] Normalerweise ist nur eine Verwendung jeder Socket-Adresse (Protokoll / Netzwerkadresse / Port) zulässig

Ich bin verwirrt, warum normalerweise nur eine Verwendung jeder Adresse zulässig ist. Ich hatte den Eindruck, dass dies eine absolute Regel war (zumindest bei Unix), aber anscheinend nicht. In welchen Fällen (und wie) könnten zwei Programme dieselbe Socket-Adresse verwenden? Oder interpretiere ich diesen Fehler falsch?

3
Ich bin verwirrt, warum Sie denken, dass die Fehlermeldung so genau ist. EBGreen vor 5 Jahren 1
Ja, ich denke, unangemessener Optimismus in Microsoft baum vor 5 Jahren 0

1 Antwort auf die Frage

3
Austin Hemmelgarn

Es ist keine absolute Regel auf allen UNIX-Systemen. Einige haben Erweiterungen, mit denen mehrere Prozesse an dieselbe Adress- und Portkombination gebunden werden können. Der Kernel übernimmt dann die Verteilung eingehender Verbindungen an die mehreren Listener. Dies hat den Vorteil, dass Ihre Anwendung kein Multiplexing der Verbindungen selbst durchführen muss, sondern sich stattdessen um die Handhabung von Verbindungen kümmern muss, was Ihnen einen schnellen und sehr einfach zu implementierenden Mechanismus zur Verfügung stellt, um Parallelität im Netzwerkcode zu ermöglichen.

Unter Linux wird die Socket-Option dafür genannt SO_REUSEPORT, und viele weit verbreitete Hochleistungs-Serversoftware (einschließlich Apache HTTPD und Nginx) unterstützt die Verwendung dieser Option.

Windows verwendet, da es einen weitgehend direkten Klon des 4.4BSD-Netzwerkcodes verwendet, das gleiche Konzept der Socket-Optionen und verfügt über eigene Optionen, um dies zu steuern. Gemäß dieser StackOverflow-Antwort wird die dort fragliche Option aufgerufen SO_REUSEADDR, und es wird eine entsprechende 'Anti-Option' aufgerufen SO_EXCLUSIVEADDRUSE.

Es ist erwähnenswert, dass nichts daran hindert, dass mehrere verschiedene Programme diese Option verwenden und an denselben Port binden. Dies kann beim Debuggen von Netzwerkproblemen zu Kopfschmerzen führen und ist auch ein wichtiger Sicherheitsaspekt.