Я разрабатываю приложение для доступа к удаленному рабочему столу с помощью Qt Creator. Чтобы получить сигнал «Quit» с удаленного рабочего стола (после выполнения моей задачи), я использую Tcpserver и Tcpsocket. Мой ПК действует как сервер, а удаленный компьютер — как клиент. Я использую следующую концепцию:
Серверный ПК
1. Нажмите кнопку, чтобы получить доступ к удаленному экрану (в полноэкранном режиме с использованием tailvnc).
2. Запустите сервер и прослушайте любое активное соединение (я использую порт 9876).
3. Активное соединение найдено. Подключен к клиенту.
4. Закройте удаленный доступ.
5. переключитесь обратно на локальный экран.
6. Закрытие сервера
Клиентский ПК
1. Нажмите кнопку «Выйти», чтобы закрыть удаленный доступ.
2. Когда нажата кнопка «Выйти»
3. подключиться к хосту.
4. отправить «Quit» на сервер
5. отключиться от хоста
6. закрыть соединение.
Он отлично работает за несколько попыток (скажем, 10 раз)
но там после того, как он начинает выдавать ошибку «Ошибка соединения не установлена». И я не могу вернуться с удаленного доступа, пока я не перезагружу свой удаленный ПК.
Я пытался использовать 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();
}
Есть идеи, как решить эту проблему? какую ошибку я совершаю ???
Я ничего не знаю о Qt, но ошибка сокета «Connection Refused» означает одну из двух возможностей:
1) серверный сокет не прослушивает целевой IP / порт вообще.
2) прослушивается сокет сервера, но его незавершенные клиентские подключения заполнены и не могут принять новое подключение в данный момент. Либо код сервера перестал звонить accept()
в целом, или недостаточно быстро, чтобы удовлетворить количество клиентов, которые пытаются подключиться.
В любом случае, у клиента нет возможности узнать в конце концов, какое состояние на самом деле происходит. Все, что он может сделать, это подождать немного и попробовать снова подключиться.
Вам нужно диагностировать код вашего сервера, а не код клиента. Код вашего сервера не ведет себя так, как вы ожидаете.
Я нашел решение для этой проблемы.
Приведенный выше код абсолютно правильно и работает. Пока проблема была в вызове этого приложения через PushButton.
Это происходило из-за переменной указателя, используемой для вызова в кнопке.
Я решил это, заменив указатель, сделав прямой объект класса.
во всяком случае, узнал больше о указателях и насколько это может быть опасно в сложных приложениях.