Erste nicht verwendete Portnummer in C dynamisch beim ausführen von server-Prozess
Bin ich mit C schreiben und client-server-Programm, und ich möchte, um eine nicht verwendete port-Nummer, um mein server-Prozess. Mein server-code ist wie folgt:
getaddrinfo()
socket()
bind()
listen
while(1)
accept()
Ich muss die nicht verwendete port-Adresse", um die bind () - Aufruf. Aber ich möchte nicht, übergeben Sie die port-Nummer über die Kommandozeile beim starten des server-Prozesses. Die port-Nummer sollte man über eine socket-Aufruf, und muss ich verwenden, um meine client-Prozess. Gibt es eine socket-Aufruf, die würde mir helfen, einen nicht verwendeten port dynamisch in C ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur bind() Ihre socket-Einstellung sin_port 0 in sockaddr_in. System wird automatisch wählen Sie nicht verwendeten port. Sie können es abrufen, durch aufrufen von getsockname().
Aber ich habe keine Ahnung, wie es passieren client, außer zu drucken und die Verwendung als Kommandozeilen-parameter für client-Programm.
- Das wäre ein großer race-Bedingung. Stellen Sie sich diese Abfolge von Ereignissen:
getNextFreePort()
nennen.bind()
, was nicht mit "Adresse".Dies ist der Grund, warum Servern neigen dazu, "bekannte" Adressen, denn das ist erforderlich, um für einen Kunden, zu wissen, wo es sich verbinden soll.
Auch, es sei denn, ich bin misunderstadning, Sie scheinen zu erwarten, dass der client in der Lage sein zu rufen
getNextFreePort()
beim Start, und dann auf Magische Weise bekommen Sie die port-Nummer server hat bereits bekommen, und verwendet? Das macht nicht viel Sinn, also hoffentlich bin ich Missverständnis Sie.Da bist du auf Linux/Unix, das ist genau die situation, dass der RPC-portmapper wurde entwickelt, um zu lösen. Ihre server
bind()
s an einen freien port (port 0), dann registriert die daraus resultierenden tatsächlichen Anschluss (geholt mitgetsockname()
mit den portmapper von Anwendung/Dienst-name.Clients Fragen dann den portmapper auf Ihrem bekannten Hafen, zu bitten, was Anschluss, named-Dienst tatsächlich ausgeführt wird.
portmapper RPC ist nicht so populär wie Sie verwendet werden, um
, Wenn Server und clients sind auf dem gleichen Feld:
Eine andere alternative ist eine Art der Namensgebung für eine freigegebene Datei (temporäre Datei /tmp/servport.xxxxx), und ersetzen xxxxx mit dem port.
Oder Sie können erstellen, ein shared memory segment, dass der server lagern seine-port. Kunden legen, um den gleichen shared memory, Lesen Sie den Anschluss, und schließen Sie normal.
Oder der server eine unix-domain-socket an eine bekannte/shared path, und clients können eine Verbindung zu diesem, zu Fragen, für welchen port sich der server auf. (natürlich können Sie einfach alle IPC-auf diese Weise, wenn Sie sind beide lokal!)
Viele Optionen mit IPC...
Wenn Sie bind() an eine zufällige und unvorhersehbare-Adresse+Portnummer, die Kunden können einige Schwierigkeiten finden, Ihre server und die Verbindung zu es.