27 Stimmen

Welche clientseitigen Situationen benötigen bind()?

Ich lerne die Socket-Programmierung in C. Wann würden Sie bind() auf der Client-Seite verwenden? Welche Arten von Programmen benötigen es und warum? Wo kann ich ein Beispiel finden?

0 Stimmen

Bitte schreiben Sie uns zuerst Ihre Gedanken dazu und wir werden versuchen, Sie zu beraten.

0 Stimmen

Ein Programm wie der Client sammelt Informationen/Nachrichten von einer anderen Maschine/Server/Domäne?

29voto

Graeme Perrow Punkte 53901

Auf der Client-Seite würden Sie bind nur verwenden, wenn Sie einen bestimmten Client-seitigen Port verwenden wollen, was selten der Fall ist. Normalerweise geben Sie auf dem Client die IP-Adresse und den Port des Server-Rechners an, und das Betriebssystem wählt aus, welchen Port Sie verwenden wollen. Normalerweise ist das egal, aber in manchen Fällen kann es sein, dass auf dem Client eine Firewall installiert ist, die nur ausgehende Verbindungen über einen bestimmten Port zulässt. In diesem Fall müssen Sie sich an einen bestimmten Port binden, bevor der Verbindungsversuch funktionieren kann.

0 Stimmen

Ich schlage vor, dass Sie s/socket number/port/ in Ihre Antwort schreiben.

5 Stimmen

In der Unix-Welt gibt es einige Protokolle, die von den Clients erwarten, dass sie sich über einen privilegierten Port verbinden. Damit soll sichergestellt werden, dass die Verbindung von einem privilegierten Prozess auf dem Client-Rechner kommt. Dies ist einer der wenigen echten Anwendungsfälle für bind() an einer geeigneten Steckdose, obwohl Ihr System möglicherweise über einen eigenen rresvport() Funktion dafür.

2 Stimmen

Um ein konkreteres Beispiel dafür zu geben, wovon @AlexandreJasmin spricht: Der NFS-Server (Netzwerk-Dateisystem), der mit dem Linux-Kernel ausgeliefert wird, verlangt, dass der Client einen privilegierten Port für die Kommunikation verwendet (obwohl dies auf der Serverseite konfigurierbar ist, aber standardmäßig werden nur Ports mit niedriger Nummer verlangt).

5voto

ninjalj Punkte 40810

Ein Beispiel wäre die Datenverbindung einer aktiven FTP-Verbindung. In diesem Fall verbindet sich der Server von seinem Port 20 mit der IP und dem Port, die durch einen PORT- oder EPRT-Befehl angegeben wurden.

0 Stimmen

@Alexandre Jasmin: Nein, lesen Sie es noch einmal, bei aktivem FTP agiert der FTP-Server als Client für den Datenkanal, bindet sich an Port 20 und verbindet sich mit einem Port des FTP-Clients.

5voto

caf Punkte 224189

Ein klassisches Beispiel für ein Client-Programm mit bind() ist die (veraltete) rlogin / rsh Familie von Netzwerk-Clients. Diese Clients waren für den Einsatz in Netzwerken mit starken Vertrauensbeziehungen gedacht - in einigen Fällen vertraut der Server-Rechner dem Client-Rechner, dass dieser ihm den Benutzernamen des Benutzers mitteilt, der sich verbindet. Dies erforderte, dass das Client-Programm eine Verbindung von einem niedrigen Port (einem Port kleiner als 1024) herstellt, da solche Ports auf den root und damit (theoretisch) beweisen, dass der verwendete Client vom Systemadministrator autorisiert ist.

Das NFS-Protokoll hat ähnliche Vertrauensbeziehungen, und auch der Klient stellt Verbindungen von einer niedrigen Portnummer aus her, indem er bind() .

Ein weiteres Beispiel sind IRC-Clients, die es dem Benutzer ermöglichen, eine bestimmte Quell-IP-Adresse anzugeben, von der aus die Verbindung hergestellt werden soll. Dies dient dazu, Benutzer mit vielen IP-Adressen, die ihrem Rechner zugewiesen sind, unterzubringen, wobei jeder ein anderer "Vanity"-Domänenname zugewiesen ist. Die Auswahl der IP-Adresse, von der aus die Verbindung hergestellt werden soll (mit bind() ) kann der Benutzer wählen, unter welchem Domänennamen er im IRC erscheint.

1voto

Iulian Rotaru Punkte 111

Eine gute Situation wäre in einem P2P-Fall, wenn Sie mit einem STUN-Server mit einem gebundenen Socket kommunizieren und der STUN-Server Ihnen den Port mitteilt, auf dem er Nachrichten von Ihrem Socket empfängt (der sich von dem unterscheiden kann, den Sie beim Binden Ihres Sockets angegeben haben, abhängig von Ihrem Netzwerk und insbesondere von Ihrem NAT-Typ). Dies ermöglicht es Dir, die tatsächliche Portübersetzung zu kennen, die Dein NAT durchführt, und Du kannst diese Information an potentielle Peers weitergeben, die sich mit Dir verbinden wollen. Das Binden des Sockets ist nützlich, da einige NATs Ihnen dynamisch Ports zuweisen (zweimaliges Binden an Port x ergibt möglicherweise nicht denselben "echten" Port). So können Sie den Socket, den Sie gebunden haben, direkt zum Abhören des Ports verwenden.

0voto

Michał Ziobro Punkte 9219

Ich nehme an, dass Sie bind() im Falle von UDP-Sockets verwenden sollten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X