1

Qt Creator を使用してリモート デスクトップにアクセスするためのアプリケーションを設計しています。リモートデスクトップから「終了」シグナルを取得するために(目的を完了した後)、TcpserverとTcpsocketを使用しています。私のPCはサーバーとして機能し、リモートPCはクライアントとして機能します。私は次の概念を使用しています:

サーバー pc 1. PushButton を押してリモート画面にアクセスします (tightvnc を使用した全画面モード)。2. サーバーを起動し、アクティブな接続をリッスンします (私はポート 9876 を使用しています)。3. アクティブな接続が見つかりました。クライアントに接続されました。4. リモート アクセスを閉じます。5. ローカル画面に戻ります。6. サーバーの閉鎖

クライアント PC 1. [終了] ボタンを押して、リモート アクセスを閉じます。2. 終了ボタンが押されたとき 3. ホストに接続します。4. サーバーに「Quit」を送信します。 5. ホストから切断します。 6. 接続を閉じます。

数回の試行で正常に機能します(10回としましょう)

しかし、その後、「接続拒否エラー」というエラーが発生し始めました。また、リモート PC を再起動するまで、リモート アクセスから戻ることができません。

Reset を使用してみましたが、結果は同じです。

誰でも何か考えがありますか???

これがクライアント側の私のコードです

#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();
}

この問題を解決する方法はありますか?? 私が犯している間違いは何ですか???

4

2 に答える 2

7

Qt については何も知りませんが、「接続が拒否されました」というソケット エラーは、次の 2 つの可能性のいずれかを意味します。

1) ターゲット IP/ポートでリッスンしているサーバー ソケットがまったくありません。

2) リッスンしているサーバー ソケットがありますが、保留中のクライアント接続のバックログがいっぱいで、その時点で新しい接続を受け入れることができません。サーバー コードが呼び出しaccept()を完全に停止したか、接続しようとしているクライアントの数を満たすのに十分な速度で呼び出していません。

いずれにせよ、クライアントが実際に発生している状態を知る方法はありません。できることは、少し待ってからもう一度接続を試みることだけです。

クライアント コードではなく、サーバー コードを診断する必要があります。サーバー コードが期待どおりに動作していません。

于 2012-11-02T03:34:42.090 に答える
1

この問題の解決策を見つけました。

上記のコードは完全に正しく、機能しています。PushButton を介したこのアプリケーションの呼び出しに問題がありました。

プッシュボタンの呼び出しに使用されるポインター変数が原因で発生していました。

クラスの直接オブジェクトを作成してポインターを置き換えることで解決しました。

とにかく、ポインターと、複雑なアプリケーションでのポインターの危険性についてさらに学びました。

于 2012-11-07T10:26:16.800 に答える