Python 소켓 수락 시간 초과

Mohd Mohtashim Nawaz 2023년6월21일
  1. 소켓 수락, 거부 및 시간 초과
  2. Python에서 소켓 메서드 및 용도
  3. Python에서 소켓 수락 시간 초과의 예
  4. Python의 각 소켓에 대한 기본 시간 제한 설정
  5. 결론
Python 소켓 수락 시간 초과

소켓은 네트워크 통신을 위한 기본 빌딩 블록입니다. 두 개의 네트워크 엔티티가 데이터를 전송해야 할 때마다 소켓이 열립니다.

이 소켓은 세션 중에 연결된 상태를 유지합니다. 그러나 때때로 Python에서 소켓으로 작업하는 동안 다른 쪽 끝이 소켓 연결을 수락하는 동안 오랜 시간 동안 기다려야 할 수 있습니다.

이 기사에서는 무한한 시간 동안 소켓 수락을 기다리는 문제를 완화하는 데 필요한 Python 소켓의 시간 초과 기능에 대해 설명합니다.

소켓 수락, 거부 및 시간 초과

Python 스크립트를 사용하여 서버에 연결을 시도할 때마다 소켓 연결을 열어야 합니다. 이 소켓 연결은 클라이언트와 서버 간에 데이터를 전송하기 위한 터널 역할을 합니다.

소켓을 여는 과정에는 세 가지 시나리오가 있습니다.

  1. 소켓 승인: 소켓이 성공적으로 열리고 서버와 클라이언트가 연결되어 데이터를 송수신할 때 이를 소켓 승인이라고 합니다. 이 시나리오는 소켓을 여는 최종 목표입니다.

  2. 소켓 거부: 소켓을 열었지만 다른 매개변수를 전달했거나 매개변수 전달을 잊었거나 소켓을 여는 프로세스가 올바르게 수행되지 않았다고 가정해 보겠습니다. 당신은 거부를 얻을 것입니다. 데이터 송수신 연결을 설정할 수 없음을 의미합니다.

  3. Socket Accept timeout: 이것은 중요하지만 간과되는 시나리오입니다. 때때로 소켓을 열려고 할 때 다른 쪽 끝에서 응답을 받지 못할 수 있습니다.

    이로 인해 당신은 영원히 기다리고 있습니다. 영원히 기다리지 않고 현재 요청을 닫고 다른 요청을 시도하려는 원치 않는 상황입니다.

    timeout 옵션을 사용하면 상대방이 요청을 수락할 때까지 최대 대기 시간을 설정할 수 있습니다. 시간 제한을 초과하면 오류가 발생합니다.

Python에서 소켓 메서드 및 용도

Python에는 소켓 연결 작업을 위해 가져와야 하는 socket이라는 이름의 내장 라이브러리가 있습니다. socket 라이브러리의 몇 가지 중요한 메소드를 살펴보겠습니다.

  1. accept(): 이름에서 알 수 있듯이 accept() 메서드는 다른 당사자로부터 들어오는 소켓 요청을 수락합니다. 이 메서드는 연결된 엔터티 간에 데이터를 전송하는 데 사용할 수 있는 소켓 연결을 반환합니다.

  2. bind(): 이 메서드는 소켓 연결을 주소에 바인딩하거나 연결합니다. 이 메서드는 소켓으로 작업하려면 반드시 호출해야 하는 메서드입니다.

    bind() 메서드는 소켓을 바인딩하는 IP 주소와 포트의 튜플을 허용합니다.

  3. listen(): 서버가 소켓을 수락하여 연결 간에 데이터를 전송할 수 있도록 하는 서버측 메서드입니다.

  4. connect(): 이 메서드는 주소를 인수로 받아들입니다. 그런 다음 주소에서 원격 소켓을 연결합니다.

  5. settimeout(): 이 메서드는 TimeoutError를 발생시키기 전에 대기할 초 수로 0이 아닌 숫자를 허용합니다. 이 방법은 무한 대기 시간 문제를 완화하는 데 중요합니다.

  6. setdefaulttimeout(): 여러 소켓 연결을 사용 중이고 각 연결에 대해 동일한 시간 초과 제한을 설정하려는 경우 목적에 맞는 이동 방법입니다. 초 수를 인수로 받아들이고 대기 시간 제한으로 모든 새 소켓 연결에 적용합니다.

Python에서 소켓 수락 시간 초과의 예

Python의 코드를 사용하여 소켓 수락 시간 초과의 예를 살펴보겠습니다. 이 예에서는 두 개의 Python 스크립트를 작성해야 합니다. 하나는 서버용이고 다른 하나는 클라이언트용입니다.

아래에서 설명하는 것처럼 세 가지 다른 시나리오를 볼 수 있습니다.

  1. 첫 번째 시나리오는 제한 시간 제한이 설정되지 않은 경우입니다. 이 경우 클라이언트는 계속 대기합니다.

    운영 체제에 따라 일정 시간이 지나면 요청이 자동으로 거절될 수 있습니다.

  2. 두 번째 시나리오는 settimeout() 메서드를 사용하여 시간 제한을 설정하는 경우입니다. 이 경우 설정된 제한 후에 TimeoutError가 표시됩니다.

  3. 세 번째 경우에는 setdefaulttimeout() 메서드를 사용하여 시간 제한을 설정합니다.

위의 3가지 경우의 코드를 하나씩 살펴보자.

시간 초과 제한이 설정되지 않은 경우 Python에서 소켓 허용 시간 초과

서버 측 스크립트:

import socket

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

클라이언트 측 스크립트:

import socket

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

서버 측에서 listen() 메서드를 볼 수 없습니다. 따라서 서버가 응답하지 않고 클라이언트가 대기 중입니다.

시간 초과가 설정된 경우 Python에서 소켓 허용 시간 초과

이 경우 클라이언트가 작업을 중단하고 제한 시간이 지난 후 TimeoutError를 발생시키는 것을 볼 수 있습니다.

서버 측:

import socket

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

고객 입장에서:

import socket

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

이 경우 Python 소켓 TimeoutError가 발생합니다. 소켓은 플랫폼에 따라 다르게 동작할 수 있습니다.

Linux 시스템에서 소켓은 서버 측에서 소켓을 수락하지 않을 때까지 ConnectionRefusedError: [Errno 111] 연결 거부됨 오류를 발생시킵니다.

Python의 각 소켓에 대한 기본 시간 제한 설정

이 방법은 모든 새 소켓에 대해 동일한 기본 시간 제한을 설정합니다. 이와 같이 각 소켓에 대한 시간 제한을 개별적으로 설정하여 시간과 번거로움을 줄일 수 있습니다.

서버 측:

import socket

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

고객 입장에서:

import socket

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

setdefaulttimeout()의 경우 모든 스레드에 대한 시간 제한을 설정하므로 개체 대신 소켓 클래스를 직접 사용해야 합니다.

결론

소켓 타임아웃은 Python에서 소켓 프로그래밍의 중요한 측면입니다. 시간 초과를 처리하지 않으면 클라이언트가 소켓을 영원히 기다리게 할 수 있습니다.

또는 다른 경우 환경 구현에 따라 오류가 발생할 수 있습니다.

관련 문장 - Python Socket