OSError: [WinError 10038] 소켓이 아닌 항목에서 작업을 시도했습니다.

Salman Mehmood 2023년6월21일
  1. Python에서 오류 없이 socket 모듈의 도움으로 애플리케이션 만들기
  2. OSError: [WinError 10038] 소켓이 아닌 항목에서 작업을 시도했습니다
OSError: [WinError 10038] 소켓이 아닌 항목에서 작업을 시도했습니다.

이 설명을 통해 우리는 서버와 클라이언트가 무엇인지, 서버와 클라이언트의 도움으로 애플리케이션을 생성하기 위해 소켓 모듈을 사용하는 방법을 배웁니다. 또한 Python에서 이러한 유형의 응용 프로그램을 만들 때 오류를 피하는 방법도 배웁니다.

Python에서 오류 없이 socket 모듈의 도움으로 애플리케이션 만들기

인터넷에서 노드는 서버 또는 클라이언트가 될 수 있습니다. 물론 모든 노드가 있고 서로 대화하는 클라이언트 대 클라이언트 네트워크일 수도 있습니다. 피어 투 피어 네트워크입니다.

우리는 클라이언트를 청취하는 인터넷에 서버를 가지고 있으며 클라이언트가 요청을 보내기를 기다리고 있습니다.

예를 들어 Google 서버인 google.com으로 이동하여 Google 서버에 요청을 보내면 Google 서버는 페이지 또는 페이지를 찾을 수 없음 메시지와 같은 일부 응답을 보냅니다.

demo.pyclient.py라는 두 개의 Python 파일을 생성하여 시작하겠습니다. 서버에서 클라이언트로 메시지를 보내려고 합니다.

서버와 클라이언트는 서로 다른 위치에 있거나 네트워크 외부에 있을 수 있습니다.

서버를 만든 다음 메시지를 전달하고 이 클라이언트가 서버에서 메시지를 받는 방법을 확인합니다. 간단하게 하기 위해 localhost에서 수행하지만 다른 시스템에서도 수행할 수 있습니다.

가장 먼저 해야 할 일은 소켓을 가져오고 인스턴스를 만드는 것입니다. 소켓 클래스를 호출한 다음 소켓 제품군을 지정합니다.

소켓 제품군은 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)

클라이언트와의 연결을 찾기 위해 클라이언트가 메시지를 받도록 서버에서 메시지를 보냅니다.

이를 위해 Truewhile 루프를 사용합니다. 이 루프에서 connect() 메서드를 사용하여 클라이언트 소켓이 될 또 다른 소켓을 생성합니다. client.py 파일에서 사용됩니다.

우리는 두 개의 값을 반환하는 accept() 메서드를 사용하고 있습니다. 그것이 들어오는 소켓과 들어오는 연결의 주소를 저장하는 두 개의 변수를 선언한 이유입니다. 이제 지정된 주소에서 연결이 설정되었음을 나타내는 메시지를 인쇄합니다.

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() 메서드에서 동일한 호스트 이름, localhost 및 포트를 사용합니다.

이제 서버에서 오는 메시지를 받을 것입니다. 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] 소켓이 아닌 항목에서 작업을 시도했습니다

이 응용 프로그램을 만들 때 오류가 발생하는 몇 가지 일반적인 이유가 있습니다. 한 가지 이유는 둘 다 하나의 파일을 실행하는 것을 잊었거나 어디서든 실수를 하고 있기 때문일 수 있습니다.

사용자에게 종종 이 오류가 발생하는 예를 살펴보겠습니다.

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이므로 이 루프는 완벽하게 실행되지만 두 번째 반복에서는 while 루프가 들어오는 연결을 수락해야 합니다. accept() 메소드는 절대 호출되지 않는 외부 루프에서 호출합니다. 이것이 소켓이 더 이상 존재하지 않는 이유입니다.

문제가 발생할 수 있는 또 다른 이유는 터미널에서 이 두 파일을 실행할 때입니다. VS 코드에서 작업하는 경우 이 두 파일을 (대화형 창의 현재 파일)에서 개별적으로 실행합니다.

소켓 모듈이 있는 응용 프로그램 - 대화형 창에서 현재 파일 실행

완전한 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 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