2015-03-26 2 views
2

У меня возникла проблема с отладкой моего кода, потому что я не могу понять, что ошибка сокета возникает. Вот трассировка.Соединитель Python ConnectionResetError: [Errno 54] Сброс соединения с помощью peer vs socket.error: [Errno 104] Сброс соединения с помощью peer

Traceback (most recent call last): 
File "clickpression.py", line 517, in <module> presser.main() 
File "clickpression.py", line 391, in main 
File "clickpression.py", line 121, in clickpress self.refresh_proxies(country=country) 
File "clickpression.py", line 458, in refresh_proxies self.proxies = self.get_proxies(country=country) 
File "helpers.py", line 72, in wrapper return func(*args, **kwargs) 
File "clickpression.py", line 264, in get_proxies self.settings.SUPER_PROXY).read().decode('utf-8') 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 161, in urlopen return opener.open(url, data, timeout) 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 463, in open response = self._open(req, data) 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 481, in _open '_open', req) 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 441, in _call_chain result = func(*args) 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 1210, in http_open return self.do_open(http.client.HTTPConnection, req) 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 1185, in do_open r = h.getresponse() 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/client.py", line 1171, in getresponse response.begin() 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/client.py", line 351, in begin version, status, reason = self._read_status() 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/client.py", line 313, in _read_status line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1") 
File "/usr/local/Cellar/python3/3.4.3/Frameworks/Python.framework/Versions/3.4/lib/python3.4/socket.py", line 374, in readinto return self._sock.recv_into(b) 
ConnectionResetError: [Errno 54] Connection reset by peer 

Согласно errno библиотеке Errno 54 является errno.EXFULL, который в Python 3 documentation объясняется как exchange full.

Насколько я понимаю, Connection reset by peer является Errno 104 i.e errno.ECONNRESET.

Так что же означает errno.EXFULL? и почему сокет вызывает ошибку с описанием connection reset by peer вместо exchange full. А также, как связаны две ошибки errno.EXFULL и errno.ECONNRESET?

PS: I что errno 54 может быть связано с http proxy (я использую прокси-сервер в своем коде). Если да, то как?

ответ

0

According to the errno library Errno 54 is errno.EXFULL

Вы определили это, изучив errno.errorcode[54]? В любом случае - это errno библиотека может быть виновата. Вы можете проверить значение кода ошибки в своей системе, просмотрев errno.h, e. г. с помощью gcc:

gcc -xc -imacros errno.h -Wp,-P -E <(echo ECONNRESET) 

Кроме того, Python documentation говорит:

To translate a numeric error code to an error message, use os.strerror().

Это может быть, что номер ошибки 54 является ECONNRESET в вашей системе, и что os.strerror(54) подтвердит это.

Теперь, когда вы убедились, что os.strerror(54) возвращает «Обмен полный», я озадачен, почему число 54 ошибки и строка ошибки Connection reset by peer не совпадают. Если это произойдет в системе с strace или чем-то аналогичным, я бы дополнительно проверил, какая ошибка возвращается операционной системой, используя strace -e network в отношении затронутого процесса.

Что касается вашего вопроса об EXFULL: его смысл кажется несколько зависящим от системы; е. г. на Linux EXFULL возвращается только из небольшого количества мест в ядре, единственное место в сети, которое находится в br_if.c, касающееся сетевых мостов, когда нет доступного номера порта моста (другие места находятся в драйверах USB и SCSI).

+0

Вы не ответили на мои вопросы – mattgathu

+0

Право - вместо этого я показал способы проверить, являются ли ваши вопросы правильными, поскольку очень сомнительно, имеет ли показанная трассировка какое-либо отношение к EXFULL. – Armali

+1

в моей системе os.strerror (54) возвращает 'Exchange full' и os.strerror (104) - это 'reset connection by peer' – mattgathu

-1

Вы можете попробовать этот код в ваш проект:

import ssl 
ssl._create_default_https_context = ssl._create_unverified_context 

, если он не работает, убедитесь, что сервер открытой поддержки TLSv1.

Смежные вопросы