Wiederherstellen von zmq.error.ZMQError: Adresse wird bereits verwendet

8

Ich habe Strg-C gedrückt, während ich eine PAIR -Muster-Verbindung (nicht blockierende Client-Server) mit ZMQ ausgeführt habe. Später, als ich versuchte, das Muster REQ-REP (Client-Einzelserververbindung blockieren) auszuführen, erhalte ich den Address already in use -Fehler. Ich habe versucht, netstat mit netstat -ltnp | grep :<my port> zu laufen, aber das listet keinen Prozess auf.

Wer benutzt diese Adresse genau?

Wie schließt man Socket-Verbindungen wie diese elegant ab?

    
Pratik Mandrekar 03.10.2013, 12:54
quelle

3 Antworten

11

Frage 1:

Wenn Sie sudo netstat -ltnp ausführen, werden Sie bei einem Linux-Betriebssystem höchstwahrscheinlich feststellen, dass der Prozess den Port besitzt. Töte es mit kill -9 <pid> .

Frage 2:

Wenn Sie das Programm beenden, schließen Sie Ihre Sockets und rufen Sie dann zmq_ctx_destroy () auf. Dies zerstört den Kontext. Weitere Informationen finden Sie Ссылка .

    
jorgen 01.12.2013 06:14
quelle
2

In diesem Moment:

%Vor%

Weiter:

Beginnen Sie mit try: / except: / finally: Einkapselungskonstruktoren, die Ihnen helfen, einen anständigen Exit von allen zmq-Zuweisungen, inkl. all Socket -s ' .close() und Context ' s .Term() ohne hängende verwaiste (s) Speicherleck (e), selbst im Falle einer Panik-Schaltfläche oder Unbehandelte Exception unterbricht die Codeausführung zusammen mit dem Verlust von Referenzen auf Ihre stillen, netzwerkhardwaregebundenen Instanzen.

    
user3666197 28.09.2014 12:37
quelle
1

Manchmal verwendet ein anderer zeromq-using-Prozess den Port und netstat zeigt nicht an, dass der andere Prozess zuhört (also zeigt netstat -lntp ihn nicht an), sondern zeigt eine hergestellte Verbindung auf dem Port mit an derselbe Host / Port an beiden Enden. Nachdem der andere Prozess beendet wurde, ist der Port nun verfügbar.

Grund # 1: Ich hatte dieses Problem, weil ich die Zeromq-Listening-Ports im Bereich von kurzlebigen Ports (unter Linux 32768-61000) eingerichtet hatte, die als lokale Seite ausgehender Verbindungen und meiner Dienste verwendet werden müssen sich mit anderen Diensten auf der gleichen Box verbinden. Ein prozentualer Anteil der Zeit, in der eine ausgehende Verbindung einen ephemeren Port erhält, der mit einem Listening-Port auf der Box übereinstimmt, und plötzlich "Adresse wird bereits verwendet". Ich habe gerade alle Listening-Ports aus dem Weg des kurzlebigen Port-Bereichs entfernt, und alle Probleme mit "Adresse, die bereits verwendet werden" verschwanden.

Grund # 2: Spekulation: Wenn ich auf ähnliche Probleme mit anderen Python-Netzwerkbibliotheken gestoßen bin, wurde der problematische Prozess zuvor vom Abhörprozess unter Verwendung von Subprozess oder ähnlichem gestartet und es gab ein Problem mit dem Socket, der zum Kind leckte verarbeiten; Wenn der Parent-Prozess beendet wird, ohne den Socket zu schließen, bleibt der Socket am Leben und gehört dem Kindprozess, und obwohl der Kindprozess nichts über den Socket wusste, würde er trotzdem aufgehalten werden, was andere Prozesse nicht konnten benutze es.

Wenn dies das Problem ist, kann es repariert werden, indem die Flags des Sockets vor dem Unterprozess, z. (unix-spezifisch):

%Vor%

Oder vielleicht gibt es eine Möglichkeit, den Socket im übergeordneten Prozess ordnungsgemäß zu schließen.

    
rakslice 12.01.2015 21:17
quelle

Tags und Links