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可以正常运作了。


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

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


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

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值