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

Python Socket客户端循环重试连接时出现OSError: [WinError 10022]错误求助

解决Windows下Python Socket重试连接时的WinError 10022错误

这个错误是Windows Socket实现的特有问题,我来给你拆解原因和解决办法:

问题根源

在Windows系统中,当一个socket对象调用connect()超时失败后,这个socket会进入不可复用的错误状态——你不能再用同一个socket实例发起第二次连接请求,否则就会抛出OSError: [WinError 10022] An invalid argument was supplied。而Unix-like系统允许复用这类socket,这也是为什么你只在Windows下遇到这个问题。

你的代码里把client = socket.socket()放在了循环外面,第一次超时后,第二次循环还是用同一个失效的socket去连接,自然触发了错误。

修复方案

每次重试连接时,都创建一个新的socket对象,用完(超时或连接成功后)记得关闭旧的socket避免资源泄漏。修改后的代码如下:

import socket
hostname = socket.gethostname()
port = 50007

while True:
    # 每次循环新建socket实例
    client = socket.socket()
    client.settimeout(0.1)
    try:
        client.connect((hostname, port))
    except socket.timeout:
        print("timeout")
        client.close()  # 关闭超时的socket
        continue
    else:
        # 连接成功后的业务逻辑
        print("连接成功!")
        # 示例:发送数据
        # client.send(b"Hello Server")
        # 处理完后关闭socket
        client.close()
        break  # 如果不需要持续重试,就退出循环;否则去掉break继续尝试

针对Tkinter UI的额外建议

因为你在用Tkinter开发UI,直接在主线程里跑这个循环会阻塞UI事件循环,导致界面假死。建议把连接逻辑放到单独的线程中执行,比如用threading模块:

import socket
import threading
import tkinter as tk

def connect_loop():
    hostname = socket.gethostname()
    port = 50007
    while True:
        client = socket.socket()
        client.settimeout(0.1)
        try:
            client.connect((hostname, port))
        except socket.timeout:
            print("timeout")
            client.close()
            continue
        else:
            print("连接成功!")
            # 可以通过tkinter的after方法更新UI
            root.after(0, lambda: status_label.config(text="已连接"))
            client.close()
            break

# 初始化UI
root = tk.Tk()
status_label = tk.Label(root, text="正在尝试连接...")
status_label.pack()

# 启动连接线程
threading.Thread(target=connect_loop, daemon=True).start()

root.mainloop()

这样既能实现循环重试连接,又不会让UI卡住。

内容的提问来源于stack exchange,提问作者CRS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:22:28