【问题标题】:Python socket .connect() "An invalid argument was supplied" (OSError: [WinError 10022])Python socket .connect()“提供了一个无效的参数”(OSError:[WinError 10022])
【发布时间】:2019-01-30 18:00:23
【问题描述】:

在使用 Python 的 socket 模块创建客户端时,我遇到了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 不断更新,这样程序就不会停止响应。我只想让连接在超时时重试。

我做错了什么?

【问题讨论】:

  • hostname的值是多少?

标签: python windows


【解决方案1】:

你在 same 套接字对象上触发connect() 太快了(请不要询问内部结构,但套接字还没有准备好重新连接)。

至少有 2 个选项可以解决此问题:

选项 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)基本相同。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2020-12-30
    • 1970-01-01
    • 2016-08-12
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多