Python-WebSocket数据长度超过某个值时WebSocket连接崩溃

时间:2018-12-04 09:15:28

标签: python websocket

1.websocket实现:来自github的名为dwebsocket的python软件包,该软件包基于旧版本的django,因此wsgi应用程序是由django创建的(似乎websocket服务器的python2.7没有太多选择实施)

2.wsgi服务器:gevent.wsgi.WSGIServer

3。我们从服务器向客户端发送测试数据'x'*2**17,(c2似乎相同)

4。行为:客户端遇到异常并得到Could not decode a text frame as UTF-8,并且连接被关闭。 (在浏览器Devtools网络ws框架中为Opcode -1

  • 关于网络数据包:

    似乎在不同长度的机器上有不同的油门会导致崩溃,在某些机器2 ** 16足以导致崩溃,无论如何,我使用'x'*2**17进行测试,并且我在两侧都使用了wireshark进行捕获数据包,在服务器端有时无法捕获任何数据(因此没有发送?),有时会散发出大量分散的ws数据包,如下所示:

    WebSocket 0... .... = Fin: False .111 .... = Reserved: 0x07 .... 1000 = Opcode: Connection Close (8) 0... .... = Mask: False .111 1000 = Payload length: 120 Payload Close: 787878787878787878787878787878787878787878787878... Close: Unknown (30840) Reason: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  • 关于代码:

    我跟踪了dwebsocket代码,并没有发生任何异常(非常确定),也就是说,直到它进入gevent.socket.send,里面是python raw socket,代码如下:

    sock = self._sock if timeout is timeout_default: timeout = self.timeout try: return sock.send(data, flags) 仍然没有例外,一切都在此之后完成

  • 一些简单的测试

    试图使用https://pypi.org/project/WSGIserver/替换gevent的WSGIServer,问题仍然存在。所以我想这与wsgi服务器无关。

    尝试将著名的websocketd用于简单的服务器,并且效果很好。

无论如何,我认为问题出在websocket实现dwebsocket上,但是我不知道如何进一步检查它,对tcp事情一无所知。

12月17日更新:针对Websocket服务器尝试了autobahn,它确实运行良好,可能dwebsocket中为套接字打包的数据有误,我稍后会检查

0 个答案:

没有答案