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发送消息后自动断开的问题的主要内容,如果未能解决你的问题,请参考以下文章
Websocket PHP:从客户端发送到服务器的立即断开连接和奇怪的消息字符串