python ssl socket OSerror Была предпринята попытка выполнить что-то, что не является сокетом - PullRequest
0 голосов
/ 07 апреля 2020

Поэтому, прежде чем кто-либо скажет, что это дубликат, я видел несколько вопросов с этой ошибкой, но не мог заметить, что это то же самое, что и моя проблема.

Я пытаюсь сделать небольшой проект, включающий сокет через 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, поскольку он изменил переданный ему экземпляр сокета, но не смог найти способ развернуть его.

Заранее спасибо!

1 Ответ

1 голос
/ 07 апреля 2020

listen позволяет сокету принимать входящие запросы на подключение (также называемый «пассивным сокетом») и устанавливает резервное количество того, сколько из этих запросов может ожидаться в сетевом стеке в любой момент времени. accept принимает одно из этих соединений. Вы вызываете listen один раз и accept много раз.

Потяните listen за пределы while, чтобы вызывать его только один раз, чтобы установить sh в качестве прослушивающего сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...