Möglicherweise haben Sie viele C-Funktionen, viele POSIX-C-Bibliotheksfunktionen und UNIX-basierte C-Funktionen in Ihren Programmen ausprobiert. Die meisten C -Funktionen, die sich auf POSIX oder Netzwerke beziehen. Haben Sie jemals versucht, beim Programmieren einige integrierte Flags zu lernen?? Wenn nicht, ist es völlig in Ordnung.
Wir werden die Verwendung der SO_Reuseaddr -Flag von C in diesem Artikel diskutieren. Es handelt sich um ein ganzzahliges Boolean -Typ -Flag, das angibt. Dies bedeutet, dass eine Steckdose für die AF_Inet -Sockets binden kann, da eine aktive Hörstecke, die an die Adresse angeschlossen ist. Es ist nicht machbar, an den angegebenen Port eines Hörbuchs zu binden, wenn er für eine lokale Adresse auf Inaddr_any konfiguriert ist.
Die BIND -Methode kann die lokale Adresse nach Verwendung des SO_Reuseaddr -Flags wiederverwenden. Beachten Sie, dass die lokale Adresse, die aus IP -Adresse und Portnummer besteht. Die lokale Adresse kann mit diesem Parameter nicht verwendet werden, wenn sie bereits von einem Socket in einem Zustand zugegriffen wurde. Wenn sich die lokale Adresse des Socket im Hörstatus befindet und die IP -Komponente der Adresse in Anygemeld ist, werden alle lokalen IPs überwacht. Die Bindung kann auch mit diesem Argument keine lokalen Adressen für diesen Port mehr aufrechterhalten.
Beispiel:
Hier ist der Clientcode, der für die Clients verwendet wird, um mit den beiden separaten IP -Adressen eine Verbindung zum Server herzustellen. Der Client im folgenden Beispiel möchte eine Verbindung zu dem Server herstellen, der eine andere Portnummer verwendet, aber dieselbe IP -Adresse. Die lokale Host -IP -Adresse und der Portwert wurden im ersten Anruf an die Funktion connect_tcp übergeben, bei der sie auf 8888 eingestellt wurden.
Nach der Bindung an die lokale Adresse verwendete das System jedoch die UNIX -Socket -Domäne, um eine zweite Socket -Verbindung durchzuführen, bei der die IP -Adresse gleich blieb, die Portnummer jedoch in 7777 geändert wurde. Dies bedeutet, dass ein Client mit zwei verschiedenen Sockeladressen für eine einzelne TCP -Anforderung verbunden ist, was denkbar ist, da die Adressen unterschiedlich sind. Dieser Code verlinkt nach der Bindung der lokalen Adresse zuerst zu dem Zielgerät. Die beiden Bindungsversuche sollten erfolgreich sein, da der IP -Teil der lokalen Adressen der beiden Bindungsverbindungen, wie die oben genannten zeigen.
Kompilieren Sie den Code mit dem GCC -Compiler für den C -Sprachcode mit einem Linux -Befehlszeilenterminal:
Mit dem Befehl nCAT imitieren wir den Server:
Verwenden Sie den SS -Befehl SS, um jeden Socket -Status für die Portnummer 7777 anzuzeigen:
Die folgende Ausgabe zeigt den Socket -Status für die Portnummer 7777 an:
Wie aus dem pevious Screenshot zu sehen ist, gibt es jetzt keine andere Verbindung und nur der NCAT -Server hört auf Port 7777 zu. Führen Sie sie nach der Ausführung der Ausgabedatei aus, die im Kompilierungsschritt erstellt wurde.
Führen Sie nun denselben Befehl aus, nachdem die Ausgabedatei des vorherigen Code im Linux -Terminal ausgeführt wurde. Beachten Sie, dass es zwei Anrufe zur Verbindung von Connect_tcp gibt, dann werden während dieser Anrufe vier Verbindungen hergestellt.
Jetzt, da zwei Verbindungen erfolgreich hergestellt werden, einer mit 127.0.0.1 und Port 7777 und der andere mit Port 8888, wir erhielten die folgende Ausgabe. Auf dem folgenden Bildschirm befinden sich insgesamt vier Verbindungen, da wir zweimal die TCP -Methode Connect aufgerufen haben:
Es gibt vier Sichtverbindungen für ESTAB (etablierte) Zustandsanschlüsse, was normal ist, da die Ausgabe von der Serverseite bzw. der Client -Seite stammt. Die ersten drei Zeilen stammen aus der Perspektive des Servers, während die folgenden zwei aus der des Clients dargestellt werden. Der Prozessname im Hintergrund zeigt dies auch. Vor dem Beitritt kann der Client viele lokale IP -Adressen verbinden, und der Server kann dasselbe tun, indem ein Ziel verwendet wird. Es kann an eine Vielzahl lokaler Adressen binden, bevor Sie ohne das Argument so_Reuseaddr -Argument überwachen. Wir werden es jetzt nicht veranschaulichen, da der Softwarecode ähnlich ist. Der Code bindet zuerst die lokale Adresse an die Zieladresse, die entweder 127 ist.0.0.1: 7777 oder 127.0.0.1: 7778, und führen Sie dann eine Verbindung zu diesen IP -Adressen durch.
Wenn wir diesen Client ausführen, wird auf dem Bildschirm angezeigt. Die "bereits verwendete Adresse" zeigt an, dass der erste Client diese Adresse hat. Der vorherige Code wird nun geändert, indem nur noch einige weitere Zeilen des Code hinzugefügt werden. Wir möchten unseren Kunden mit einer ähnlichen Socket -Adresse verbinden, die bereits von einem anderen Kunden verwendet oder gehalten wird. Hier ist der Code -Ausschnitt des geänderten Code:
Wir haben den VIM -Editor verwendet, um die Datei zu öffnen und den Code im Einfügenmodus hinzugefügt zu haben.
Kompilieren Sie den Code neu. Bevor Sie jedoch Folgendes beachten: Erstellen Sie entweder eine neue Datei oder verwenden Sie eine vorhandene und ändern Sie den Namen der Ausgabedatei beim Kompilieren. Führen Sie nach der Kompilierung die Ausgabedatei mit der Befehlszeilenklemme aus. Nach der Ausführung können wir feststellen, dass ein Client mit derselben IP- und Portnummer verbunden ist, in der unser erster Client verbunden war. Dies liegt daran.
Abschluss
Hier geht es um die Verwendung des So_Reuseaddr -Socket -Parameters. Wir haben ein Beispiel gesehen, das den Parameter SO_ReuseadDR -Socket verwendet hat, um anzugeben.