我正在設計一個使用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();
}
不知道如何解決這個問題?我犯了什麼錯誤?
服務器代碼是什麼樣的?這是問題所在。 –
如果bytesAvailable()大於1024,那麼'MainBoardServer :: startRead()'中可能存在緩衝區溢出。'connection_lost()'處理函數的作用是什麼?何時調用closeServer()? –
@Remy closeServer()一旦我收到來自客戶端的「退出」消息,就會被調用。 此外,我只是從客戶端發送「退出」(硬編碼)。 – skg