Poco Websocket无法读取大数据

时间:2015-12-10 07:20:01

标签: c++ websocket poco-libraries

我在proccess连接上使用 Net :: SocketReactor 。当数据输入到套接字时,调用如下代码:

int WebSocketWrapper::DoRecieve(void *buf) {    
    try{
       int flags;
       const auto size = m_sock.availabel();
       const auto ret = m_sock.receiveFrame(buf, size, flags);
       if (size != ret){
           logger.warrning('Read less than available');
       }
       return ret;
   }
   catch (WebSocketException& exc){
       logger.log(exc);
       switch (exc.code()){
          case pnet::WebSocket::WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION:
             logger.debug("unsuported version");
             break;
              // fallthrough
          case pnet::WebSocket::WS_ERR_NO_HANDSHAKE:
          case pnet::WebSocket::WS_ERR_HANDSHAKE_NO_VERSION:
          case pnet::WebSocket::WS_ERR_HANDSHAKE_NO_KEY:
             logger.debug("Bad request");
             break;
       }
   }
   return 0;
}

当数据大小小于1400字节时,它的工作正常。 TCP包没有碎片。但是当我尝试发送超过1400字节的数据时,我有WebSocketException:"有效负载大小的缓冲区不足"。我正在探索源代码 Poco :: Net :: Websocket ,他发现了冲突。当调用 Websocket :: readFrame 分析帧的大小时,我只有一部分帧。我可以请求返回 StreamSocket :: availabilitybel

如何从websocket读取大数据?

1 个答案:

答案 0 :(得分:1)

WebSockets在帧中运行,您将始终收到一帧或什么都没有。话虽如此,不要费心找出可用数据的数量(你可能会达到以太网1500字节MTU),但提供存储以容纳你期望接收的最大帧并调用receiveFrame()。如果消息在多个帧之间分段,则必须在应用程序级别处理该消息。见documentation

  

从套接字接收帧并存储它   在缓冲区。最多接收长度字节。如果   框架的有效负载较大,即WebSocketException   抛出并且WebSocket连接必须是   终止。

即将推出的1.7版本将receiveFrame()自动调整缓冲区的大小以适应框架。

要了解碎片化消息,请参阅Receiving Data中的RFC 6455。虽然WebSockets被设想为消息传递协议,但可以找到关于它们是真正的消息传递还是流式传输的一些思考here

此外,您发布的代码无法编译,并且在未知大小的缓冲区中写入未知数量的字节的想法似乎是危险的,温和地说。