Arhn - архитектура программирования

Сокет Python не истечет время ожидания

У меня проблема с модулем сокета Python, которую я не смог найти больше нигде.

Я создаю простой чат-клиент TCP, и хотя он изначально успешно подключается к серверу, скрипт бесконечно зависает на sock.recv(), несмотря на то, что я явно установил время ожидания.

Я пытался использовать разные значения времени ожидания и включать setblocking(False), но независимо от того, что я делаю, он продолжает действовать так, как будто сокет находится в режиме блокировки.

Вот соответствующие части моего кода:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)

def listen_to_server():
    global connected

    while connected:
        ready_to_read, ready_to_write, in_error = select.select([sock], [], [])

        if ready_to_read:
            try:
                data = sock.recv(1024)
            except socket.timeout:
                print('TIMEOUT')
            if not data:
                append_to_log('Disconnected from server.\n')
                connected = False
            else:
                append_to_log(str(data))

Любые предложения будут полезны, я здесь в полной растерянности.

11.07.2017

  • Я не уверен, почему тайм-аут не работает, но ваш первый оператор if должен быть таким: if sock in ready_to_read: 11.07.2017
  • Мне интересно, socket.bind() не должен вызываться в какой-то момент? 11.07.2017
  • Кроме того, если вы используете timeout, сокет должен находиться в режиме блокировки. 11.07.2017
  • @Dziugas Я считаю, что socket.bind() для серверной части. Для клиента я использую socket.connect(), который я пропустил во фрагменте, потому что не думаю, что это имеет значение. Также у меня сложилось впечатление, что режим блокировки подразумевает, что программа останавливается до тех пор, пока данные не будут получены из сокета, без тайм-аута. 11.07.2017
  • @JeremyFriesner Спасибо за совет! 11.07.2017
  • Вы абсолютно правы, я невнимательно прочитал вопрос. 11.07.2017

Ответы:


1

Вы смешали две вещи socket timeout и select.

Когда вы устанавливаете socket timeout, вы сообщаете этому сокету: если я попытаюсь выполнить какую-то операцию (например, recv()), и она не будет завершена до моего предела, тогда поднимите исключение тайм-аута.

select принимает файловые дескрипторы (в Windows только сокеты) и начинает проверять, содержит ли rlist (первый параметр) какой-либо сокет, готовый к чтению (то есть какие-то данные поступили). Если какие-либо данные поступили, программа продолжается.

Теперь ваш код делает это:

  1. Установить тайм-аут для операций сокета
  2. Выберите начать ожидание данных (если вы их не отправите, они никогда не поступят)

и это все. Вы застряли на выборе.

Вы должны просто вызвать recv() без выбора. Чем ваш тайм-аут должен быть применен.

Если вам нужно управлять несколькими сокетами одновременно, вам нужно использовать select и установить тайм-аут 4-го параметра.

11.07.2017
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..