在Poco c++库中发送调用在运行一段时间后在Windows上不返回

Send call inside Poco C++ library not returning on Windows after running for some time

本文关键字:一段时间 Windows 返回 运行 调用 c++ Poco      更新时间:2023-10-16

我必须连接一个Socket。io 0.9服务器(出于遗留兼容性原因)从我的c++代码。套接字。io-poco似乎是唯一提供此功能的库,因此我决定冒险引入Poco来支持此功能。大多数事情都是有效的,直到它们失效。

我的进程似乎在send呼叫上停滞不前。cpp内部的调用不会返回,但是需要大约半小时的断开连接的执行才能达到该状态。我不确定如何防止和/或从程序进入这种糟糕的状态恢复。

程序在Windows 2012 R2上执行。它连接到服务器并成功进行会话,但连接可能会变得不稳定。我会回来,服务将不可见的服务器有时。这可能需要几个小时或几天的时间。我的测试场景是人为地断开服务器连接,看看会发生什么。这通常会导致程序在大约半小时内进入不返回状态。

对于如何缓解或解决这个问题有什么想法吗?

  • 一个不同的c++库,能够使用Socket。io 0.9 x
  • 我可以对陈旧的套接字做些什么。io-poco代码使其更具防御性
  • 猜猜我或中间的任何层搞砸了什么?
  • 还有其他想法吗?

我决定我需要更多地了解Winsock,所以我找到了一个指南。这告诉我要考虑SO_SNDTIMEOsetsockopt的关系。在搜索SocketImpl.html后,我找到了setSendTimeout,并发现我可以在套接字中调用它。使用WebSocket调用io-poco。

然后我只需要捕获异常并在超时发生时调用新的reconnect函数:

void SIOClientImpl::reconnect() {
    // Disconnect
    _heartbeatTimer->stop();
    _ws->close();
    // Connect
    if((handshake(_queryArgs)) && (openSocket())) {
            connectToEndpoint(_uri.getPath());
    } else {
        Poco::Thread::sleep(100);
    }
}

我不知道该希望什么:这个答案是有帮助的,还是没有其他人需要尝试做这个!