Timeout für Python-Socket-Akzeptanz

Mohd Mohtashim Nawaz 21 Juni 2023
  1. Socket Accept, Reject und Timeout
  2. Socket-Methoden und ihre Verwendung in Python
  3. Beispiel für Socket Accept Timeout in Python
  4. Legen Sie das Standard-Timeout für jeden Socket in Python fest
  5. Abschluss
Timeout für Python-Socket-Akzeptanz

Der Socket ist der Grundbaustein für die Netzwerkkommunikation. Ein Socket wird immer dann geöffnet, wenn zwei Netzwerkinstanzen die Daten übertragen müssen.

Diese Sockets bleiben während der Sitzung verbunden. Aber manchmal müssen Sie beim Arbeiten mit Sockets in Python lange warten, während das andere Ende die Socket-Verbindung noch akzeptiert.

Dieser Artikel behandelt die timeout-Funktion von Sockets in Python, die notwendig ist, um das Problem des Wartens auf socket accept für eine unendliche Zeit zu mindern.

Socket Accept, Reject und Timeout

Immer wenn Sie versuchen, eine Verbindung zu einem Server mit Python-Skript herzustellen, müssen Sie eine Socket-Verbindung öffnen. Diese Socket-Verbindung fungiert als Tunnel für die Übertragung der Daten zwischen dem Client und dem Server.

Beim Öffnen des Sockets gibt es drei Szenarien.

  1. Socket Accept: Wenn der Socket erfolgreich geöffnet wurde und Server und Client nun verbunden sind, um Daten zu senden und zu empfangen, bezeichnen wir dies als Socket Accept. Dieses Szenario ist das endgültige Ziel beim Öffnen eines Sockets.

  2. Socket-Ablehnung: Nehmen wir an, Sie haben einen Socket geöffnet, aber einige andere Parameter übergeben, vergessen, Parameter zu übergeben, oder der Prozess zum Öffnen eines Sockets wurde nicht korrekt befolgt; Sie würden eine Absage bekommen. Dies bedeutet, dass die Verbindung zum Senden und Empfangen von Daten nicht hergestellt werden konnte.

  3. Socket Accept timeout: Dies ist ein wichtiges, aber übersehenes Szenario. Wenn Sie versuchen, einen Socket zu öffnen, erhalten Sie manchmal möglicherweise keine Antwort vom anderen Ende.

    Aus diesem Grund müssen Sie ewig warten. Dies ist eine unerwünschte Situation, da Sie die aktuelle Anfrage schließen und eine andere Anfrage versuchen möchten, anstatt ewig zu warten.

    Mit der Option timeout können Sie die maximale Wartezeit festlegen, bis Ihre Anfrage von der anderen Partei akzeptiert wird. Nach Überschreiten des Zeitlimits wird ein Fehler ausgelöst.

Socket-Methoden und ihre Verwendung in Python

Python hat eine eingebaute Bibliothek mit dem Namen socket, die Sie importieren müssen, um mit Socket-Verbindungen zu arbeiten. Lassen Sie uns einige der wichtigen Methoden der socket-Bibliothek sehen.

  1. accept(): Wie der Name schon sagt, akzeptiert die accept()-Methode eine eingehende Socket-Anfrage von einer anderen Partei. Diese Methode gibt eine Socket-Verbindung zurück, die Sie verwenden können, um die Daten zwischen den verbundenen Entitäten zu übertragen.

  2. bind(): Diese Methode bindet oder hängt eine Socket-Verbindung an eine Adresse an. Diese Methode muss aufgerufen werden, wenn Sie mit Sockets arbeiten möchten.

    Die Methode bind() akzeptiert ein Tupel aus einer IP-Adresse und einem Port, an den sie den Socket bindet.

  3. listen(): Dies ist eine serverseitige Methode, die es dem Server ermöglicht, einen Socket zu akzeptieren, um Daten zwischen den Verbindungen zu übertragen.

  4. connect(): Diese Methode akzeptiert eine Adresse als Argument. Es verbindet dann den Remote-Socket an der Adresse.

  5. settimeout(): Diese Methode akzeptiert eine Zahl ungleich Null als Anzahl der zu wartenden Sekunden, bevor sie einen TimeoutError auslöst. Diese Methode ist wichtig, um das Problem unendlicher Wartezeiten zu mindern.

  6. setdefaulttimeout(): Wenn Sie mehrere Socket-Verbindungen verwenden und für jede Verbindung das gleiche Timeout-Limit festlegen möchten, dann ist dies die Go-to-Methode für Ihren Zweck. Es akzeptiert die Anzahl von Sekunden als Argument und wendet es auf alle neuen Socket-Verbindungen als Wartezeitlimit an.

