WebSocket发送消息后自动断开的问题

Posted 雷乌斯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket发送消息后自动断开的问题相关的知识,希望对你有一定的参考价值。

websocket与C++后端握手成功,server端能正常解析出client发来的数据,但是组包之后发回给client,client立刻断开websocket。

我之前使用flashAIR写的server端并没有遇到这个问题,而改用C++后就会出现。

Chrome控制台报错:

websocket A server must not mask any frames that it sends to the client.

截图如下:


这个例子里我只是简单地发送一个数字给server,然后server再原封不动返回给client,本意是用来计算一下延迟的。


简单的搜索后,得到的信息是:

在Websocket里,server发回给client的数据是不需要掩码的,如果加了掩码就会出现这个错误


但是我没有加掩码啊!


我对AS版的Server和C++版的Server分别使用Fiddler抓包后得到同样的数据



可以看到网页和我的后端分别有一个5字节长度的往来。

客户端发送的是00-01-08-E7-07,

服务端发生的是00-02-08-E7-07,

第二个数不同是因为我用了protobuf来封装消息,PING的opcode是1,PONG的opcode是2,具体内容是一样的。


这tm就很尴尬了啊,2个版本的服务端发的数据是一样的,但是 后者直接被浏览器断开了WebSocket连接。


今天先保存草稿到这里,明天再接着找毛病。


----------------------------------------更新解决方案------------------------------------------------


因为fiddle抓取到的数据包其实是它自己已经做过一次解析了的,他识别了我的包是Websocket包,把数据帧的头都解读并且隐藏起来了,只显示了实际的应用数据。

于是我今天用RawCap加Wireshark来抓包,把往来的所有数据都一字不漏地过一遍,既然只有C++出问题,那返回的内容肯定幽鬼


AS3版的抓包结果:

目测了一下,500和222分别是握手包,11和7应该是握手成功后的第一个消息往来,C++的情况下在7发送成功后就挂了。

接着是

C++版的抓包结果:



WTF?为什么握手的返回包多了1个字节?


再看多出来的,是个00,于是我回去看C++的代码,返回握手包的地方写的是:

m_socket->getSendCache().Append(resp.c_str(), resp.size() + 1);

因为我自己加了一个结尾的'\\0'进去,于是把+1删掉,再次调试,websocket可以正常运作了。


虽然握手成功了,但握手包写错了。

虽然数据包报错了,但数据包是对的。


怪不得找一晚上没发现毛病。。。

以上是关于WebSocket发送消息后自动断开的问题的主要内容,如果未能解决你的问题,请参考以下文章

2018-03-26(websocket自动断开连接)

Websocket PHP:从客户端发送到服务器的立即断开连接和奇怪的消息字符串

请教html5的websocket无缘无故客户端主动断开原因

websocket检测服务器是否断开-来游戏手游解答

WebSocket 断线重连引入心跳的原因

uni-app中websocket的使用 断开重连、心跳机制