Установка тайм-аута через socket.settimeout учитывается в примечании connect_ex при попытке разрешить ошибки случайного соединения, отклоненные.
Недавно заметил, что Python 3.5.3, работающий на Raspbian OS 9 (Stretch), то есть Debian на Raspberry Pi, использующий сокеты TCP, мгновенно возвращается в виде серии ошибок 111 и 103 несколько раз, прежде чем получить хорошее соединение без изменений кода в последнее время. , Серверная сторона принимает соединения, как и ожидалось, когда соединение действительно происходит. Кажется, какое-то недавнее изменение кода в ОС или python3 сделало последовательность соединений менее прощающей? Но неприятная проблема заключается в том, что я не могу изменить время ожидания для соединения, поэтому сделайте соединение более щадящим.
theSocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
theTimeOut=socket.getdefaulttimeout()
theSocket.settimeout(5.0)
theResult=theSocket.connect_ex((theHost, thePort))
theSocket.settimeout(theTimeOut)
Тестирование с помощью приведенного выше кода Я получаю один из двух сценариев ... соединение устанавливается, как и ожидалось, практически мгновенно, результат равен нулю. Это происходит примерно в 50% случаев. Другой сценарий заключается в том, что я получаю повторные ошибки сокетов 111 и 103, и при отсутствии соединения эти ошибки возвращаются мгновенно, а не через 5 секунд, как ожидалось.
Я обрабатывал сбои соединения простым циклом, и, как правило, если мне не удается немедленно установить соединение, требуется от 1 до 7 попыток (с ожиданием в 1 секунду), чтобы установить хорошее соединение. Быстрые или медленные соединения, если хотите, кажутся совершенно случайными. Наблюдая за «верхом», Raspberry Pi почти полностью бездействует… никаких проблем с шипами или загрузкой.
Прием вызова на серверном процессе гудит без каких-либо ошибок или проблем, я никогда не сбрасываю и не теряю никаких данных после установления соединения. Это просто начальный запрос на соединение, если хотите, где я вижу это очень странное поведение.
Какой код, который я знаю, работает, но это действительно грубое решение, которое я бы хотел избежать.
Да, и у syslog, dmesg и т. Д. Нет явных или четких указаний на какие-либо проблемы. Загрузка полностью чистой копии Raspbian OS, результат того же поведения. Нет настроек брандмауэра или безопасности, применимых в зависимости от конфигурации системы. Такое поведение происходит на нескольких устройствах, работающих под управлением одной и той же версии ОС и Python 3.5.3 (последняя полностью исправлена).