Python套接字ConnectionResetError:[Errno 54]连接重置由对等体vs套接字,错误:[Errno 104]连接由对等体重置

jq6vz3qz  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(333)

我在调试代码时遇到了问题,因为我无法理解引发的套接字错误。这里是traceback。

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 54errno.EXFULL,在python 3中,documentation被解释为exchange full
根据我的理解,Connection reset by peerErrno 104,即errno.ECONNRESET
errno.EXFULL是什么意思为什么socket会用connection reset by peer而不是exchange full来引发错误。和/或两个错误errno.EXFULLerrno.ECONNRESET是如何相关的?
PS:我readerrno 54可能与http代理有关(我在代码中使用代理)。如果是,如何进行?

kyks70gy

kyks70gy1#

根据errno库,Errno 54errno.EXFULL
你是通过检查errno.errorcode[54]确定的吗?无论如何-这个 * errno库 * 可能有问题。您可以通过查看errno.h,e来验证系统上错误代码的含义。例如,在gcc的帮助下:

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

Python documentation说:
若要将数字错误代码转换为错误消息,请使用os.strerror()。
在您的系统上,错误号54很可能是ECONNRESET,而os.strerror(54)将证明这一点。
现在您已经验证了os.strerror(54)返回'Exchange full',我很困惑为什么错误号54和错误字符串Connection reset by peer不匹配。如果在使用strace或类似的系统上发生这种情况,我将通过在受影响的进程上使用strace -e network进一步检查操作系统返回的错误。
关于EXFULL的问题:它的含义似乎有些系统依赖性;例如,在Linux上,当没有找到可用的网桥端口号时,EXFULL仅从内核中的少数位置返回,唯一与网络相关的位置是在关于网桥的br_if. c中(其它位置在USB和SCSI驱动器中)。

km0tfn4u

km0tfn4u2#

我尝试使用Python在www.example.com上使用WebSocket创建硬币市场OKEX.com,因为URL是外部地址,我使用了我们提供的VPN服务,但它仍然可以工作。下面是代码的回溯。

from ws4py.client.threadedclient import WebSocketClient

class DummyClient(WebSocketClient):
    def opened(self):
      # self.send("{'event': 'addChannel', 'channel': 'ok_sub_futureusd_btc_ticker_this_week'}") #发送请求数据格式
         # self.send("www.baidu.com")
         self.send("{'event':'addChannel','channel':'ok_sub_spot_bch_btc_ticker'}")
    def closed(self, code, reason=None):
        print("Closed down", code, reason)

#服务器返回消息
    def received_message(self, m):
        print("recv:", m)

if __name__ == '__main__':

    try:
        # 服务器连接地址wss://real.okex.com:10440/websocket/okexapi
       # ws = DummyClient('wss://real.okcoin.cn:10440/websocket/okcoinapi', protocols=['chat'])
        ws = DummyClient('wss://real.okex.com:10440/websocket/okexapi', protocols=['chat'])
        ws.connect()
        #ws.send("my test...")
        ws.run_forever()
    except KeyboardInterrupt:
        ws.close()

pftdvrlh

pftdvrlh3#

你可以在你的项目中尝试以下代码:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

如果不起作用,请确保服务器打开TLSv1支持。

相关问题