Öffne den TCP-Port in Python
Möchte ich, um eine zufällige TCP-port auf localhost in Python. Was ist der einfachste Weg?
Kommentar zu dem Problem
Dies ist, wie Hunde jagen Autos - was werden Sie tun, wenn Sie einen bekommen?
Ich brauche einen TCP-port-Nummer für eine andere Konsole-Anwendung, die braucht einen port als parameter, wo es hört auf.
Es ist eine offensichtliche (wenn auch kleinere) race-condition mit dem Ansatz, den Sie erwägen. Der port durchgeführt werden konnte, durch die Zeit, die Sie übergeben es der andere Prozess. Besitzen Sie den anderen Prozess code? Wenn dem so ist, könnte es besser sein, um es zu erwerben, einen zufälligen port und melden Sie es zurück zu dem ersten Prozess.
Ja genau, das ist es, was ich meine mit "nicht 100% korrekt". Aber es wird immer diese kurze Zeitspanne zwischen bekomme ich den port und den Anruf des anderen Prozesses. (Und ich glaube nicht, dass code.)
InformationsquelleAutor der Frage Albert | 2010-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine aktuelle Lösung:
Nicht sehr schön und auch nicht 100% korrekt, aber es funktioniert für jetzt.
InformationsquelleAutor der Antwort Albert
Den freien port gefunden werden kann, durch das binden des socket an einen port ausgewählt, der durch das Betriebssystem. Danach wählt das Betriebssystem einen port, den der socket kann entsorgt werden. Jedoch, diese Lösung ist nicht gegen race-conditions - in der kurzen Zeit zwischen der freie port-Nummer, und mit dieser anderen port verarbeiten kann verwenden Sie diesen Anschluss.
InformationsquelleAutor der Antwort Paweł Bylica
Ich eigentlich verwenden Sie die folgenden in einem meiner Programme:
Natürlich, das ist sogar anfälliger für Kollisionen, als der code, den Sie haben. Aber ich habe noch nie ein problem mit ihm hatte. Der Punkt ist, zu einem bestimmten Zeitpunkt, die meisten dieser high-ports sind nicht in Benutzung und wenn Sie nur ein pick zufällig, dass ein Konflikt mit einem anderen Prozess ist ziemlich unwahrscheinlich. Wenn Sie etwas tun, wie die Lösung, die Sie geschrieben in Ihrer Antwort (öffnen einer socket und packte seine port-Nummer), ist es fast sicher, dass der port nicht zu Konflikten. Also, wenn dies etwas, das Sie nur für sich selbst (als Gegensatz zu etwas, was Sie herausbringen, um der öffentlichkeit), überlegen Sie, ob es lohnt sich zu kommen mit einem wirklich die ultimative Lösung. Chancen sind, es wird nie einen Unterschied machen.
Motiviert durch Marcelo Cantos' Kommentar auf deine Frage, will ich hinzufügen, dass die standard-Lösung in Fällen wie diesem ist der Vorgang, über den der port zu binden und dann teilen Sie diese Informationen mit anderen Programmen, die es braucht. In der Regel, es werde etwas tun, wie das schreiben einer temporären Datei mit der port-Nummer, die einige standard-Speicherort im Dateisystem. Da der Prozess, mit dem Sie arbeiten nicht tun, die in gewissem Sinne unabhängig von Lösung, die Sie kommen mit ein bisschen ein hack. Aber noch einmal, wenn es nur für Ihren eigenen Gebrauch, ist das wohl in Ordnung.
InformationsquelleAutor der Antwort David Z
Dies ist meine version, aber es ist nicht wirklich zufällig, wenn Sie geben Sie einen port-Bereich. Diese leiden auch unter race-Bedingungen, aber dies ist der beste Weg, ich weiß, wenn Sie brauchen, um kennen den Hafen vor der Zeit.
InformationsquelleAutor der Antwort Dave Butler
Den kurzlebigen ports grundsätzlich liegen im Bereich 49152 - 65535.
wenn Sie möchten, um zu überprüfen, ports im größeren Bereich dann ändern Sie einfach die Werte in randint.
InformationsquelleAutor der Antwort Chinmaym