Подтвердить что ты не робот

Ошибка ввода-вывода (ошибка сокета): [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 не очень полезен, я получил от него то, что сервер Я получаю от того, что иногда отказывается от соединений, как я могу проверить его не ошибку в моем коде и это действительно так?

4b9b3361

Ответ 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

Он вернет , подключенный к локальному хосту, поэтому он указывает, что с соединением нет проблем  Иначе он вернет Отклонено соединение, это указывает на наличие проблемы с подключением