添加SSL证书后多线程Socket通信出现[WinError 10038]错误求助
问题原因分析
这个错误的核心是服务器端没有正确将accept得到的原始Socket包装为SSL套接字,直接对原始Socket执行send操作,而此时该Socket已被SSL上下文接管,操作系统判定它不再是可正常操作的Socket对象。
修复步骤
- 服务器端接受连接后,必须用SSL上下文的
wrap_socket方法包装原始Socket,得到SSL连接对象后再进行通信:# 错误写法:直接使用accept返回的原始Client Socket Client, addr = self.sock.accept() # 正确写法:用SSL上下文包装原始Socket ssl_conn = self.ssl_context.wrap_socket(Client, server_side=True) # 后续所有通信操作都使用ssl_conn,而非原始的Client ssl_conn.send(str.encode('Welcome to the Server')) - 检查服务器端SSL上下文初始化是否正确,确保加载了有效的证书和密钥:
# 标准SSL服务器上下文初始化示例 ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) # 替换为你的服务器证书和密钥路径 ssl_context.load_cert_chain(certfile="server.crt", keyfile="server.key") # 原始Socket仅负责绑定监听,实际通信由SSL包装后的对象处理 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((HOST, PORT)) sock.listen(5) - 客户端需确保SSL套接字连接逻辑正确,避免出现协议不匹配:
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 加载服务器证书用于验证 ssl_context.load_verify_locations("server.crt") # 若启用双向证书认证,需加载客户端证书 # ssl_context.load_cert_chain(certfile="client.crt", keyfile="client.key") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssock = ssl_context.wrap_socket(sock, server_hostname=HOST) ssock.connect((HOST, PORT))
额外排查点
- 多线程处理时,确保每个线程操作的是独立的SSL包装后套接字,禁止共享原始Socket对象。
- 检查是否在
accept后误关闭了原始Socket,导致后续操作的对象失效。
内容的提问来源于stack exchange,提问作者user19019404
相关产品推荐
相关产品推荐

