2016-12-06 23 views
1

PocoからPocoプロジェクトをダウンロードしてビルドし、poco-1.7.6 \ Net \ samples \ WebSocketServerでWebsocketServerプロジェクトを実行します。Websocket Pocoは大きなデータを受け取ることができません

小さなデータ(128 KB(131072バイト))で作業したところ、完全に機能しました。しかし、私がより大きいデータ(20MBを送る必要がある)を使って作業すると、私のデータがカットされ、サーバーは十分なデータを受け取ることができません。

 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; 

Deframeコード:

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:私の英語

UPDATEについては申し訳ありません:私は、Chromeでこの問題を得ました。 FirefoxとEdgeでうまく動作します

答えて

0

設定setChunkedTransferEncodingは動作するはずです。応答前のコードで

がセットされて送信されます。データの受信について response.setChunkedTransferEncoding(true);

+0

申し訳ありませんが、それは動作しません、この問題はあるが、私は要求して文を置き換えます。 Tks you @@ –

+0

はい、これはデータの受信に関することです。大きなデータをチャンクで受け取れるように、チャンク(リクエストではない)に応答を設定する必要があります。 – doqtor

+0

私は応答も設定しましたが、何も変わっていませんでした。 –

関連する問題