2016-12-06 6 views
1

Poco에서 Poco 프로젝트를 다운로드하여 빌드하고 poco-1.7.6 \ Net \ samples \ WebSocketServer에서 WebsocketServer 프로젝트를 실행하십시오.Websocket Poco가 큰 데이터를받을 수 없습니다.

128KB (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의 : 죄송합니다 제 영어

업데이트에 대한 : 난 그냥 크롬이 문제가있어. Firefox와 Edge에서 잘 작동합니다.

답변

0

설정 setChunkedTransferEncoding으로 설정하면됩니다. 응답하기 전에 코드에서

이 설정 전송 : 데이터를 수신 대해 response.setChunkedTransferEncoding(true);

+0

죄송하지만이 작동하지 않습니다,이 문제를 내가 요청 문을 교체했다. Tks you @@ –

+0

네, 데이터 수신에 관한 내용입니다. 대용량의 데이터를 청크로받을 수 있도록 응답을 청크 (요청 아님)로 설정해야합니다. – doqtor

+0

응답도 설정했지만 아무 것도 변경되지 않았습니다. –