Как закрыть сокет если к нему не подключились за определённый промежуток времени?
Есть функция которая ожидает когда к сокету подключатся несколько раз, (в примере ниже - 4 раза) Эта функция работает, но как сделать так чтобы если к сокету за минуту ничего не подключилось то функция завершалась
Код:
from socket import socket
def waitcon(num):
sock = socket()
sock.bind(('127.0.0.1', 45686))
sock.listen(num)
for _ in range(num):
sock.accept()
print("Accepted")
waitcon(4)
Ответы (1 шт):
если это линукс, то тут просто - заводим таймер и запускаем. процедуру accept. По выходу с процедуры таймер сбрасываем. Если accept задерживается, то прервём его исключением. Код будет такой
from socket import socket
import signal, os
def handler(signum, frame):
print("alarm", signum)
raise OSError("No connection")
def waitcon(num):
sock = socket()
sock.bind(('127.0.0.1', 45686))
sock.listen(num)
for _ in range(num):
signal.alarm(5)
try:
sock.accept()
print("Accepted")
except OSError:
print("sorry, no one wants to connect to you")
signal.alarm(0);
signal.signal(signal.SIGALRM, handler)
waitcon(4)
адаптировано из документации https://docs.python.org/3/library/signal.html
Но в целом, в питоне есть батарейки из коробки:) И по ссылке https://stackoverflow.com/questions/7354476/python-socket-object-accept-time-out можно найти пример. Я его чуточку адаптировал, но не проверял полностью в отличии от первого примера.
import socket
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.settimeout(60) # timeout for listening
tcpServer.bind(('127.0.0.1', 45686)) # IP and PORT
tcpServer.listen(1)
stopped = False
retry = 0
while not stopped:
if retry == 4:
break
try:
(conn, (ip, port)) = tcpServer.accept()
except socket.timeout:
pass
except:
raise
else:
# work with the connection, create a thread etc.
retry=retry+1