Тема: Websoket fragments
Показать сообщение отдельно
  #1 (permalink)  
Старый 14.06.2018, 10:27
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

Websoket fragments
Час добрый гуру! Есть кто тут работал над реализацией "веб" сокет сервера? Ни как не могу победить эти фреймы. Делаю всё следуя спецификации. Но у меня всё равно возникают сложнасти. Вот к примеру
let finmes: number = (data[0] & 0x80) >>> 7    // 0 or 1 - fragment in message
    let opcode: number = (data[0] & 0x0f)              // 0x0 | 0x1 | 0x2 | ...
    let optype: string = getOpcodeType(opcode)     // frame | text | ...
    let ismask: number = (data[1] & 0x80) >>> 7    // 0 or 1
    let length: number = (data[1] & 0x7f)
    let offset: number = 2 // info

    // read 16 bit
    if (length === 0x7e) {
        length = getLength16(data, offset) 
        offset = offset + 2 // length
    }

    // read 32 bit
    if (length === 0x7f) {
        length = getLength32(data, offset) 
        offset = offset + 8 // length
    }
    
    let mask: Buffer = data.slice(offset, offset + 4)
    offset = offset + 4 // mask

    let body: Buffer = data.slice(offset)
    for (let i = 0; i < body.length; i ++) 
        body[i] ^= mask[i & 3]


И вроде бы всё хорошо работает, но только при условии, если запрос не фрагментирован. Т.е. если прилетает 2 и более, естественно ошибка.

Смотрел как реализован socketio & websocketjs, там же в целом путаюсь на каждом шагу. Не могу понять зачем выполнять чтение циклично и неужели последующие фреймы могут прервать выполнение цикла? В общем, простите мне мою безолаберность от того и пишу тут.

Ну и ладно, проблема скорее в другом. Начал смотреть только FIN & OPCODE, в документации пишут: В случае если фреймов 2 и более то только у последнего фрейма будет FIN = 1, у первых же FIN = 0. Мне с вебморды прилетает всегда по разному, т.е. 1 - 3 могут придти с FIN = 1. А все остальные с FIN = 0. Т.е. бог с ним, с началом, как узнать где конец если последний приходит с FIN = 0? А если верить документации то должен приходить с FIN = 1. Т.е. если запрос из 5ти фрагметов, закономерно FIN должен выглядеть так: FINS = [0, 0, 0, 0, 1] - так ведь? А мне приходит по разному, может [1, 1, 1, 0, 0], может и [1, 0, 0, 1, 0] и даже так [0, 0, 0, 1, 0]. Так же, только у первого указан OPCODE, в моём случае произвольно, где то есть а где то нет.

Буду очень благодарен участникам! 4ый день бьюсь.

Последний раз редактировалось stweet, 21.06.2018 в 11:47.
Ответить с цитированием