You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:50:39