javascript — простой сервер веб-сокетов на C ++, может получать сообщения, но не работает с ошибкой & quot; сбой: неверный заголовок кадра & quot; при отправке сообщений

Я пытаюсь сделать простой веб-сокет-сервер на C ++. Я могу подключиться к своему серверу со страницы html / javascript с помощью:

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!
--------------------------

но когда я пытаюсь отправить сообщение со своего сервера на мою веб-страницу, я всегда получаю следующую ошибку (консоль chrome):

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 байтов. Ну, это должно работать, но в соответствии с Chrome это не так. Вот двоичный вывод для тестового сообщения (PING):

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

Из спецификации это должно сработать, и «socket.onmessage» должен сработать на моей странице, вместо «onerorr» с «event.data = undefined».

Кто-нибудь может увидеть, где я иду не так? Или есть идеи, как получить более полезную информацию? Спасибо!

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 за то, что заметили это.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]