2012-11-02 35 views
0

我正在設計一個使用Qt創建器訪問遠程桌面的應用程序。爲了從遠程桌面獲得「退出」信號(在完成我的目的之後),我正在使用Tcpserver和Tcpsocket。我的電腦充當服務器,而遠程電腦充當客戶端。我正在使用以下概念:QTcpSocket在幾次連接成功後發出「連接拒絕錯誤」?

服務器PC 1.按PushButton訪問遠程屏幕(使用tightvnc以全屏模式)。 2.啓動服務器並偵聽任何活動連接(我正在使用端口9876)。 3.找到活動連接。連接到客戶端。 4.關閉遠程訪問。 5.切換回本地屏幕。 6.服務器關閉

客戶端PC 1.按退出按鈕關閉遠程訪問。 2.按退出按鈕 3.連接到主機。 4.發送「退出」至服務器 5.與主機斷開連接 6.關閉連接。

它工作正常的幾次嘗試(可以說10倍)

但畢竟有它開始給錯誤「拒絕連接錯誤」。我無法從遠程訪問回來,直到我重新啓動我的遠程電腦。

我試過使用重置,但結果是一樣的。

任何人有任何想法???

這裏是我的客戶端代碼

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

不知道如何解決這個問題?我犯了什麼錯誤?

+0

服務器代碼是什麼樣的?這是問題所在。 –

+0

如果bytesAvailable()大於1024,那麼'MainBoardServer :: startRead()'中可能存在緩衝區溢出。'connection_lost()'處理函數的作用是什麼?何時調用closeServer()? –

+0

@Remy closeServer()一旦我收到來自客戶端的「退出」消息,就會被調用。 此外,我只是從客戶端發送「退出」(硬編碼)。 – skg

回答

1

我發現了這個問題的解決方案。

上述代碼是絕對正確的並且可以正常工作。雖然問題在於通過PushButton調用此應用程序。

這是由於用於調用按鈕的指針變量發生的。

我解決了這個問題,通過直接替換指針對象來指定類。

無論如何都學到了更多關於指針的知識,以及它在複雜應用程序中的危險程度。

4

我不知道關於Qt任何東西,而是一個「連接被拒絕」套接字錯誤意味着兩種可能性之一:

1)沒有服務器套接字在目標IP監聽/端口的。

2)有一個服務器套接字偵聽,但其掛起的待處理客戶端連接已滿並且無法在此刻接受新連接。服務器代碼完全停止調用accept(),或者調用速度不夠快,無法滿足嘗試連接的客戶端的數量。

無論哪種方式,客戶端都無法知道其實際發生的情況。它所能做的只是等一會兒,然後再嘗試連接。

您需要診斷您的服務器代碼,而不是您的客戶端代碼。您的服務器代碼不符合您的期望。

+0

感謝您的回答。在我的情況下,每當我需要訪問遠程屏幕,我按下按鈕。這會導致服務器「啓動新連接」並在「退出」後收到。我正在關閉服務器。請指導我解決此問題 – skg