gpt4 book ai didi

c++ - Poco Websocket 无法读取大数据

转载 作者:行者123 更新时间:2023-11-28 05:55:40 25 4
gpt4 key购买 nike

我在进程连接上使用 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读取大数据?

最佳答案

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

Receives a frame from the socket and stores itin buffer. Up to length bytes are received. Ifthe frame's payload is larger, a WebSocketExceptionis thrown and the WebSocket connection must beterminated.

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

要了解碎片化消息,请参阅 Receiving DataRFC 6455 .虽然 WebSockets 被认为是消息传递协议(protocol),但可以找到关于它们是真正的消息传递还是流媒体的一些思考 here .

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

关于c++ - Poco Websocket 无法读取大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34195884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com