Ich schreibe einen einfachen Webserver. Ich möchte den Benutzer den Port den Server hören lassen, , aber wie kann ich wissen, ob der Port die Benutzereingabe bereits verwendet wird oder nicht (wenn ich weiß, dass es bereits verwendet wird, kann ich ihnen sagen, um zu geben ein anderer.)Wie erkennt man, ob unter Linux bereits ein Port in C verwendet wird?
Antwort
Versuchen Sie einfach, bind
an den Port und wenn es fehlschlägt, überprüfen Sie EADDRINUSE
in errno
. Dies ist der einzige Weg, denn um korrekt zu sein, muss eine solche Überprüfung atomar sein. Wenn Sie eine separate Überprüfung durchgeführt haben und dann versucht haben, an den Port zu binden, nachdem Sie festgestellt haben, dass er nicht verwendet wurde, konnte ein anderer Prozess in der Zwischenzeit an den Port gebunden werden, was wiederum dazu führte, dass er fehlschlug. Wenn Sie eine separate Überprüfung durchgeführt und festgestellt haben, dass der Port bereits verwendet wird, konnte der Prozess, der ihn verwendete, den Port schließen, beenden oder in der Zwischenzeit abstürzen, wodurch das Ergebnis erneut falsch angezeigt wurde.
Der Punkt, der all dies (der Grund schrieb ich eine lange Antwort eher als eine kurze Antwort) ist, dass die korrekte und robuste Möglichkeit zu überprüfen, „Kann ich so und so?“ ist fast immer zu versuchen, es zu tun und auf Fehler zu überprüfen. Jede andere Herangehensweise kann zu Rennbedingungen führen, und in vielen Fällen sind die Race Conditions (obwohl wahrscheinlich nicht Ihre) Sicherheitsschwachstellen.
bind()
fehl:
Bei Erfolg Null zurückgeführt wird. Bei einem Fehler wird -1 zurückgegeben und errno wird entsprechend gesetzt.
EADDRINUSE Die angegebene Adresse ist bereits im Einsatz.
Ein anderer Ansatz: Versuchen Sie, eine Verbindung zu diesem Port unter localhost
herzustellen.
Fügen Sie einige der Gründe, dass es eine schlechte Idee ist und Möglichkeiten, dass dieser Test fehlschlagen könnte, und Ihre Antwort könnte sich lohnen ... –
a) der laufende Server kann eine bestimmte Schnittstelle hören, und die Verbindung zu 'localhost' wird es nicht überprüfen ; b) Zeitüberschreitungen; c) Ich habe diese Methode verwendet, um den Port zu überprüfen, um einen TCP-Server als separaten Prozess zu starten (es gab keine korrekten Fehlercodes bei Fehlern zurück, so dass dies der einzige Weg war, dies zu überprüfen). – khachik
Übrigens, (a) ist ein Problem, selbst wenn Sie atomar testen, indem Sie den Port binden. Selbst wenn es Ihnen gelingt, eine Verbindung in 0.0.0.0: port herzustellen, hat möglicherweise ein anderer Prozess aaa.bbb.ccc.ddd: port (die IP der externen Netzwerkadresse) bereits gebunden. –
Wenn bind() einen Fehler anzeigt
Erstellen Sie einfach einen Socket und rufen Sie bind() auf. Wenn bind() Erfolg, dann weiter zu listen(), andernfalls sollten Sie einige Fehlerbehandlungsprozedur durchführen, wie zum Beispiel zu einem Standard-Port wechseln, Fehlermeldung ausgeben und auf Benutzerinteraktion warten oder zumindest loggen und beenden.
- 1. Bestimmen Sie, ob ein TCP/IP-Port bereits unter Windows verwendet wird.
- 2. Ermitteln, ob der Port verwendet wird?
- 3. Wie erkennt man, ob ein PHP-Skript bereits läuft?
- 4. Parse Server "Port wird bereits verwendet"
- 5. org.springframework.boot.context.embedded.PortInUseException: Port 80 wird bereits verwendet
- 6. Wie erkennt man, ob ein Plugin Scribd verwendet?
- 7. Wird C# unter Linux laufen
- 8. Wie erkennt man, ob ein Land Sommerzeit mit JavaScript verwendet?
- 9. Überprüfen, ob ein Port unter FreeBSD installiert ist
- 10. C#: Wie erkennt man, ob in Windows ein 'Benutzerkonto' existiert?
- 11. Wie erkennt man, ob actionmode bereits vorhanden ist
- 12. Wie erkennt man, wenn MKUserTrackingBarButtonItem verwendet wird
- 13. Wie erkennt man, dass die Pfeiltaste mit C unter Linux oder Solaris gedrückt wird?
- 14. Wie erkennt man, ob ein Feld geladen wird?
- 15. Wie erkennt man, ob ein HTML5-Eingabesteuerelement unterstützt wird?
- 16. Wie erkennt man, ob ein Bot zum Kontakt hinzugefügt wird?
- 17. Wie man ein PThread in c unter Linux
- 18. Wie überprüft man, ob ein Index in einem Vektor bereits verwendet wird?
- 19. Wie erkennt man externe js-Datei wird bereits mit jquery
- 20. Woher weiß ich, welche serielle Schnittstelle unter Linux verwendet wird?
- 21. Wie erkennt man, ob die URL eine Port-ID hat oder JS oder JQuery nicht verwendet?
- 22. Wie erstellt man einen virtuellen CAN-Port auf Linux? (C++)
- 23. Wie erkennt man, ob das Dropdown-Menü über oder unter dem Drehfeld in Android angezeigt wird?
- 24. Wie erkennt man, ob ein Thread oder Prozess wegen OS-Planung ausgehungert wird
- 25. Wie erkennt man Linux shutdown/reboot
- 26. Ermitteln, dass ein serieller Port existiert, Linux C/C++
- 27. Wie überprüft man, ob die Qt GUI-Anwendung bereits läuft (unter Linux)?
- 28. Wie man erkennt, ob ein Programm dynamischen Versand verwendet, indem man auf die Assembly schaut
- 29. Wie erkennt man, ob Boto SSLv3 oder TLS verwendet?
- 30. Wie erkennt man, ob ein Mocha-Test in node.js läuft?
Aber auf diese Weise muss ich einen Server-Socket erstellen ... bind() ... dann schließe es .. Gibt es einen einfacheren Weg? – wong2
Nein, das ist der einzig richtige Weg. Warum willst du es trotzdem schließen? Verwenden Sie es einfach zum Abhören, wenn Sie es bereits gebunden haben - Sie können nicht wissen, ob es später noch verfügbar ist, da ein anderer Prozess in der Zwischenzeit an diesen Port gebunden sein könnte. – ThiefMaster
@ wong2: Lesen Sie meine Antwort. Es gibt keine Möglichkeit, die Antwort auf Ihre Frage zu ermitteln ("Wird der Port bereits verwendet?"), Ohne dass es möglicherweise falsch ist, es sei denn, Sie binden den Port und halten ihn gebunden, bis Sie ihn verwenden können. Im Voraus zu überprüfen (und dann freizugeben) unterliegt falschen Antworten. –