へろ。私は C++ Websocket ライブラリに取り組んでいます。奇妙な問題が 1 つ現れるまでは、すべて問題ありませんでした。
int n = 0, n_add = 0;
char *buf = (char*)malloc(BUFLEN);
char new_buffer[4096];
while ((n = recv(client_id, buf, BUFLEN, 0)) > 0) {
strcat(new_buffer, buf);
int new_buffer_length = strlen(new_buffer);
int buf_length = strlen(buf);
n_add+= n;
// debug
cout << "buf: '" << buf << "'" << endl;
cout << "new_buffer_length: '" << new_buffer_length << "'" << endl;
cout << "buf_length: '" << buf_length << "'" << endl;
cout << "n: '" << n << "'" << endl;
cout << "n_add: '" << n_add << "'" << endl;
memset(buf, '\0', BUFLEN);
if (n_add == new_buffer_length && n < BUFLEN) {
cout << "new_buffer: '" << new_buffer << "'" << endl;
// if client is already connected
if (ws_clients[client_id][2] == WS_READY_STATE_OPEN) {
this->ws_client_message(client_id, new_buffer, new_buffer_length);
}
// if client needs a handshake
if (ws_clients[client_id][2] == WS_READY_STATE_CONNECTING) {
this->ws_client_handshake(client_id, new_buffer);
}
memset(&new_buffer, '\0', 4096);
n_add = 0;
FD_ZERO(&this->tmp_fds);
}
}
ハンドシェイクは、126 未満のペイロードと同様に完全に行われます。それが起こると、次のようになります。
buf: 'þ'
new_buffer_length: '2'
buf_length: '2'
n: '128'
n_add: '128'
buf: '½HÆA¯J'
new_buffer_length: '8'
buf_length: '6'
n: '6'
n_add: '134'
n は、128 バイトを受信したことを示していますが、実際には 2 だけです。2 回目には 6 バイトが返され、それらは問題ありません。128 に制限されている BUFLEN を 2 に変更すると、最後のループを除いて、実際のペイロード長である 134 に到達することはありません。
わかりましたので、誰もが何か考えがあれば、私はhttp://www.websocket.org/echo.htmlをテストに使用しています。すべてを試しました。ヒントを教えてください