python ssl套接字操作错误尝试对非套接字的对象执行操作

python ssl套接字操作错误尝试对非套接字的对象执行操作,python,sockets,ssl,Python,Sockets,Ssl,因此,在别人说这是重复之前,我已经看到了多个错误的问题,但没有注意到任何一个问题与我的问题相同 我试图创建一个包含SSL套接字的小项目,当试图捕获用户是否尝试使用原始套接字而不是SSL包装的套接字(这会引发ConnectionResetError)进行连接时,我得到了一个不同的错误 我的代码: import socket from classes import ClientThread import ssl from time import sleep server = 'localhost'

因此,在别人说这是重复之前,我已经看到了多个错误的问题,但没有注意到任何一个问题与我的问题相同

我试图创建一个包含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
回溯(最近一次呼叫最后一次):
文件“C:/Users/x/x/server.py”,第17行,在
s、 听
OSError:[WinError 10038]尝试对非套接字的对象执行操作
我尝试在异常发生后设置一些睡眠时间,可能它需要重置套接字,但没有处理,尝试在While True的位置上玩一些,在重置整个套接字帮助时,我不想因为一个客户端没有尝试使用SSL套接字登录而重置所有客户端线程

我认为这与wrap_套接字有关,因为它修改了传递给它的套接字实例,但找不到展开的方法


提前谢谢你

listen
使套接字能够接收传入的连接请求(也称为“被动套接字”),并建立在任何给定时间网络堆栈中可挂起的这些请求的积压量<代码>接受接受其中一个连接。您可以调用
listen
一次,并多次调用
accept


listen
拉到
while
之外,使其只被调用一次,以将其建立为侦听套接字。

您应该只在循环之外调用listen一次。@t感谢您的回复,但它只接受一个连接,而不是多线程服务器。否,listen只允许套接字接收传入的连接请求,并设置一个限制,限制这些请求中有多少可以在TCP堆栈中被积压而不被接受<代码>接受等待连接进入。你听一次,接受很多次。在linux上,可以多次调用listen(但不正常)。我假设Windows或ssl的东西使事情有所不同,但无法测试。将侦听移到while之外,看看会发生什么。我没有看到这个问题的好dup,所以我提供了我的评论作为答案。顺便说一句,感谢堆栈跟踪,它使我们很容易发现问题行。令人惊讶的是,有多少人不这么做。