2012-11-02 20 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