Programing

파이썬의 소켓 recv 메서드에서 시간 제한을 설정하는 방법은 무엇입니까?

lottogame 2020. 8. 21. 08:29
반응형

파이썬의 소켓 recv 메서드에서 시간 제한을 설정하는 방법은 무엇입니까?


파이썬의 소켓 recv 메서드에 시간 제한을 설정해야합니다. 어떻게하나요?


일반적인 방법은 select () 를 사용 하여 데이터를 사용할 수있을 때까지 또는 시간 초과가 발생할 때까지 기다리는 것입니다. recv()데이터를 실제로 사용할 수있을 때만 호출 합니다. 안전을 위해 소켓을 비 차단 모드로 설정하여 recv()무기한 차단되지 않도록 보장 합니다. select()한 번에 둘 이상의 소켓을 대기하는 데 사용할 수도 있습니다.

import select

mysocket.setblocking(0)

ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

열린 파일 설명 자가 많으면 poll ()select().

또 다른 옵션은을 사용하여 소켓의 모든 작업에 대한 시간 제한을 설정하는 socket.settimeout()것이지만 다른 답변에서 해당 솔루션을 명시 적으로 거부 한 것을 확인했습니다.


거기에 socket.settimeout()


으로 모두 언급 select.select()하고 socket.settimeout()작동합니다.

필요에 따라 settimeout두 번 전화해야 할 수도 있습니다 . 예 :

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("",0))
sock.listen(1)
# accept can throw socket.timeout
sock.settimeout(5.0)
conn, addr = sock.accept()

# recv can throw socket.timeout
conn.settimeout(5.0)
conn.recv(1024)

응답을 받기 전에 시간 제한을 설정하고 응답을받은 후 다시 없음으로 설정할 수 있습니다.

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.settimeout(5.0)
data = sock.recv(1024)
sock.settimeout(None)

찾고있는 시간 초과는 서버 측을 구현하는 경우 기본 소켓이 아닌 연결 소켓의 시간 초과입니다. 즉, socket.accept()method 의 출력 인 연결 소켓 개체에 대한 또 다른 제한 시간이 있습니다. 따라서:

sock.listen(1)
connection, client_address = sock.accept()
connection.settimeout(5)    # This is the one that affects recv() method.
connection.gettimeout()     # This should result 5
sock.gettimeout()           # This outputs None when not set previously, if I remember correctly.

클라이언트 측을 구현하면 간단합니다.

sock.connect(server_address)
sock.settimeout(3)

이전 회신에서 언급했듯이 다음과 같이 사용할 수 있습니다. .settimeout()예 :

import socket

s = socket.socket()

s.settimeout(1) # Sets the socket to timeout after 1 second of no activity

host, port = "somehost", 4444
s.connect((host, port))

s.send("Hello World!\r\n")

try:
    rec = s.recv(100) # try to receive 100 bytes
except socket.timeout: # fail after 1 second of no activity
    print("Didn't receive data! [Timeout]")
finally:
    s.close()

이게 도움이 되길 바란다!!


socket.settimeout()초 수를 나타내는 정수 인수를 허용하는 것을 사용할 수 있습니다 . 예를 들어 socket.settimeout(1)시간 제한을 1 초로 설정합니다.


try this it uses the underlying C.

timeval = struct.pack('ll', 2, 100)
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeval)

#! /usr/bin/python3.6

# -*- coding: utf-8 -*-
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.settimeout(5)
PORT = 10801

s.bind(('', PORT))
print('Listening for broadcast at ', s.getsockname())
BUFFER_SIZE = 4096
while True:
    try:
        data, address = s.recvfrom(BUFFER_SIZE)
    except socket.timeout:
        print("Didn't receive data! [Timeout 5s]")
        continue

참고URL : https://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-method

반응형