Beispiel für Socket Accept Timeout in Python

Sehen wir uns ein Beispiel für ein Socket-Akzeptanz-Timeout mit Hilfe von Code in Python an. Für dieses Beispiel müssten wir zwei Python-Skripte schreiben, eines für den Server und das andere für den Client.

Wir würden drei verschiedene Szenarien sehen, wie unten diskutiert.

  1. Das erste Szenario ist, wenn kein Timeout-Limit festgelegt ist. In diesem Fall würde der Client weiter warten.

    Beachten Sie, dass die Anfrage je nach Betriebssystem nach einiger Zeit automatisch abgelehnt wird.

  2. Im zweiten Szenario setzen wir das Timeout-Limit mit der Methode settimeout(). In diesem Fall erhalten Sie nach dem eingestellten Limit den TimeoutError.

  3. Im dritten Fall verwenden wir die Methode setdefaulttimeout(), um das Timeout-Limit festzulegen.

Lassen Sie uns nacheinander die Codes der drei obigen Fälle sehen.

Socket Accept Timeout in Python, wenn kein Timeout-Limit festgelegt ist

Serverseitiges Skript:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Clientseitiges Skript:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(("127.0.0.1", 1717))

Auf der Serverseite ist keine listen()-Methode zu sehen. Daher antwortet der Server nicht und der Client wartet.

Socket Accept Timeout in Python, wenn Timeout gesetzt ist

In diesem Fall sehen Sie, dass der Client die Operation abbricht und nach Ablauf der Timeout-Zeit einen TimeoutError auslöst.

Serverseitig:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Clientseitig:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.settimeout(3)
    s.connect(("127.0.0.1", 1717))

In diesem Fall wird ein Python-Socket TimeoutError ausgelöst. Bitte beachten Sie, dass sich Sockets je nach Plattform unterschiedlich verhalten können.

Auf dem Linux-Rechner gibt der Socket den Fehler ConnectionRefusedError: [Errno 111] Verbindung abgelehnt aus, bis Sie den Socket auf der Serverseite nicht akzeptieren.

Legen Sie das Standard-Timeout für jeden Socket in Python fest

Diese Methode würde das gleiche Standardzeitlimit für alle Ihre neuen Sockets festlegen. Auf diese Weise können Sie Zeit und Ärger sparen, indem Sie das Timeout für jeden Socket separat einstellen.

Serverseitig:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Clientseitig:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    socket.setdefaulttimeout(3)
    s.connect(("127.0.0.1", 1717))

Beachten Sie, dass Sie für setdefaulttimeout() die Socket-Klasse direkt anstelle des Objekts verwenden müssen, da sie das Timeout für alle Threads setzt.

Abschluss

Das Socket-Timeout ist ein wichtiger Aspekt der Socket-Programmierung in Python. Wenn Sie das Timeout nicht handhaben, können Sie Ihren Client für immer auf den Socket warten lassen.

Oder im anderen Fall, abhängig von Ihrer Umgebungsimplementierung, kann es einen Fehler auslösen.

Verwandter Artikel - Python Socket