几次成功连接后QTcpSocket发出“连接拒绝错误”?

时间:2012-11-02 03:19:10

标签: c++ linux qt qtcpsocket qtcpserver

我正在设计一个使用Qt创建者访问远程桌面的应用程序。为了从远程桌面获取“退出”信号(在完成我的目的之后),我使用的是Tcpserver和Tcpsocket。我的Pc充当服务器,而远程PC充当客户端。我使用以下概念:

服务器电脑 1.按PushButton访问远程屏幕(使用tightvnc以全屏模式)。 2.启动服务器并侦听任何活动连接(我正在使用端口9876)。 3.找到活动连接。连接到客户端。 4.关闭远程访问。 5.切换回本地屏幕。 6.服务器关闭

客户PC 1.按退出按钮关闭远程访问。 2.按下退出按钮时 3.连接到主机。 4.将“退出”发送到服务器 5.断开与主机的连接 6.紧密联系。

它可以很好地尝试几次(比方说10次)

但是在它开始给出错误“Connection refused Error”之后。而且我无法从远程访问中恢复,直到重新启动我的远程PC。

我尝试过使用重设但效果相同。

任何人都有任何想法???

以下是我的客户端代码

#include "ctrlboardclient.h"
#include <QHostAddress>
#include <QObject>
#include <QtGui/QApplication>
#include <QDebug>


bool CtrlBoardClient::status_flag = false;           /* Flag to check the transfer status of Data */


CtrlBoardClient::CtrlBoardClient()
{
    connect(&client, SIGNAL(connected()),    this,  SLOT(startTransfer()));
    connect(&client, SIGNAL(readyRead()),    this,  SLOT(recieve_msg()));
    connect(&client, SIGNAL(disconnected()), this,  SLOT(disconnectstatus()));
    connect(&client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(getErrorCode(QAbstractSocket::SocketError)));
}


bool CtrlBoardClient::start(QString address, quint16 port)
{
    QHostAddress addr(address);
    bool rval = client.reset();
    qDebug() << "Reset before Connect to Host = " << rval;
    client.connectToHost(address, port);

    if (!client.waitForConnected(3000)) {
        bool rval = client.reset();
        qDebug() << "Reset after Connect to Host = " << rval;
        qDebug() << "Client is unable to connect to Server ";
        return false;
    }
    qDebug() << "Client Server Connection Successful";
    status_flag = false;
    return true;
}

void CtrlBoardClient::getErrorCode(QAbstractSocket::SocketError errorCode)
{
    qDebug() << "Socket Error = " << errorCode;
}


void CtrlBoardClient::SendMessage(QString Message)
{
    status_flag = true;
    msg = Message;
    startTransfer();
    qDebug() << "Message sent to the Server";
    client.disconnectFromHost();
    while (!client.waitForDisconnected(3000));
    qDebug() << "Disconnected from the Host";
    return;
}


void CtrlBoardClient::startTransfer()
{
    if (status_flag) {
        QByteArray block = "";
        block.append(msg);
        client.write(block);
    }

    status_flag = false;
    return;
}


QByteArray CtrlBoardClient::RecieveMessage()
{
    return indata;
}


void CtrlBoardClient::recieve_msg()
{
    indata = "";
    indata.append(client.readAll());
    emit recievemsg();
}


void CtrlBoardClient::disconnectstatus()
{
    qDebug() << "Closing Client connection";
    CloseClientConnection();
    emit connection_aborted();
}


void CtrlBoardClient::CloseClientConnection()
{
    bool rval = client.reset();
    qDebug() << "Reset after Disconnect from Host = " << rval;
    client.close();
}

我的服务器代码是:

#include "mainboardserver.h"

MainBoardServer::MainBoardServer()
{
   connect(&mainserver, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
   connect(this, SIGNAL(disconnected()), this, SLOT(DisconnectMessage()) );

    if (!mainserver.listen(QHostAddress::Any, 9876)) {
        emit no_incoming_connection();
    }
}

void MainBoardServer::acceptConnection()
{
    ctrlclient = mainserver.nextPendingConnection();
    connect(ctrlclient, SIGNAL(readyRead()), this, SLOT(startRead()));
    connect(ctrlclient, SIGNAL(disconnected()), this, SLOT(DisconnectMessage()));
    emit connection_found();
}

void MainBoardServer::startRead()
{
    char buffer[1024] = {0};
    ClientChat = "";
    ctrlclient->read(buffer, ctrlclient->bytesAvailable());
    ClientChat.append(buffer);
    ctrlclient->close();
    emit data_recieved();
}

QString MainBoardServer::RecieveData()
{
    return ClientChat;
}

void MainBoardServer::TransferData(QByteArray data)
{
    ctrlclient->write(data);
}

void MainBoardServer::DisconnectMessage()
{
    emit connection_lost();
}


void MainBoardServer::closeServer()
{
    mainserver.close();
    emit disconnected();
}

知道如何解决这个问题吗?我犯了什么错误?

2 个答案:

答案 0 :(得分:6)

我对Qt一无所知,但“拒绝连接”套接字错误意味着两种可能性之一:

1)根本没有服务器套接字监听目标IP /端口。

2)有一个服务器套接字侦听,但其待处理客户端连接的积压已满,并且此时无法接受新连接。服务器代码已经完全停止调用accept(),或者没有足够快地调用它来满足尝试连接的客户端数量。

无论哪种方式,客户都无法知道实际发生了哪种情况。它所能做的只是等待一段时间再尝试连接。

您需要诊断服务器代码,而不是客户端代码。您的服务器代码的行为不符合您的预期。

答案 1 :(得分:1)

我找到了解决这个问题的方法。

以上代码绝对正确且有效。问题在于通过PushButton调用此应用程序。

由于用于在按钮中调用的指针变量,它发生了。

我通过制作类的直接Object来替换指针来解决它。

无论如何都学到了更多关于指针以及在复杂应用程序中它有多危险。