我使用Net :: SocketReactor关于proccess连接。当数据输入插座称为如下代码:Poco Websocket无法读取大数据
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读取大量数据?
你是对的!作为参数的指针是个坏主意。我试图简化代码。 –
我是否正确理解我们应该忽略结果StreamSocket :: availabel(),并使用int WebSocket :: receiveFrame(Poco :: Buffer&buffer,int&flags)? –
是的,你理解它是正确的。但是,带有'Poco :: Buffer'的版本尚未发布;所以,除非你使用github开发代码,你应该使用[固定缓冲区]的版本(https://github.com/pocoproject/poco/blob/poco-1.6.1/Net/src/WebSocket.cpp#L109 ),并确保为预期的框架提供足够的空间。 – Alex