Websocket Poco не может получать большие данные

Я загрузил и собрал проект Poco из Poco и запустил проект WebsocketServer в poco-1.7.6 \ Net \ samples \ WebSocketServer.

Когда я работал с небольшими данными размером менее 128 КБ (131072 байта), они работали отлично. Но если я работаю с большими данными (мне нужно отправить 20 МБ), мои данные будут вырезаны, поэтому сервер не получит достаточно данных.

Вот код, который я копирую в проекте:

        WebSocket ws(request, response);
        char *buffer = new char[1000000]; // It just receive 131072 bytes
        int flags;
        int n;
        do
        {
            n = ws.receiveFrame(buffer, sizeof(buffer), flags);
            ws.sendFrame(buffer, tmp.length(), flags);
        } while (n > 0 || (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
        delete[] buffer;

Код дефрейма:

int WebSocketImpl::receiveBytes(void* buffer, int length, int)
{
    char header[MAX_HEADER_LENGTH];
    int n = receiveNBytes(header, 2);
    if (n <= 0)
    {
        _frameFlags = 0;
        return n;
    }
    poco_assert (n == 2);
    Poco::UInt8 lengthByte = static_cast<Poco::UInt8>(header[1]);
    int maskOffset = 0;
    if (lengthByte & FRAME_FLAG_MASK) maskOffset += 4;
    lengthByte &= 0x7f;
    if (lengthByte > 0 || maskOffset > 0)
    {
        if (lengthByte + 2 + maskOffset < MAX_HEADER_LENGTH)
        {
            n = receiveNBytes(header + 2, lengthByte + maskOffset);
        }
        else
        {
            n = receiveNBytes(header + 2, MAX_HEADER_LENGTH - 2);
        }
        if (n <= 0) throw WebSocketException("Incomplete header received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
        n += 2;
    }
    Poco::MemoryInputStream istr(header, n);
    Poco::BinaryReader reader(istr, Poco::BinaryReader::NETWORK_BYTE_ORDER);
    Poco::UInt8 flags;
    char mask[4];
    reader >> flags >> lengthByte;
    _frameFlags = flags;
    int payloadLength = 0;
    int payloadOffset = 2;
    if ((lengthByte & 0x7f) == 127)
    {
        Poco::UInt64 l;
        reader >> l;
        if (l > length) throw WebSocketException(Poco::format("Insufficient buffer for payload size %Lu", l), WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
        payloadLength = static_cast<int>(l);
        payloadOffset += 8;
    }
    else if ((lengthByte & 0x7f) == 126)
    {
        Poco::UInt16 l;
        //lenBuffer = l;

        if (l > length) throw WebSocketException(Poco::format("Insufficient buffer for payload size %hu", l), WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
        payloadLength = static_cast<int>(l);
        payloadOffset += 2;
    }
    else
    {
        Poco::UInt8 l = lengthByte & 0x7f;

        if (l > length) throw WebSocketException(Poco::format("Insufficient buffer for payload size %u", unsigned(l)), WebSocket::WS_ERR_PAYLOAD_TOO_BIG);
        payloadLength = static_cast<int>(l);
    }

    if (lengthByte & FRAME_FLAG_MASK)
    {
        reader.readRaw(mask, 4);
        payloadOffset += 4;
    }

    int received = 0;

    if (payloadOffset < n)
    {
        std::memcpy(buffer, header + payloadOffset, n - payloadOffset);
        received = n - payloadOffset;
    }

    if (received < payloadLength)
    {
        n = receiveNBytes(reinterpret_cast<char*>(buffer) + received, payloadLength - received);
        if (n <= 0) throw WebSocketException("Incomplete frame received", WebSocket::WS_ERR_INCOMPLETE_FRAME);
        received += n;
    }

    if (lengthByte & FRAME_FLAG_MASK)
    {
        char* p = reinterpret_cast<char*>(buffer);
        for (int i = 0; i < received; i++)
        {
            p[i] ^= mask[i % 4];
        }
    }
    return received;
}

Кто-нибудь может мне помочь!

P / s: извините за мой английский

ОБНОВЛЕНИЕ. Я только что столкнулся с этой проблемой в Chrome. Он отлично работает с Firefox и Edge


person Thế Hải Nguyễn    schedule 06.12.2016    source источник


Ответы (1)


Настройка setChunkedTransferEncoding должна заставить его работать.

В коде перед отправкой ответа установлено: response.setChunkedTransferEncoding(true);

person doqtor    schedule 06.12.2016
comment
Извините, но это не работает, проблема связана с получением данных, я заменил оператор запросом. Спасибо @@ - person Thế Hải Nguyễn; 07.12.2016
comment
Да, я знаю, что речь идет о получении данных. Вам нужно настроить ответ на фрагменты (а не на запрос), чтобы вы могли получать большие данные фрагментами. - person doqtor; 07.12.2016
comment
Я тоже установил ответ, но ничего не изменилось, спасибо - person Thế Hải Nguyễn; 07.12.2016
comment
Попробуйте также установить setContentLength() на размер строки ответа. - person doqtor; 07.12.2016
comment
Это все, что я помню, извините - это было несколько лет назад, когда я столкнулся с подобной проблемой. Вы можете отладить исходный код Poco, чтобы найти решение. - person doqtor; 07.12.2016
comment
OMG, у меня проблема с Chrome. Когда я тестирую Firefox и Edge, он работает отлично. Эта штука может помочь вам получить представление? - person Thế Hải Nguyễn; 07.12.2016