OSError: [WinError 10038] Es wurde eine Operation für etwas versucht, das kein Socket ist

Salman Mehmood 15 Februar 2024
  1. Erstellen Sie eine Anwendung mit Hilfe des socket-Moduls ohne Fehler in Python
  2. der OSError: [WinError 10038] An Operation Was Attempted on Something That Is Not a Socket
OSError: [WinError 10038] Es wurde eine Operation für etwas versucht, das kein Socket ist

Mit dieser Erklärung lernen wir, was Server und Client sind und wie man das Modul socket verwendet, um eine Anwendung mit Hilfe von Server und Client zu erstellen. Wir werden auch lernen, wie man Fehler vermeidet, wenn man diese Art von Anwendungen in Python erstellt.

Erstellen Sie eine Anwendung mit Hilfe des socket-Moduls ohne Fehler in Python

Im Internet kann der Knoten ein Server oder ein Client sein; Natürlich kann es auch ein Client-zu-Client-Netzwerk sein, in dem Sie alle Knoten haben und miteinander sprechen. Es ist ein Peer-to-Peer-Netzwerk.

Wir haben Server im Internet, die den Clients zuhören, und sie warten darauf, dass der Client eine Anfrage sendet.

Wenn Sie beispielsweise zu google.com, dem Google-Server, gehen und eine Anfrage an den Google-Server senden, sendet Ihnen der Google-Server eine Antwort, d. h. eine Seite oder eine Seite nicht gefunden-Nachricht.

Beginnen wir mit der Erstellung von zwei Python-Dateien, demo.py und client.py. Wir wollen die Nachricht vom Server an den Client senden.

Server und Client können sich an unterschiedlichen Standorten oder außerhalb des Netzwerks befinden.

Wir werden den Server erstellen und dann eine Nachricht weitergeben und sehen, wie dieser Client die Nachricht vom Server empfängt. Um es einfach zu halten, machen wir es auf dem Localhost, aber Sie können es auch auf anderen Systemen machen.

Als erstes müssen wir den socket importieren und eine Instanz erstellen. Wir rufen die Socket-Klasse auf und spezifizieren dann die Socket-Familie.

Die Socket-Familie ist AF_INET und die Socket-Formel ist SOCK_STREAM.

Im nächsten Schritt müssen wir den Socket mit der Methode bind() an den Hostnamen am Port binden. Jetzt müssen wir mit der Methode listen() auf Verbindungen lauschen; die maximale Anzahl von Verbindungen wäre 5.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

Um eine Verbindung mit einem Client zu finden, senden wir eine Nachricht vom Server, damit der Client die Nachricht erhält.

Dazu verwenden wir die while-Schleife, die True wäre. In dieser Schleife erstellen wir mit der Methode connect() einen weiteren Socket, der der Client-Socket wäre; es wird in der Datei client.py verwendet.

Wir verwenden die accept()-Methode, die zwei Werte zurückgibt; Deshalb haben wir zwei Variablen deklariert, die den eingehenden Socket und die Adresse der eingehenden Verbindung speichern. Jetzt drucken wir eine Nachricht, die zeigt, dass eine Verbindung von der angegebenen Adresse hergestellt wurde.

while True:
    Client_Socket, Adress = SKT.accept()
    print(f"Connection has been established from {Adress}")

Jetzt müssen wir eine Nachricht in Bytes senden. Die Kodierung ist utf-8 und wird an jeden Client gesendet, der mit dem Socket verbunden ist.

Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
Client_Socket.close()

Unser Socket ist bereit, auf die Verbindung zu hören. Jetzt arbeiten wir in der Datei client.py und verwenden denselben Code mit Ausnahme der Methode connect().

In der connect()-Methode verwenden wir den gleichen Hostnamen, Localhost und Port.

Jetzt erhalten wir die Nachricht, die vom Server kommt. Wir verwenden die Methode recv() und übergeben sie an 2048 Bytes.

Wir drucken diese Nachricht aus, um zu überprüfen, ob die Nachricht eingegangen ist oder nicht.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.connect((socket.gethostname(), 6060))

MSG = SKT.recv(2048)

print(f"Message has been received {MSG}")

Jetzt ist die Anwendung abgeschlossen, also führen wir zuerst den Server aus, die Datei demo.py; es läuft, aber es ist nichts passiert. Wenn wir zu client.py gehen und diese Datei in einem interaktiven Fenster ausführen, können wir die Antwort in der Konsole sehen, wenn diese Dateien gleichzeitig ausgeführt werden.

Anwendung mit dem Socket-Modul ohne Fehler - Ausgang

der OSError: [WinError 10038] An Operation Was Attempted on Something That Is Not a Socket

Es gibt einige häufige Gründe, warum beim Erstellen dieser Anwendung Fehler auftreten. Ein Grund könnte sein, dass Sie vergessen haben, eine Datei oder beide auszuführen, oder dass Sie irgendwo einen Fehler machen.

Schauen wir uns ein Beispiel an, bei dem die Benutzer diesen Fehler häufig erhalten.

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

while True:
    Client_Socket, Adress = SKT.accept()

    while True:

        print(f"Connection has been established from {Adress}")
        Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
        Client_Socket.close()

Ausgang:

OSError: [WinError 10038] An operation was attempted on something that is not a socket

Dies liegt daran, dass wir eine verschachtelte while-Schleife ausführen und beide True sind. Wenn die äußere while-Schleife ausgeführt wird, akzeptieren wir die eingehende Verbindung vom Client.

Das Problem tritt auf, wenn die innere while-Schleife ausgeführt wird.

Da die innere while-Schleife beim ersten Mal True ist, wird diese Schleife perfekt ausgeführt, aber in der zweiten Iteration muss die while-Schleife eine eingehende Verbindung akzeptieren. Die Methode accept() ruft von der äußeren Schleife auf, die niemals aufgerufen wird; Aus diesem Grund wird festgestellt, dass der Socket nicht mehr vorhanden ist.

Ein weiterer Grund, warum das Problem auftreten kann, ist, wenn Sie diese beiden Dateien vom Terminal aus ausführen. Wenn Sie in VS-Code arbeiten, führen Sie diese beiden Dateien einzeln in (aktuelle Datei in einem interaktiven Fenster) aus.

Anwendung mit dem Socket-Modul - Aktuelle Datei im interaktiven Fenster ausführen

Vollständiger demo.py-Dateicode:

import socket

SKT = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SKT.bind((socket.gethostname(), 6060))
SKT.listen(5)

while True:
    Client_Socket, Adress = SKT.accept()
    print(f"Connection has been established from {Adress}")
    Client_Socket.send(bytes("Welcome to the server!!!", "utf-8"))
    Client_Socket.close()
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Verwandter Artikel - Python Error