Poco :: Net :: NoMessageException在HTTP / GET之后几秒钟引发

时间:2016-06-07 16:25:27

标签: c++ windows visual-studio-2015 poco-libraries

从POCO GitHub问题复制

我在 Windows 10 上使用 Poco Visual Studio 2015 构建一个简单的Web服务器。

使用网络浏览器连接到此服务器后, Poco :: Net :: NoMessageException 会提升几秒钟(约15秒)。刷新页面后会再次发生;它在每次连接后都这样做。

我在文档,论坛,stackoverflow中找不到任何内容。在文档中描述如何/何时/为什么这些异常来自库内部的描述将非常有帮助。

我还尝试{只是为了好玩] std::cout << req.getURI() << std::endl;中的handleRequest(...)并在地址0x00000000 处获得了内存访问冲突,但没有其他代码正在运行。

这是我的代码。 预处理器语句被省略。

MyApp.c

int main(int argc, char ** argv)
{
    myHTTPServer server;
    return server.run(argc, argv);
}

myHTTPRequestHandlerFactory

// Header
class myHTTPRequestHandlerFactory : public HTTPRequestHandlerFactory
{
    public:
        virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest&);
};

// Code
HTTPRequestHandler* myHTTPRequestHandlerFactory::createRequestHandler(const HTTPServerRequest& handler) {
    return new myHTTPRequestHandler;
}

myHTTPRequestHandler

// Header
class myHTTPRequestHandler : public HTTPRequestHandler
{
    public:
        virtual void handleRequest(HTTPServerRequest &, HTTPServerResponse &);
};

// Code
void myHTTPRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) {
    response.setStatus(HTTPResponse::HTTP_OK);
    //response.setContentLength(1024);
    //response.setChunkedTransferEncoding(true);
    std::ostream& out = response.send();
    out << "<html><head></head><body>POCO POCO POCO</body></html>";
    out.flush();
}

myHTTPServer

// Header
class myHTTPServer : public ServerApplication
{
    protected:
        int main(const std::vector<std::string>& v) {
            HTTPServer server(new myHTTPRequestHandlerFactory, ServerSocket(80), new HTTPServerParams);

            server.start();

            std::cout << "Server started" << std::endl;

            waitForTerminationRequest();

            std::cout << "Server stopped" << std::endl;

            server.stop();

            return Application::EXIT_OK;
        }
};

// No code in .c file

感谢您帮助我

2 个答案:

答案 0 :(得分:0)

根据this answer,无特殊原因引发 Poco :: Net :: NoMessageException 异常是正常的POCO行为,你应safely ignore

对于内存访问违规,这是正常的,因为不允许在std::cout中调用HTTPRequestHandler::handleRequest(...)

答案 1 :(得分:-1)

在改变我处理网址路线的方式后,我遇到了同样的问题。

我认为这可能是由于Chrome自动发送的第二个请求:favicon。 在收到HTML内容后,浏览器再次询问服务器以获取精美的选项卡图标(如果有)。确保妥善处理此类请求,如果需要,可能会出现404错误。

作为一般建议,将所有未知请求重定向到发送相关HTTP错误代码的处理程序,以确保您回复所有请求。

您还可以记录所有传入的请求(至少在调试中,如果您不想记录敏感信息),并检查浏览器的“开发者工具”部分以检查发送的请求。 如果您没有在http服务器上调用以https://开头的URL(在这种情况下可能会进行额外的交换),则浏览器不应发送任何其他请求而不将其记录在网络选项卡中。