【问题标题】:Poco Websocket cant'r read large dataPoco Websocket 无法读取大数据
【发布时间】:2015-12-10 07:20:00
【问题描述】:

我在进程连接上使用 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::availabel

如何从 websocket 中读取大数据?

【问题讨论】:

    标签: c++ websocket poco-libraries


    【解决方案1】:

    WebSockets 在帧中运行,您总是会收到一个帧或什么也没有。话虽如此,不必费心计算可用数据量(您可能正在使用以太网 1500 字节 MTU),而是提供存储以容纳您期望接收的最大帧并调用receiveFrame()。如果消息在多个帧之间分段,则必须在应用程序级别处理。见documentation:

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

    即将发布的 1.7 版本将有 receiveFrame() 自动调整缓冲区大小以适应帧。

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

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

    【讨论】:

    • 你是对的!指针作为参数是个坏主意。我试图简化代码。
    • 我是否理解正确,我们应该忽略结果StreamSocket::availabel(),而使用int WebSocket::receiveFrame(Poco::Buffer& buffer, int& flags)?
    • 是的,你没看错。但是,Poco::Buffer 的版本还没有发布;因此,除非您使用的是 github 开发代码,否则您应该使用带有 fixed buffer 的版本,并确保为您期望的框架提供足够的空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2017-11-12
    • 2015-03-07
    相关资源
    最近更新 更多