Python socket .connect()“提供了无效的参数”(OSError:[WinError 10022])

时间:2019-01-30 09:22:53

标签: python windows

在使用Python的套接字模块创建客户端时,我遇到OSError: [WinError 10022] An invalid argument was supplied,我对其原因和如何管理感到困惑。

关于它的价值,我使用的是Windows 10。

简而言之,目标代码围绕连接过程进行:

import socket

client = socket.socket()

hostname = socket.gethostname()
port = 50007

while (True):
    client.settimeout(0.1)

    try:
        client.connect((hostname, port))

    except socket.timeout:
        print("timeout")
        continue

    else:
        . . . 

哪个返回:

timeout
Traceback (most recent call last):
  File "C:/testClient.py", line 12, in <module>
    client.connect((hostname, port))
OSError: [WinError 10022] An invalid argument was supplied

诚然,仅在引入超时内容后才出现此错误。如输出所示,它成功超时一次,但第二次重试失败。

在超时后,我已经检查了hostNameport变量,但是它们没有变化(应该不变)。

我使系统处于超时循环的唯一原因是因为我还将tkinter模块用于用户界面,并且我希望UI不断更新,以便程序不会停止响应。我只想让连接在超时时重试。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

您要在相同套接字对象上触发connect()太快(请不要问内部问题,但是套接字还没有准备好重新连接)。 / p>

至少有两种方法可以解决此问题:

选项1-两次尝试之间进入睡眠状态

import socket
import time

address = (socket.gethostname(), 50007)
client = socket.socket()
client.settimeout(0.1)

while (True):
    try:
        client.connect(address)
    except socket.timeout:
        print("timeout")
        time.sleep(1)

选项2-为每次尝试创建一个新的套接字

import socket

address = (socket.gethostname(), 50007)

while (True):
    client = socket.socket()
    client.settimeout(0.1)
    try:
        client.connect(address)
    except socket.timeout:
        print("timeout")

选项3-使用connect_ex()

import socket

address = (socket.gethostname(), 50007)
client = socket.socket()
client.settimeout(0.1)

while (True):
    res = client.connect_ex(address)
    if(res != 0):
        print("Error / timeout", res)

尽管选项3与您初次尝试并仅捕获所有异常,而不仅仅是socket.timeout相同。