Python socket .connect () «Указан неверный аргумент» (OSError: [WinError 10022]) - PullRequest
0 голосов
/ 30 января 2019

При создании клиента из модуля сокетов 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

По общему признанию, эта ошибка появилась только один раз, когда истекло время ожиданиябыл представлен.Как видно из выходных данных, время ожидания успешно истекло один раз, но при второй повторной попытке это не удалось.

Я проверил переменные hostName и port после истечения времени ожидания, однако они не изменились (как они должны't).

Единственная причина, по которой система находится в цикле с тайм-аутом, заключается в том, что я также использую модуль tkinter для пользовательского интерфейса и хочу, чтобы пользовательский интерфейс постоянно обновлялся, чтобы программа не работала.т перестать отвечать.Все, что я хочу - это попытка подключения, если оно истекло.

Что я делаю не так?

1 Ответ

0 голосов
/ 30 января 2019

Вы запускаете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...