fix:接收端未检测到发送端断连的情况处理。处理传输退出功能。
This commit is contained in:
@@ -212,6 +212,7 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FBT_SER_MSG_OFFLINE: {
|
case FBT_SER_MSG_OFFLINE: {
|
||||||
|
popID(frame->fid);
|
||||||
emit sigOffline(frame);
|
emit sigOffline(frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -227,6 +228,10 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
|||||||
emit sigFlowBack(frame);
|
emit sigFlowBack(frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FBT_CLI_TRANS_INTERRUPT: {
|
||||||
|
emit sigTransInterrupt(frame);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
qCritical() << QString("未知的帧类型: %1").arg(frame->type);
|
qCritical() << QString("未知的帧类型: %1").arg(frame->type);
|
||||||
break;
|
break;
|
||||||
@@ -285,6 +290,20 @@ QString ClientCore::GetOwnID()
|
|||||||
return ownID_;
|
return ownID_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientCore::pushID(const QString& id)
|
||||||
|
{
|
||||||
|
QWriteLocker locker(&rwIDLock_);
|
||||||
|
if (!remoteIDs_.contains(id)) {
|
||||||
|
remoteIDs_.push_back(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCore::popID(const QString& id)
|
||||||
|
{
|
||||||
|
QWriteLocker locker(&rwIDLock_);
|
||||||
|
remoteIDs_.removeAll(id);
|
||||||
|
}
|
||||||
|
|
||||||
SocketWorker::SocketWorker(ClientCore* core, QObject* parent) : QThread(parent), core_(core)
|
SocketWorker::SocketWorker(ClientCore* core, QObject* parent) : QThread(parent), core_(core)
|
||||||
{
|
{
|
||||||
// connect(core_, &ClientCore::sigDisconnect, this, [this]() {
|
// connect(core_, &ClientCore::sigDisconnect, this, [this]() {
|
||||||
@@ -328,10 +347,17 @@ void HeatBeat::run()
|
|||||||
}
|
}
|
||||||
ClientCore::syncInvoke(core_, frame);
|
ClientCore::syncInvoke(core_, frame);
|
||||||
auto rid = core_->GetRemoteID();
|
auto rid = core_->GetRemoteID();
|
||||||
if (rid.isEmpty()) {
|
if (!rid.isEmpty()) {
|
||||||
continue;
|
auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid);
|
||||||
|
ClientCore::syncInvoke(core_, frame2);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QReadLocker loker(&core_->rwIDLock_);
|
||||||
|
for (auto& id : core_->remoteIDs_) {
|
||||||
|
auto frame3 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, id);
|
||||||
|
ClientCore::syncInvoke(core_, frame3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid);
|
|
||||||
ClientCore::syncInvoke(core_, frame2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <QReadWriteLock>
|
||||||
|
|
||||||
class ClientCore : public QObject
|
class ClientCore : public QObject
|
||||||
{
|
{
|
||||||
@@ -81,6 +82,7 @@ signals:
|
|||||||
void sigMsgAsk(QSharedPointer<FrameBuffer> frame);
|
void sigMsgAsk(QSharedPointer<FrameBuffer> frame);
|
||||||
void sigMsgAnswer(QSharedPointer<FrameBuffer> frame);
|
void sigMsgAnswer(QSharedPointer<FrameBuffer> frame);
|
||||||
void sigFlowBack(QSharedPointer<FrameBuffer> frame);
|
void sigFlowBack(QSharedPointer<FrameBuffer> frame);
|
||||||
|
void sigTransInterrupt(QSharedPointer<FrameBuffer> frame);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void conSuccess();
|
void conSuccess();
|
||||||
@@ -99,10 +101,18 @@ public:
|
|||||||
void SetRemoteID(const QString& id);
|
void SetRemoteID(const QString& id);
|
||||||
QString GetRemoteID();
|
QString GetRemoteID();
|
||||||
QString GetOwnID();
|
QString GetOwnID();
|
||||||
|
void pushID(const QString& id);
|
||||||
|
void popID(const QString& id);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QMutex conMutex_;
|
QMutex conMutex_;
|
||||||
QString ownID_;
|
QString ownID_;
|
||||||
|
|
||||||
|
// 这是被动发送时,对方ID。
|
||||||
|
QReadWriteLock rwIDLock_;
|
||||||
|
QVector<QString> remoteIDs_;
|
||||||
|
|
||||||
|
// 这是主动通信时的对方ID。
|
||||||
QString remoteID_;
|
QString remoteID_;
|
||||||
|
|
||||||
QMutex sockMut_;
|
QMutex sockMut_;
|
||||||
|
|||||||
@@ -69,8 +69,6 @@ void FileTrans::ReqSendFile(const TransTask& task)
|
|||||||
|
|
||||||
void FileTrans::ReqDownFile(const TransTask& task)
|
void FileTrans::ReqDownFile(const TransTask& task)
|
||||||
{
|
{
|
||||||
// TODO: check if running...
|
|
||||||
|
|
||||||
// start
|
// start
|
||||||
InfoMsg info;
|
InfoMsg info;
|
||||||
info.toPath = task.localPath;
|
info.toPath = task.localPath;
|
||||||
@@ -163,6 +161,8 @@ void FileTrans::RegisterSignal()
|
|||||||
connect(clientCore_, &ClientCore::sigFileInfo, this, [this](QSharedPointer<FrameBuffer> frame) { fbtFileInfo(frame); });
|
connect(clientCore_, &ClientCore::sigFileInfo, this, [this](QSharedPointer<FrameBuffer> frame) { fbtFileInfo(frame); });
|
||||||
connect(clientCore_, &ClientCore::sigTransFailed, this, [this](QSharedPointer<FrameBuffer> frame) { fbtTransFailed(frame); });
|
connect(clientCore_, &ClientCore::sigTransFailed, this, [this](QSharedPointer<FrameBuffer> frame) { fbtTransFailed(frame); });
|
||||||
connect(clientCore_, &ClientCore::sigOffline, this, [this](QSharedPointer<FrameBuffer> frame) { fbtInterrupt(frame); });
|
connect(clientCore_, &ClientCore::sigOffline, this, [this](QSharedPointer<FrameBuffer> frame) { fbtInterrupt(frame); });
|
||||||
|
connect(clientCore_, &ClientCore::sigTransInterrupt, this,
|
||||||
|
[this](QSharedPointer<FrameBuffer> frame) { fbtInterrupt(frame); });
|
||||||
}
|
}
|
||||||
|
|
||||||
// The other party requests to send, prepare to receive.
|
// The other party requests to send, prepare to receive.
|
||||||
@@ -221,6 +221,9 @@ void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
|||||||
downTask_->file.close();
|
downTask_->file.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 需要记录对方的ID,用于心跳检测
|
||||||
|
clientCore_->pushID(frame->fid);
|
||||||
downTask_->state = TaskState::STATE_RUNNING;
|
downTask_->state = TaskState::STATE_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,10 +231,6 @@ void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
|||||||
void FileTrans::fbtReqDown(QSharedPointer<FrameBuffer> frame)
|
void FileTrans::fbtReqDown(QSharedPointer<FrameBuffer> frame)
|
||||||
{
|
{
|
||||||
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||||
// judge is same client's same file.
|
|
||||||
|
|
||||||
// judge if file exits etc.
|
|
||||||
|
|
||||||
// send
|
// send
|
||||||
auto doTask = QSharedPointer<DoTransTask>::create();
|
auto doTask = QSharedPointer<DoTransTask>::create();
|
||||||
doTask->file.setFileName(info.fromPath);
|
doTask->file.setFileName(info.fromPath);
|
||||||
@@ -261,6 +260,10 @@ void FileTrans::fbtReqDown(QSharedPointer<FrameBuffer> frame)
|
|||||||
doTask->task.isUpload = true;
|
doTask->task.isUpload = true;
|
||||||
doTask->task.localPath = info.fromPath;
|
doTask->task.localPath = info.fromPath;
|
||||||
doTask->task.remoteId = frame->fid;
|
doTask->task.remoteId = frame->fid;
|
||||||
|
|
||||||
|
// 需要记录对方的ID,用于心跳检测
|
||||||
|
clientCore_->pushID(frame->fid);
|
||||||
|
|
||||||
SendFile(doTask);
|
SendFile(doTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,18 +350,43 @@ void FileTrans::fbtTransFailed(QSharedPointer<FrameBuffer> frame)
|
|||||||
downTask_->state = TaskState::STATE_FAILED;
|
downTask_->state = TaskState::STATE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTrans::fbtInterrupt(QSharedPointer<FrameBuffer> frame)
|
void FileTrans::Interrupt(bool notic)
|
||||||
{
|
{
|
||||||
if (downTask_->state == TaskState::STATE_RUNNING) {
|
if (downTask_->state == TaskState::STATE_RUNNING) {
|
||||||
qWarning() << QString(tr("传输文件 %1 中断。")).arg(downTask_->file.fileName());
|
qWarning() << QString(tr("传输文件 %1 中断。")).arg(downTask_->file.fileName());
|
||||||
|
downTask_->file.close();
|
||||||
|
|
||||||
|
if (notic) {
|
||||||
|
InfoMsg info;
|
||||||
|
info.msg = QString(tr("传输文件 %1 主动中断。")).arg(downTask_->file.fileName());
|
||||||
|
auto f = clientCore_->GetBuffer(info, FBT_CLI_TRANS_INTERRUPT, downTask_->task.remoteId);
|
||||||
|
if (!ClientCore::syncInvoke(clientCore_, f)) {
|
||||||
|
qCritical() << QString(tr("发送 %1 信息给 %2 失败。")).arg(info.msg).arg(downTask_->task.remoteId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
downTask_->state = TaskState::STATE_NONE;
|
downTask_->state = TaskState::STATE_NONE;
|
||||||
}
|
}
|
||||||
if (sendTask_->state == TaskState::STATE_RUNNING) {
|
if (sendTask_->state == TaskState::STATE_RUNNING) {
|
||||||
qWarning() << QString(tr("传输文件 %1 中断。")).arg(sendTask_->file.fileName());
|
qWarning() << QString(tr("传输文件 %1 中断。")).arg(sendTask_->file.fileName());
|
||||||
|
sendTask_->file.close();
|
||||||
|
|
||||||
|
InfoMsg info;
|
||||||
|
info.msg = QString(tr("传输文件 %1 主动中断。")).arg(sendTask_->file.fileName());
|
||||||
|
auto f = clientCore_->GetBuffer(info, FBT_CLI_TRANS_INTERRUPT, sendTask_->task.remoteId);
|
||||||
|
if (!ClientCore::syncInvoke(clientCore_, f)) {
|
||||||
|
qCritical() << QString(tr("发送 %1 信息给 %2 失败。")).arg(info.msg).arg(sendTask_->task.remoteId);
|
||||||
|
}
|
||||||
|
|
||||||
sendTask_->state = TaskState::STATE_NONE;
|
sendTask_->state = TaskState::STATE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FileTrans::fbtInterrupt(QSharedPointer<FrameBuffer> frame)
|
||||||
|
{
|
||||||
|
Interrupt(false);
|
||||||
|
}
|
||||||
|
|
||||||
void FileTrans::SendFile(const QSharedPointer<DoTransTask>& task)
|
void FileTrans::SendFile(const QSharedPointer<DoTransTask>& task)
|
||||||
{
|
{
|
||||||
auto* sendThread = new SendThread(clientCore_);
|
auto* sendThread = new SendThread(clientCore_);
|
||||||
@@ -387,7 +415,6 @@ void SendThread::run()
|
|||||||
isSuccess_ = true;
|
isSuccess_ = true;
|
||||||
delay_ = 0;
|
delay_ = 0;
|
||||||
bool invokeSuccess = false;
|
bool invokeSuccess = false;
|
||||||
qInfo() << tr("开始发送文件:") << task_->file.fileName();
|
|
||||||
while (!task_->file.atEnd()) {
|
while (!task_->file.atEnd()) {
|
||||||
auto frame = QSharedPointer<FrameBuffer>::create();
|
auto frame = QSharedPointer<FrameBuffer>::create();
|
||||||
frame->tid = task_->task.remoteId;
|
frame->tid = task_->task.remoteId;
|
||||||
@@ -414,12 +441,16 @@ void SendThread::run()
|
|||||||
// 关键点:这里不调用,无法中途收到别人发的数据。
|
// 关键点:这里不调用,无法中途收到别人发的数据。
|
||||||
QCoreApplication::processEvents();
|
QCoreApplication::processEvents();
|
||||||
}
|
}
|
||||||
qInfo() << tr("结束发送文件:") << task_->file.fileName();
|
qInfo() << QString(tr("结束发送文件:%1")).arg(task_->file.fileName());
|
||||||
InfoMsg info;
|
|
||||||
auto f = cliCore_->GetBuffer(info, FBT_CLI_TRANS_DONE, task_->task.remoteId);
|
// 不是Open表示被别人关闭了,就不发送结束信号了。
|
||||||
ClientCore::syncInvoke(cliCore_, f);
|
if (task_->file.isOpen()) {
|
||||||
task_->file.close();
|
InfoMsg info;
|
||||||
task_->state = TaskState::STATE_FINISH;
|
auto f = cliCore_->GetBuffer(info, FBT_CLI_TRANS_DONE, task_->task.remoteId);
|
||||||
|
ClientCore::syncInvoke(cliCore_, f);
|
||||||
|
task_->file.close();
|
||||||
|
task_->state = TaskState::STATE_FINISH;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendThread::setTask(const QSharedPointer<DoTransTask>& task)
|
void SendThread::setTask(const QSharedPointer<DoTransTask>& task)
|
||||||
|
|||||||
@@ -71,6 +71,9 @@ public:
|
|||||||
qint32 GetSendProgress();
|
qint32 GetSendProgress();
|
||||||
qint32 GetDownProgress();
|
qint32 GetDownProgress();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Interrupt(bool notic);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void fbtReqSend(QSharedPointer<FrameBuffer> frame);
|
void fbtReqSend(QSharedPointer<FrameBuffer> frame);
|
||||||
void fbtReqDown(QSharedPointer<FrameBuffer> frame);
|
void fbtReqDown(QSharedPointer<FrameBuffer> frame);
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ void TransForm::SetClientCore(ClientCore* clientCore)
|
|||||||
{
|
{
|
||||||
clientCore_ = clientCore;
|
clientCore_ = clientCore;
|
||||||
fileTrans_ = new FileTrans(clientCore_);
|
fileTrans_ = new FileTrans(clientCore_);
|
||||||
|
connect(ui->btnCancel, &QPushButton::clicked, this, [this]() {
|
||||||
|
fileTrans_->Interrupt(true);
|
||||||
|
close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransForm::SetTasks(const QVector<TransTask>& tasks)
|
void TransForm::SetTasks(const QVector<TransTask>& tasks)
|
||||||
@@ -68,7 +72,7 @@ void TransForm::startTask()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
emit sigProgress(progress);
|
emit sigProgress(progress);
|
||||||
QThread::msleep(2);
|
QThread::msleep(1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fileTrans_->ReqDownFile(task);
|
fileTrans_->ReqDownFile(task);
|
||||||
@@ -86,7 +90,7 @@ void TransForm::startTask()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
emit sigProgress(progress);
|
emit sigProgress(progress);
|
||||||
QThread::msleep(2);
|
QThread::msleep(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++curTaskNum_;
|
++curTaskNum_;
|
||||||
@@ -247,4 +251,4 @@ void CheckCondition::run()
|
|||||||
isAlreadyInter_ = true;
|
isAlreadyInter_ = true;
|
||||||
emit sigCheckOver();
|
emit sigCheckOver();
|
||||||
qInfo() << tr("文件校验结束......");
|
qInfo() << tr("文件校验结束......");
|
||||||
}
|
}
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="btnCancel">
|
<widget class="QPushButton" name="btnCancel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>取消退出</string>
|
<string>退出</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -8,14 +8,15 @@
|
|||||||
|
|
||||||
| 序号 | 类型 | 内容 | 说明 | 基于版本 | 完成版本 |
|
| 序号 | 类型 | 内容 | 说明 | 基于版本 | 完成版本 |
|
||||||
| :--: | :--: | ------------------------------------------------------------ | :--: | :------: | :------: |
|
| :--: | :--: | ------------------------------------------------------------ | :--: | :------: | :------: |
|
||||||
| 30 | 功能 | 传输界面的取消退出,缺失功能处理。 | | 0.2.2 | |
|
| 31 | 功能 | Server端buffer大小判断,有过多无效数据则踢出该客户端。 | | 0.2.2 | |
|
||||||
|
| 30 | 功能 | 传输界面的取消退出,缺失功能处理。 | | 0.2.2 | 0.2.3 |
|
||||||
| 29 | 功能 | 根据接收端的速率限制发送端的速度。 | | 0.2.2 | 0.2.3 |
|
| 29 | 功能 | 根据接收端的速率限制发送端的速度。 | | 0.2.2 | 0.2.3 |
|
||||||
| 28 | 变更 | 语言简体中文。 | | 0.2.2 | 0.2.3 |
|
| 28 | 变更 | 语言简体中文。 | | 0.2.2 | 0.2.3 |
|
||||||
| 27 | 功能 | 传输前检查对方或者自己是否已存在某些文件,提示是否覆盖。 | | 0.2.2 | 0.2.3 |
|
| 27 | 功能 | 传输前检查对方或者自己是否已存在某些文件,提示是否覆盖。 | | 0.2.2 | 0.2.3 |
|
||||||
| 26 | 功能 | 最好能保存关闭界面时Splitter和UI的尺寸。 | | 0.2.2 | |
|
| 26 | 功能 | 最好能保存关闭界面时Splitter和UI的尺寸。 | | 0.2.2 | |
|
||||||
| 25 | 功能 | 手动输入的文件夹访问路径保存历史记录,以便后续可能再次使用(10条)。 | | 0.2.2 | |
|
| 25 | 功能 | 手动输入的文件夹访问路径保存历史记录,以便后续可能再次使用(10条)。 | | 0.2.2 | |
|
||||||
| 24 | 问题 | 发送端如果发送的数据比较大,UI会卡住(功能是正常的)。 | | 0.2.2 | 0.2.3 |
|
| 24 | 问题 | 发送端如果发送的数据比较大,UI会卡住(功能是正常的)。 | | 0.2.2 | 0.2.3 |
|
||||||
| 23 | 问题 | 作为接收端如果对方断联要处理这个情况。 | | 0.2.2 | |
|
| 23 | 问题 | 作为接收端如果对方断联要处理这个情况。 | | 0.2.2 | 0.2.3 |
|
||||||
| 22 | 功能 | 配置可以切组。 | | 0.2.2 | |
|
| 22 | 功能 | 配置可以切组。 | | 0.2.2 | |
|
||||||
| 21 | 功能 | 可以传输文件夹。 | | 0.2.2 | |
|
| 21 | 功能 | 可以传输文件夹。 | | 0.2.2 | |
|
||||||
| 20 | 功能 | 对照传输可以打开本地文件夹。 | | 0.2.2 | 0.2.3 |
|
| 20 | 功能 | 对照传输可以打开本地文件夹。 | | 0.2.2 | 0.2.3 |
|
||||||
@@ -36,5 +37,5 @@
|
|||||||
| 5 | 问题 | 未设置心跳包,导致超时被Server端踢出。 | 必改 | 0.1 | 0.2 |
|
| 5 | 问题 | 未设置心跳包,导致超时被Server端踢出。 | 必改 | 0.1 | 0.2 |
|
||||||
| 4 | 问题 | 重复链接Server会崩溃。 | | 0.1 | 0.2 |
|
| 4 | 问题 | 重复链接Server会崩溃。 | | 0.1 | 0.2 |
|
||||||
| 3 | 优化 | 首次启动时应当按照当前分辨率进行初始化大小,而不是指定大小。 | | 0.1 | 0.2 |
|
| 3 | 优化 | 首次启动时应当按照当前分辨率进行初始化大小,而不是指定大小。 | | 0.1 | 0.2 |
|
||||||
| 2 | 问题 | 当某个文件传输失败的时候,关闭传输窗口,再次传输显示已经在传输中。 | | 0.1 | |
|
| 2 | 问题 | 当某个文件传输失败的时候,关闭传输窗口,再次传输显示已经在传输中。 | | 0.1 | 0.2.3 |
|
||||||
| 1 | 问题 | Console端显示未注册QSharedPointer\<FrameBuffer\>类型 | | 0.1 | 0.2 |
|
| 1 | 问题 | Console端显示未注册QSharedPointer\<FrameBuffer\>类型 | | 0.1 | 0.2 |
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ enum FrameBufferType : uint16_t {
|
|||||||
FBT_CLI_FILE_BUFFER,
|
FBT_CLI_FILE_BUFFER,
|
||||||
FBT_CLI_TRANS_DONE,
|
FBT_CLI_TRANS_DONE,
|
||||||
FBT_CLI_TRANS_FAILED,
|
FBT_CLI_TRANS_FAILED,
|
||||||
|
FBT_CLI_TRANS_INTERRUPT,
|
||||||
FBT_CLI_FILE_INFO,
|
FBT_CLI_FILE_INFO,
|
||||||
FBT_MSGINFO_ASK,
|
FBT_MSGINFO_ASK,
|
||||||
FBT_MSGINFO_ANSWER
|
FBT_MSGINFO_ANSWER
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
| frelayConsole | 控制台 | 命令行客户端,没有操作功能,一般配合另外一个带GUI的客户端使用。 |
|
| frelayConsole | 控制台 | 命令行客户端,没有操作功能,一般配合另外一个带GUI的客户端使用。 |
|
||||||
| frelayGUI | GUI | GUI客户端。 |
|
| frelayGUI | GUI | GUI客户端。 |
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
请使用版本一致的三个组件,不可混用。
|
||||||
|
|
||||||
## 免责声明与警告
|
## 免责声明与警告
|
||||||
|
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ void Server::replyRequest(QSharedPointer<ClientInfo> client, QSharedPointer<Fram
|
|||||||
if (!cl) {
|
if (!cl) {
|
||||||
auto rf = QSharedPointer<FrameBuffer>::create();
|
auto rf = QSharedPointer<FrameBuffer>::create();
|
||||||
rf->type = FBT_SER_MSG_OFFLINE;
|
rf->type = FBT_SER_MSG_OFFLINE;
|
||||||
rf->fid = id_;
|
rf->fid = frame->tid;
|
||||||
rf->tid = frame->fid;
|
rf->tid = frame->fid;
|
||||||
sendData(client->socket, rf);
|
sendData(client->socket, rf);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user