我正在使用POCO 1.6.0。我正在尝试编写一个服务,在原始套接字上接收JSON消息并解析它。
然而,POCO解析器似乎工作的唯一方法是将整个字符串作为输入,并返回解析结果,或者抛出“语法错误”异常。
所以这意味着每次新的字节到达套接字时我都必须重新解析整个消息;而且目前还没有办法区分实际的语法错误与仅仅是一个不完整的消息。
parseChar
函数看起来不错,但它是私有的。有没有办法让解析器解析一些消息并保持在该状态,以便我可以通过传递更多数据来恢复解析?
此外,有没有办法区分实际的语法错误和不完整的消息(最好是获得有关语法错误确切性质的反馈)。
伪代码:
Poco::JSON::Parser parser;
std::string input_buffer;
for(;;)
{
// (append byte(s) from socket into input_buffer)
// (return failure if this read times out after 5 seconds)
parser.reset();
try
{
parser.parse(input_buffer);
break;
}
catch(Poco::Exception &e)
{
// (abort, but we don't know if data incomplete or data malformed
}
}
注意:我意识到这个问题可以通过让客户端按照this thread中描述的方式构建整个消息来解决,但是我希望通过正确地为客户端做一些尽可能简单的事情。形成的数据包足以定义一个帧(该问题的方法5)。