2017-08-31 36 views
0

我正在使用winsock2在websocket服務器上(使用C++)。眼下,I'm響應初始握手從客戶端(瀏覽器在我的情況),然後I'm從客戶端發送的數據:WebSocket,解碼數據幀(C++)

socket.send("Hello!"); 

我正嘗試將數據幀,但I'm解碼有幾個問題。讓我們來看看代碼:

int GetBit(const char * data, unsigned int idx) 
{ 
    unsigned int arIdx = idx/4; 
    unsigned int biIdx = idx % 4; 
    return (data[arIdx] >> biIdx) & 1; 
} 

void ParseDataFrame(const char * packet) 
{ 
    int FIN = GetBit(packet, 0); 
    unsigned char OPC = 0; 
    { 
     int opc0 = GetBit(packet, 4); 
     int opc1 = GetBit(packet, 5); 
     int opc2 = GetBit(packet, 6); 
     int opc3 = GetBit(packet, 7); 
     OPC |= (opc0 << 0); 
     OPC |= (opc1 << 1); 
     OPC |= (opc2 << 2); 
     OPC |= (opc3 << 3); 
    } 
    int MASK = GetBit(packet, 5); 
} 

I'm越來越:

FIN = 1 
OPC = x6 (can´t be) 
MAKS = 0 (can´t be) 

從來就一直在讀通過WS協議,也許這個問題是在我的代碼。 在此先感謝!

編輯

我想提一提的是,連接正確建立,因爲在控制檯(鉻)沒有錯誤和socket.onopen事件被調用。

+0

能否請您給我們至少前8個項目的內容在'爲const char * packet',然後告訴我們你預期在'OPC'和'MASK'中看到 – KompjoeFriek

+0

MASK應該是1(屏蔽)和OPC x1(文本)。前8個字符:「-127,-122,-85,-60,-77,-32,-29,-95」。 (用std :: cout <<(int)packet [i] << std :: endl'打印它們) – Nacho

回答

2

您的數據看起來不錯,第一個字節(dec爲-127或0x81或1000 0001)。

GetBit閱讀使用每字節4位的8

biIdx代替目前開始在最右位要到最左位。這應該是相反的:

int GetBit(const char * data, unsigned int idx) 
{ 
    unsigned int arIdx = idx/8; 
    unsigned int biIdx = idx % 8; 
    return (data[arIdx] >> (7 - biIdx)) & 1; 
} 

這應該得到你正確的位。

對於MASK,你應該閱讀第8位。按規定:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers

+0

是的,MASK中的5是一個錯誤!感謝您指出!通過使用每字節8位,你的意思是我必須改變我的GetBit方法? (用8替換4)謝謝 – Nacho

+0

是的,在'GetBit'中用'8'代替'4'。我忘了'biIdx',它現在從最右邊的位開始到最左邊的位。這應該是相反的方式。你可以這樣做︰'unsigned int biIdx = 7 - (idx%8);' – KompjoeFriek

+0

謝謝,我也不得不扭轉其他的'OPC | ='這是另一種方式:) – Nacho