83 Stimmen

Zeitüberschreitung bei Python-Socket-Verbindungen

Ich habe ein Socket, das ich Timeout beim Verbinden möchte, so dass ich die ganze Operation abbrechen kann, wenn es nicht verbinden kann, aber auch das Makefile für das Socket verwenden möchten, die keine Timeout erfordert.

Gibt es eine einfache Möglichkeit, dies zu tun, oder wird dies eine schwierige Angelegenheit sein?

Erlaubt Python ein Zurücksetzen der Zeitüberschreitung nach der Verbindung, so dass ich makefile verwenden kann und immer noch eine Zeitüberschreitung für die Socket-Verbindung haben

0 Stimmen

Ja, Python erlaubt das Zurücksetzen von Zeitüberschreitungen. Sie können sogar eine andere Zeitüberschreitung nach dem Makefile einstellen. Ich habe es unter Linux und Windows getestet.

146voto

João Pinto Punkte 5073

Sie müssen nur die Buchse settimeout() Methode, bevor Sie versuchen, die connect() Bitte beachten Sie, dass Sie nach der Verbindung settimeout(None) um den Socket in den blockierenden Modus zu versetzen, was für das Makefile erforderlich ist. Hier ist der Code, den ich verwende:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect(address)
sock.settimeout(None)
fileobj = sock.makefile('rb', 0)

43 Stimmen

Zur Information: Die Zeitüberschreitung muss in Sekunden angegeben werden.

28voto

John La Rooy Punkte 278961

Wenn Sie Python2.6 oder neuer verwenden, ist es praktisch, wenn Sie socket.create_connection

sock = socket.create_connection(address, timeout=10)
sock.settimeout(None)
fileobj = sock.makefile('rb', 0)

4voto

Um die Socket-Zeitüberschreitung einzustellen, müssen Sie die folgenden Schritte ausführen:

import socket
socks = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socks.settimeout(10.0) # settimeout is the attr of socks.

2 Stimmen

Das ist einfach nicht richtig? Es sollte sein socks.settimeout(10.0) Andernfalls würden Sie einen Attributfehler erhalten.

3 Stimmen

Beachten Sie, dass es in Version 3.7.x und vielleicht früher auch eine sockets.setdefaulttimeout(10.0) die meines Erachtens von allen neu erstellten Socket-Bibliotheksobjekten verwendet wird, die Timeouts nehmen.

1 Stimmen

Ergänzend zum Hinweis von @DevPlayer müssen Sie sockets.setdefaulttimeout(10.0) aufrufen, bevor Sie den Socket erstellen. Getestet mit Python 3.10.6.

1voto

Probieren Sie diesen Code aus:

try:
   import socket  
   socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.settimeout(10)
except socket.error:
    print("Nope !!!")

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