OSError: [WinError 10038] ソケットではないものに対して操作が試行されました

Salman Mehmood 2023年6月21日
  1. socket モジュールを使用して Python でエラーのないアプリケーションを作成する
  2. OSError: [WinError 10038] ソケットではないものに対して操作が試行されました
OSError: [WinError 10038] ソケットではないものに対して操作が試行されました

この説明では、サーバーとクライアントとは何か、そして socket モジュールを使用してサーバーとクライアントの助けを借りてアプリケーションを作成する方法を学びます. また、Python でこれらのタイプのアプリケーションを作成する際のエラーを回避する方法も学びます。

socket モジュールを使用して Python でエラーのないアプリケーションを作成する

インターネット上では、ノードはサーバーまたはクライアントになることができます。 もちろん、すべてのノードがあり、互いに通信しているクライアント間のネットワークにすることもできます。 これはピアツーピア ネットワークです。

インターネット上にクライアントをリッスンするサーバーがあり、クライアントがリクエストを送信するのを待っています。

たとえば、Google サーバーである google.com にアクセスし、Google サーバーにリクエストを送信すると、Google サーバーは何らかの応答、つまりページまたは Page Not Found メッセージを送信します。

demo.pyclient.py という 2つの Python ファイルを作成することから始めましょう。 サーバーからクライアントにメッセージを送信します。

サーバーとクライアントは、別の場所またはネットワークの外部にある可能性があります。

サーバーを作成し、メッセージを渡し、このクライアントがサーバーからメッセージを受信する方法を確認します。 簡単にするために、ローカルホストで実行していますが、別のシステムでも実行できます。

最初に行う必要があるのは、socket をインポートしてインスタンスを作成することです。 ソケット クラスを呼び出してから、ソケット ファミリを指定します。

ソケット ファミリは AF_INET になり、ソケット式は SOCK_STREAM になります。

次のステップでは、bind() メソッドを使用してソケットをポートのホスト名にバインドする必要があります。 ここで、listen() メソッドを使用して接続をリッスンする必要があります。 接続の最大数は 5 です。

import socket

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

クライアントとの接続を見つけるために、サーバーからメッセージを送信して、クライアントがメッセージを受信できるようにします。

そのために、True になる while ループを使用します。 このループでは、connect() メソッドを使用して、クライアント ソケットとなる別のソケットを作成します。 client.py ファイルで使用されます。

2つの値を返す accept() メソッドを使用しています。 そのため、着信ソケットと着信接続のアドレスを格納する 2つの変数を宣言しました。 ここで、指定したアドレスから接続が確立されたことを示すメッセージを出力します。

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

次に、メッセージをバイト単位で送信する必要があります。 エンコーディングは utf-8 で、ソケットに接続された各クライアントに送信されます。

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

ソケットは接続をリッスンする準備ができています。 client.py ファイルで作業し、connect() メソッド以外は同じコードを使用します。

connect() メソッドでは、同じホスト名、ローカルホスト、およびポートを使用します。

次に、サーバーからのメッセージを受信します。 recv() メソッドを使用して、2048 バイトに渡します。

メッセージが受信されたかどうかを確認するために、このメッセージを印刷します。

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}")

これでアプリケーションが完成したので、最初にサーバー、demo.py ファイルを実行します。 実行されていますが、何も起こっていません。 client.py に移動し、このファイルを対話型ウィンドウで実行すると、これらのファイルが同時に実行されたときにコンソールで応答を確認できます。

エラーのないソケット モジュールを使用したアプリケーション - 出力

OSError: [WinError 10038] ソケットではないものに対して操作が試行されました

このアプリケーションの作成時にエラーが発生する一般的な理由がいくつかあります。 理由の 1つは、1つのファイルまたは両方のファイルを実行するのを忘れたか、どこかで間違いを犯している可能性があります。

ユーザーがこのエラーを頻繁に受け取る例を見てみましょう。

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()

出力:

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

これは、ネストされた while ループを実行しており、両方とも True であるためです。 外側の while ループが実行されると、クライアントからの着信接続を受け入れます。

この問題は、内側の while ループが実行されるときに発生します。

内側の while ループは最初は True であるため、このループは完全に実行されますが、2 回目の反復では、while ループは着信接続を受け入れる必要があります。 accept() メソッドは、呼び出されることのない外側のループから呼び出します。 そのため、ソケットが存在しないことがわかります。

この問題が発生するもう 1つの理由は、ターミナルからこれら 2つのファイルを実行した場合です。 VS コードで作業している場合は、これら 2つのファイルを (対話型ウィンドウの現在のファイル) で個別に実行します。

ソケット モジュールを使用したアプリケーション - 対話型ウィンドウで現在のファイルを実行

完全な demo.py ファイル コード:

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
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

関連記事 - Python Error