skg*_*skg 1 c++ linux qt qtcpsocket qtcpserver
我正在设计一个使用Qt创建者访问远程桌面的应用程序.为了从远程桌面获取"退出"信号(在完成我的目的之后),我使用的是Tcpserver和Tcpsocket.我的Pc充当服务器,而远程PC充当客户端.我使用以下概念:
Server pc 1.按PushButton访问远程屏幕(使用tightvnc以全屏模式).2.启动服务器并侦听任何活动连接(我正在使用端口9876).3.找到活动连接.连接到客户端.4.关闭远程访问.5.切换回本地屏幕.6.服务器关闭
客户端PC 1.按退出按钮关闭远程访问.2.按下退出按钮时3.连接到主机.4.将"退出"发送到服务器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();
}
Run Code Online (Sandbox Code Playgroud)
我的服务器代码是:
#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();
}
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题?? 我犯了什么错误?
我对Qt一无所知,但"拒绝连接"套接字错误意味着两种可能性之一:
1)根本没有服务器套接字监听目标IP /端口.
2)有一个服务器套接字监听,但它的待处理客户端连接的积压已满,并且当时无法接受新连接.服务器代码已accept()完全停止调用,或者没有足够快地调用它来满足尝试连接的客户端数量.
无论哪种方式,客户都无法知道其实际发生的情况.它所能做的只是等待一段时间再尝试连接.
您需要诊断服务器代码,而不是客户端代码.您的服务器代码的行为不符合您的预期.