将Textframe发送到WebSocket echo-server

时间:2015-12-29 13:38:46

标签: c++ tcp websocket binary binary-data

我正在用C ++编写WebSocket实现。它现在几乎完成了,我想针对这个WebSocket echo-server进行测试。首先,我在HTTP-Handshake中将它连接到Upgrade到WebSocket-Protocol。

然后我发送一个文本框架,其中“这是一个测试”作为内容。这就是我的程序发送的内容:

FRRR-OP- M-LENGTH MASK-KEY
10000001 10001110 00000100 

MASK-KEY MASK-KEY MASK-KEY
01000101 11010000 01101011 

--DATA-- --DATA-- --DATA--
01010000 00101101 10111001 

--DATA-- --DATA-- --DATA--
00011000 00100100 00101100 

--DATA-- --DATA-- --DATA--
10100011 01001011 01100101 

--DATA-- --DATA-- --DATA--
01100101 10000100 00001110 

--DATA-- --DATA--
01110111 00110001 

我会快速解释这些信件:

  • F 表示这是邮件中的最终片段(引用RFC6455)
  • RRR :RSV1,RSV2,RSV3。始终为0,除非使用扩展名。
  • -OP - :操作代码。操作代码1 =短信
  • M :表示数据是否被屏蔽。 1 =它被掩盖了。
  • -LENGTH :数据的字节长度(不包括 MASK-KEY)。
  • MASK-KEY :用于加密数据的密钥。总是4字节长。

来自RFC6455

  

将屏蔽数据转换为未屏蔽数据,反之亦然   应用以下算法。适用相同的算法   不管翻译的方向如何,例如相同   应用步骤来屏蔽数据以取消屏蔽数据。

     

转换数据的八位字节(“transformed-octet-i”)是异或   具有八位位组的原始数据(“original-octet-i”)的八位位组i   index i模数4的掩码密钥(“masking-key-octet-j”):

 j                   = i MOD 4
 transformed-octet-i = original-octet-i XOR masking-key-octet-j
  • 数据:加密数据(“这是测试”)

发送此帧后, echo-server 需要很长时间才能响应( ~45秒),这就是我得到的数据:

FRRR-OP- M-LENGTH --DATA--
10000001 00001110 01010100

--DATA-- --DATA-- --DATA-- 
01101000 01101001 01110011

--DATA-- --DATA-- --DATA-- 
00100000 01101001 01110011

--DATA-- --DATA-- --DATA-- 
00100000 01100001 00100000

--DATA-- --DATA-- --DATA-- 
01010100 01100101 01110011

--DATA-- --DATA-- --DATA-- 
01110100 10001001 00000000

将数据转换为字符串会产生此结果。

This is a Test‰

所以这里出了点问题。它不能是错误的OP-Code,因为服务器会响应。加密不能错,因为服务器可以解密数据。如何看,长度也没错。但是,很奇怪服务器需要很长时间才能响应。好像它正在等待更多数据的到来。

1 个答案:

答案 0 :(得分:0)

最后两个字节(1000100100000000)是ping frame,没有有效负载。