diff --git a/a8/websocketclient.cc b/a8/websocketclient.cc index 0dae9cb..3b3ccd3 100644 --- a/a8/websocketclient.cc +++ b/a8/websocketclient.cc @@ -145,19 +145,25 @@ namespace a8 } unsigned char szbuff [1024 * 65]; szbuff[0] = FIN | BINARY_MODE | 0; - if (bufflen < 126) { - szbuff[1] = bufflen; - memmove(szbuff + 2, buff, bufflen); - tcp_client_->SendBuff((char*)szbuff, bufflen + 2); - } else if (bufflen <= 0xFFFF) { - szbuff[1] = 126; - szbuff[2] = (bufflen >> 8) & 0xFF; - szbuff[3] = bufflen & 0xFF; - memmove(szbuff + 4, buff, bufflen); - tcp_client_->SendBuff((char*)szbuff, bufflen + 4); + int mask_offset = 2; + int payloadlen = bufflen; + if (payloadlen < 126) { + szbuff[1] = payloadlen | 0x80; + mask_offset = 2; + } else if (payloadlen <= 0xFFFF) { + szbuff[1] = 126 | 0x80; + szbuff[2] = (payloadlen >> 8) & 0xFF; + szbuff[3] = payloadlen & 0xFF; + mask_offset = 4; } else { abort(); } + *((int*)(szbuff + mask_offset)) = rand(); + for (unsigned i = 0; i < bufflen; ++i) { + szbuff[mask_offset + 4 + i] = + ((unsigned char)buff[i]) ^ szbuff[mask_offset + (i % 4)] ; + } + tcp_client_->SendBuff((char*)szbuff, bufflen + mask_offset + 4); } void WebSocketClient::ProcessHandShake(char* buf, int& offset, unsigned int buflen) diff --git a/a8/websocketsession.cc b/a8/websocketsession.cc index a723b98..ae23e27 100644 --- a/a8/websocketsession.cc +++ b/a8/websocketsession.cc @@ -188,6 +188,11 @@ namespace a8 } } + /* + finbit|opcode|falgs + unsigned char header FIN|BINARY_MODE + unsigned char mask_payloadlen + */ void WebSocketSession::DecodeFrame(char* buf, int& offset, unsigned int buflen) { if (offset + 2 > (int)buflen) {