QTcpSocket客户端自动重新连接

Fur*_*kan 6 c++ qt qtcpsocket

我正在尝试编写一段代码,定期尝试使用QTcpSocket连接到服务器,直到服务器启动并准备就绪.客户端还应自动并定期尝试在服务器关闭时重新连接,直到它再次启动或用户手动关闭程序.

我所做的是订阅QTcpSocket的连接和错误信号.当我捕获错误信号时,我基本上再次调用connectToHost方法.

我的代码会定期尝试连接到主机,直到服务器准备就绪(这部分工作正常).但是,问题是当服务器关闭时它永远不能重新连接.当连接断开时,我按预期得到RemoteHostClosedError.但是,在同一方法(我捕获RemoteHostClosedError)中再次调用connectToHost方法后,我什么也没得到.甚至QTcpSocket对象也不会发出错误信号.

我在下面给出了我的代码.

TcpServerConnector::TcpServerConnector( SocketSettings socketSettings, QObject* parent)
: QObject(parent), socket(new QTcpSocket())
{
    this->connect(this->socket, SIGNAL(connected()), this, SLOT(connectionSuccess_Handler()), Qt::DirectConnection);
    this->connect(this->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError_Handler(QAbstractSocket::SocketError)), Qt::DirectConnection);
}


void TcpServerConnector::connectionError_Handler( QAbstractSocket::SocketError error )
{
    switch (error)
    {
    case QAbstractSocket::AddressInUseError:
        this->logger.log(LogLevel::ERR, "SOCKET ERROR: Address is already in use");
        break;
    case QAbstractSocket::ConnectionRefusedError:
        this->logger.log(LogLevel::ERR, "SOCKET ERROR: Connection refused");
        break;
    case QAbstractSocket::HostNotFoundError:
        this->logger.log(LogLevel::ERR, "SOCKET ERROR: Host not found");
        break;
    case QAbstractSocket::RemoteHostClosedError:
        this->logger.log(LogLevel::ERR, "SOCKET ERROR: Remote host closed");            
        break;  
    }


    this->socket->abort();
    this->socket->close();
    this->logger.log(LogLevel::DEBUG, "Reconnecting...");
    SystemUtil::sleepCurrentThread(1000);
    this->socket->connectToHost(ip_address, port);
}
Run Code Online (Sandbox Code Playgroud)

}

我在调用connectToHost方法之前和之后检查QTcpSocket的状态(我在这里给出的最后一行).在调用connectToHost之前,状态为UnconnectedState,在调用connectToHost后,其状态变为Connecting.没什么意外的.但是,它既不能连接到服务器,也不会发出错误信号.

任何的想法?

注意:QTcpSocket的connectToHost元文件是第一次在内部调用.

Fur*_*kan 5

对于那些可能遇到类似情况的人来说,QTcpSocket的reset方法解决了这个问题.

  • 请你发布你的解决方案... Tnx;) (3认同)