Ошибка ввода-вывода (ошибка сокета): [Errno 111] Соединение отклонено
У меня есть программа, которая использует urllib для периодического получения URL-адреса, и я вижу прерывистый
такие ошибки, как:
Ошибка ввода-вывода (ошибка сокета): [Errno 111] Соединение отклонено.
Он работает 90% времени, но он не работает. Если повторить выборку сразу после ее отказа, она будет успешной. Я не могу понять, почему это так. Я попытался выяснить, доступны ли какие-либо порты, и они есть. Любые идеи отладки?
Для получения дополнительной информации трассировка стека:
File "/usr/lib/python2.6/urllib.py", line 203, in open
return getattr(self, name)(url)
File "/usr/lib/python2.6/urllib.py", line 342, in open_http
h.endheaders()
File "/usr/lib/python2.6/httplib.py", line 868, in endheaders
self._send_output()
File "/usr/lib/python2.6/httplib.py", line 740, in _send_output
self.send(msg)
File "/usr/lib/python2.6/httplib.py", line 699, in send
self.connect()
File "/usr/lib/python2.6/httplib.py", line 683, in connect
self.timeout)
File "/usr/lib/python2.6/socket.py", line 512, in create_connection
raise error, msg
Изменить. Поиск Google не очень полезен, я получил от него то, что сервер
Я получаю от того, что иногда отказывается от соединений, как я могу проверить его не ошибку в моем коде
и это действительно так?
Ответы
Ответ 1
Используйте сниффер пакетов, например Wireshark, чтобы посмотреть, что произойдет. Вам нужно увидеть исходящий SYN-флаг, входящий в SYN + ACK, а затем отключенный по ACK-исходящий. После этого порт считается открытым с локальной стороны.
Если вы видите только первый пакет, и сообщение об ошибке появляется после нескольких секунд ожидания, другая сторона не отвечает вообще (например, в: отсоединен кабель, перегруженный сервер, ошибочный пакет был отброшен), а ваш сетевой сетевой стек прерывается попытка подключения. Если вы видите пакеты RST, хост фактически отрицает соединение. Если вы видите "недоступный ICMP-порт" или недоступные для хоста пакеты, брандмауэр или целевой хост информируют вас о том, что порт фактически закрыт.
Конечно, вы не можете ожидать, что служба будет доступна в любое время (рассмотрите все точки сбоя между вами и данными), поэтому вы должны попробовать еще раз позже.
Ответ 2
Получение ECONNREFUSED errno означает, что вашему ядру было отказано в подключении на другом конце, поэтому, если это ошибка, это либо в вашем ядре, либо в другом конце.
То, что вы можете сделать, - это уловить ошибку очень определенным образом и повторить попытку через некоторое время, поскольку это, похоже, работает:
# This is Python > 2.5 code
import errno, time
for attempt in range(MAXIMUM_NUMBER_OF_ATTEMPTS):
try:
# your urllib call here
except EnvironmentError as exc: # replace " as " with ", " for Python<2.6
if exc.errno == errno.ECONNREFUSED:
time.sleep(A_COUPLE_OF_SECONDS)
else:
raise # re-raise otherwise
else: # we tried, and we had no failure, so
break
else: # we never broke out of the for loop
raise RuntimeError("maximum number of unsuccessful attempts reached")
Замените две константы всех шапков на ваши любимые номера.
Ответ 3
У меня была эта проблема с моим экземпляром EC2 (я служил couchdb для обслуживания ресурсов - я рассматриваю Amazon S3 для будущего).
Одна вещь, чтобы проверить (при условии Ec2), состоит в том, что порт couchdb добавляется в ваши открытые порты в вашей политике безопасности.
Я специально встретился
"[Errno 111] Соединение отклонено"
над EC2, когда экземпляр был остановлен и запущен. Проблема, похоже, в гонке pidfile. Решение для меня было убить couchdb (полностью и правильно) через:
pkill -f couchdb
а затем перезапустите с помощью:
/etc/init.d/couchdb restart
Ответ 4
Я не совсем уверен, что вызывает это. Вы можете попробовать искать в своем сокете. (Моя - другая версия, поэтому номера строк из трассы не совпадают, и я боюсь, что некоторые другие детали могут не совпадать).
Во всяком случае, кажется хорошей практикой поместить ваш код ввода URL в блок try: ... except: ...
и обработать его с помощью короткой паузы и повторной попытки. URL-адрес, который вы пытаетесь извлечь, может быть опущен или слишком загружен, и все, что вы сможете обработать с помощью повторной попытки.
Ответ 5
Кажется, что сервер работает неправильно, поэтому убедитесь, что с терминалом
telnet ip port
Пример
telnet localhost 8069
Он вернет , подключенный к локальному хосту, поэтому он указывает, что с соединением нет проблем
Иначе он вернет Отклонено соединение, это указывает на наличие проблемы с подключением