бит плавника websocket в c ++

0

im ', имея в последнее время небольшую проблему с битными плавниками на основе websockets и моим c++ сервером. Всякий раз, когда я пытаюсь использовать FIN = 0, хост передает соединение без причины. Вот часть моего кода для расчета FIN:

string ret
ret += (unsigned char)((fin & 1) << 7) | (opcode & 63);

Когда я использую FIN = 1, мой первый байт в кадре равен 129, что является правильным, и пользователь получает правильный ответ. С FIN = 0 первый байт равен 1, что также кажется хорошим, а затем после отправки соединения падает. Пробовал отправлять те же пакеты данных с обоими флагами и только FIN = 0 терпит неудачу;

Почему я пытаюсь использовать FIN = 0? хорошо, я пытаюсь сделать небольшую игру three.js + websocket, я бы хотел, чтобы сервер отправлял все модели через websocket для каждого игрока, поэтому я ожидаю большую нагрузку, которую я бы хотел контролировать.

Я был бы рад предоставить любую дополнительную информацию.

Заранее спасибо.

  • 0
    Я не думаю, что кто-то может помочь вам без полного отправленного сообщения. Скорее всего у вас какая-то ошибка протокола. Кроме того: FIN = 0 не обязательно поможет вам с большой нагрузкой. Это только позволяет вам сегментировать большие сообщения в меньшие сообщения. В любом случае, если вы отправляете только небольшие сообщения, это не поможет, но вместо этого создаст еще большую нагрузку из-за дополнительных накладных расходов кадра продолжения.
Теги:
websocket

1 ответ

1
Лучший ответ

Я понятия не имею о C++, но я немного разбираюсь в WebSockets.

Какое значение у вас есть в другом байте? Когда вы отправляете фрейм FIN = 0, вам все равно нужно отправить в него параметры фрейма. Последующие кадры должны иметь опцию "Продолжение", и больше ничего. Насколько я помню, в кадрах продолжения даже не могут быть бит RSV, отличный от 0.

Если вы отправляете фрейм с FIN = 0 без типа (текстового или двоичного), он, вероятно, сработает. Если вы отправляете FIN = 1 с типом, отличающимся от "Продолжение" после завершения FIN = 0.

Итак, ключ в том, что вы отправляете во второй байт? Кроме того, было бы здорово, если вы попытаетесь с Google Chrome и проверьте консоль, почему соединение отключено.

  • 0
    Слава Господу, это работает! после вашего ответа я вернулся к спецификации, и она вышла, я действительно испортил код операции. Для всех, кто использует Websockets и несколько сообщений: первый байт сообщения должен быть 1 (fin = 0; код операции = 1 для текстового сообщения), остальные должны быть 0 (продолжение) и последние 128 (fin = 1; код операции = 0 для продолжения сообщения). Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню