即使服务器端仍在监听,与Poco Websocket服务器的连接也会断开连接

时间:2018-07-20 02:06:05

标签: c++ websocket poco poco-libraries

更新:当它们位于同一主机上时,我可以在本地运行服务器和客户端完善版。以下情况是它们在不同的计算机上时的情况(更具体地说,一台计算机在ARM64 Petalinux上运行,另一台在Ubuntu上运行)。也许我需要在服务器端等设置一些选项

我有一个Poco Websocket服务器,该服务器是在Poco和javascript客户端提供的标准样本上编写的。尝试打开websocket时,有时尝试2-3次后,它会在第一次使用时就连接起来,依此类推。现在,一旦连接,它可能会发送消息或只是在客户端断开连接。虽然在服务器端没有错误,但我可以肯定它仍然是打开的,因为当我尝试从客户端打开另一个连接时,它将在不同的客户端端口上建立连接。

现在有趣的是,我编写了一个Poco websocket客户端,并在循环中无延迟地连续发送/接收消息,客户端保持活动状态一段时间,然后服务器和客户端都说对等方重置了异常连接。接下来,当我在客户端发送/接收消息时(例如5s)在循环中延迟时,客户端将发送/接收3-4次,然后客户端遇到由对等方重置的异常连接,现在这次没有此类消息在服务器端。这真让我感到困惑,因为无论我尝试什么,我都找不到解决方案。 PS:我的Websocket服务器有10天的超时时间

服务器端请求处理如下:

std::cout << "Request Received" << std::endl;
Poco::Util::Application& app = Poco::Util::Application::instance();
try
{
    std::cout << "Trying to connect..." << std::endl;
    Poco::Net::WebSocket ws(request, response);
    ws.setReceiveTimeout(Poco::Timespan(10, 0, 0, 0, 0)); //Timeout of 10 days
    app.logger().information("WebSocket connection established!");

    int flags, n;

    do
    {
        char buffer[1024] = {'\0'};

        std::cout << "Waiting for incoming frame" << std::endl;
        n = ws.receiveFrame(buffer, sizeof(buffer), flags);
        strncpy(buffer, "Hello Client!!", 1024);
        ws.sendFrame(buffer, strlen(buffer), Poco::Net::WebSocket::FRAME_TEXT);
    }
    while (n > 0 && (flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) != Poco::Net::WebSocket::FRAME_OP_CLOSE);
    std::cout << "Websocket Closed" << std::endl;
    app.logger().information("WebSocket connection closed.");
}

catch (std::exception& e)
{
    std::cout << "Exception " << e.what() << std::endl;
}

(正如人们所看到的,当websocket关闭时,服务器将发布一条消息,但是当客户端说对等方重置连接时,什么都不会显示)

poco websocket客户端是:

HTTPClientSession cs("IP", port);    
HTTPRequest request(HTTPRequest::HTTP_GET, "/?encoding=text",HTTPMessage::HTTP_1_1);
request.set("origin", "http://localhost");
HTTPResponse response;
bool run = true;

try {
    WebSocket* m_psock = new WebSocket(cs, request, response);
    char buffer[1024] = {'\0'};
    std::string str = "Hello Server!!";

    do {
        char receiveBuff[256];
        strncpy(buffer, str.c_str(), 1024);
        int len=m_psock->sendFrame(buffer,strlen(buffer),WebSocket::FRAME_TEXT);
        std::cout << "Sent bytes " << len << std::endl;
        std::cout << "Sent Message:  " << buffer << std::endl;
        int flags=0;

        int rlen=m_psock->receiveFrame(receiveBuff,256,flags);
        std::cout << "Received bytes " << rlen << std::endl;
        std::cout << receiveBuff << std::endl;
        //std::cin >> str;
        sleep(5); 
    } while (1);

    m_psock->close();

} 

catch (std::exception &e) 
{
    std::cout << "Exception " << e.what();
}

仅供参考:我无法处理由对等方重置的连接,因为它会直接变为异常,而不会将收到的字节打印为0

0 个答案:

没有答案