Поэтому, прежде чем кто-либо скажет, что это дубликат, я видел несколько вопросов с этой ошибкой, но не мог заметить, что это то же самое, что и моя проблема.
Я пытаюсь сделать небольшой проект, включающий сокет через SSL, и при попытке перехвата, если пользователь пытается соединиться с необработанным сокетом, а не с ssl-завернутым сокетом (который вызывает ошибку ConnectionResetError), я получаю другую ошибку.
Мой код:
import socket
from classes import ClientThread
import ssl
from time import sleep
server = 'localhost'
port = 12345
threads = []
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.load_cert_chain(certfile="cert.pem", keyfile="cert.pem")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((server, port))
print(f"[*] server started, listening on port {port}")
while True:
s.listen()
with context.wrap_socket(s, server_side=True) as ssock:
try:
conn, addr = ssock.accept()
client = ClientThread(conn=conn, ip=addr[0], port=addr[1])
client.start()
threads.append(client)
print(f'Threads running: {len(threads)}')
except ConnectionResetError:
print(f'Could not establish ssl handshake with a client.')
Ошибка, которую я получаю:
Traceback (most recent call last):
File "C:/Users/x/x/server.py", line 17, in <module>
s.listen()
OSError: [WinError 10038] An operation was attempted on something that is not a socket
Я попытался установить некоторое время сна после исключения, может быть, это было необходимо для сброса сокета, но не завис, попытался немного поиграть с размещением Хотя True и сбрасывает всю справку по сокету, я не хочу сбрасывать все мои клиентские потоки только из-за клиента, который не пытался войти в систему через сокет SSL.
Я думаю, что ему есть чем заняться с помощью wrap_socket, поскольку он изменил переданный ему экземпляр сокета, но не смог найти способ развернуть его.
Заранее спасибо!