2017-06-22 61 views
0

我想在C++中做一個簡單的websocket服務器。我可以從我的HTML與連接到我的服務器/ JavaScript頁面:簡單的C + + websocket服務器,可以接收郵件,但發送郵件時失敗「失敗:無效幀頭」

socket = new WebSocket("ws://127.0.0.1:6001/websocket"); 

我的服務器得到了如下要求

GET /websocket HTTP/1.1 
Host: 127.0.0.1:6001 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: http://127.0.0.1:6001 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 
DNT: 1 
Accept-Encoding: gzip, deflate, sdch, br 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: 4oyuqbJMJVtGRvVOd8KWKA== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

,我至今與

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: QQphkELDd37KE7awCUPSOhWJI1k= 

回答都不錯。我能夠將消息發送到我的服務器

socket.send("Hello World!"); 

服務器能成功解碼

Received data = ��56A$}S-HZKGZ% 
---- WebsocketMessage ---- 
final  = 1 
rsv1   = 0 
rsv2   = 0 
rsv3   = 0 
optcode  = 1 
masked  = 1 
payload size = 12 
payload  = Hello World! 
-------------------------- 

但是當我試圖從我的服務器發送郵件到我的網頁,我總是得到以下錯誤(鉻控制檯):

WebSocket connection to 'ws://127.0.0.1:6001/websocket' failed: Invalid frame header 

此處,我產生了框架的代碼(這是一個類,所以我會包括下列過的成員變量,所有變量都被初始化更早):

bool    final_msg; 
    bool    rsv[3] = { false, false, false }; 
    int     optcode; 
    bool    masked; 
    unsigned long long payload_size; 

    std::string encode() { 
     std::string msg; 
     msg.push_back(
      (char) (final_msg ? 0x80 : 0x00) | (rsv[0] ? 0x40 : 0x00) | (rsv[1] ? 0x20 : 0x00) | 
       (rsv[2] ? 0x10 : 0x00) | (0x0F & optcode) 
    ); 
     msg.push_back(
      (char) (masked ? 0x80 : 0x00) | (0x7F & payload_size) 
    ); 
     msg += payload; 
     return msg; 
    } 

此功能僅適用於打包郵件< 126字節。嗯,這是假設工作,但根據鉻它似乎並不。下面是測試(PING)消息二進制輸出:

1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 

從規範這應該工作和「socket.onmessage」應該解僱我的網頁上,而不是「onerorr」火光「event.data =未定義」 。

任何人都可以看到我要去哪裏錯了嗎?或者有任何想法如何獲得更有用的信息?謝謝!

+2

這是一個想法...你爲什麼要用'payload_size'來代替'^'(而不是''')? – Myst

+1

掩碼在哪裏? –

回答

0

看起來像我只是做有效載荷大小不正確的編碼。函數應爲:

std::string encode() { 
    std::string msg; 
    msg.push_back(
     (char) (final_msg ? 0x80 : 0x00) | (rsv[0] ? 0x40 : 0x00) | (rsv[1] ? 0x20 : 0x00) | 
      (rsv[2] ? 0x10 : 0x00) | (0x0F & optcode) 
    ); 
    msg.push_back(
     (char) (masked ? 0x80 : 0x00) | (0x7F & payload_size) 
    ); 
    msg += payload; 
    return msg; 
} 

感謝Myst和gre_gor用於發現此問題。

相關問題