Skip to content

Commit 9cbe0fd

Browse files
committed
更新到v1.0.0.4
1 parent 41770bb commit 9cbe0fd

9 files changed

+128
-73
lines changed

DrCOM_JLU_Qt.pro

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,13 @@ RESOURCES += \
6363
include(singleinstance/singleapplication.pri)
6464
DEFINES += QAPPLICATION_CLASS=QApplication
6565

66-
VERSION = 1.0.0.2
66+
VERSION = 1.0.0.4
6767

6868
# 更新日志:
6969
# v 0.0.0.0 实现基本功能
7070
# v 1.0.0.1 修复适配高DPI时只窗口大小适配但字号不适配的bug
7171
# v 1.0.0.2 增加重启功能(能解决一些网络的错误
7272
# 调整字体为微软雅黑10号(就是win下正常的字体
73+
# v 1.0.0.3 没有这个版本,上次该发布0.2版本时候压缩包名字打错了。。。应该为1.0.0.2的,所以跳过这个版本号
74+
# v 1.0.0.4 优化用户体验,调整掉线时的提示信息,增加掉线时直接重启客户端的提示
7375

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,8 @@ v 0.0.0.0 实现基本功能
8383
v 1.0.0.1 修复适配高DPI时只窗口大小适配但字号不适配的bug
8484

8585
v 1.0.0.2 增加重启功能,调整字体为微软雅黑10号
86+
87+
v 1.0.0.3 没有这个版本,上次该发布0.2版本时候压缩包名字打错了。。。应该为1.0.0.2的,所以跳过这个版本号
88+
89+
v 1.0.0.4 优化用户体验,调整掉线时的提示信息,增加掉线时直接重启客户端的提示
90+

dogcom.cpp

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void DogCom::print_packet(const char msg[], const unsigned char *packet, int len
3939

4040
void DogCom::run()
4141
{
42+
// 每一个ReportOffline后边都跟着一个return语句,防止程序逻辑混乱
4243
// qDebug()<<"account:"<<account;
4344
// qDebug()<<"password:"<<password;
4445
// qDebug()<<"mac_addr:"<<mac_addr;
@@ -52,9 +53,8 @@ void DogCom::run()
5253
PORT_BIND)){
5354
qDebug()<<"Bind Failed!";
5455
qDebug()<<udp_sender.error();
55-
emit ReportOffline(OFF_BIND_FAILED);
5656
// 清理操作
57-
sleeper->Interrupt();
57+
emit ReportOffline(OFF_BIND_FAILED);
5858
udp_sender.close();
5959
return;
6060
}else{
@@ -65,24 +65,24 @@ void DogCom::run()
6565
unsigned char auth_information[16];
6666
if(!dhcp_challenge(udp_sender,seed)){
6767
emit ReportOffline(OFF_CHALLENGE_FAILED);
68+
udp_sender.close();
69+
return;
6870
}else{
6971
//challenge成功 开始登录
7072
qDebug()<<"trying to login...";
71-
// 此时还没有确定在线,用户不能执行注销操作
72-
// 因此可以放心地使用Sleep而不必担心被Interrupt
7373
sleeper->Sleep(200);// 0.2 sec
7474
qDebug()<<"Wait for 0.2 second done.";
7575
int offLineReason;
7676
if((offLineReason=dhcp_login(udp_sender,seed,auth_information))==-1){
7777
// 登录成功
7878
emit ReportOnline();
7979
int keepalive_counter = 0;
80-
int keepalive_try_counter = 0;
8180
int first = 1;
8281
while (true) {
8382
if(udp_sender.state()!=QUdpSocket::BoundState){
8483
emit ReportOffline(OFF_TIMEOUT);
85-
break;
84+
udp_sender.close();
85+
return;
8686
}
8787
if (!keepalive_1(udp_sender, auth_information)) {
8888
sleeper->Sleep(200); // 0.2 second
@@ -93,32 +93,23 @@ void DogCom::run()
9393
if(!sleeper->Sleep(20000)){
9494
qDebug()<<"Interruptted by user";
9595
emit ReportOffline(OFF_USER_LOGOUT);
96-
break;
97-
}
98-
} else {
99-
// 这个 keepalive_try_counter 在这里貌似没什么用,因为Qt的QUdpSocket有一个state特别敏感
100-
// 明明网线啥的都没问题就说当前是UnconnectedStat状态然后还不给你自动重连
101-
// 所以外层循环先给判断了一下当前状态,如果这玩意报告说掉线了那就直接退出循环发包
102-
// 另: 目前测试还没有遇到过外层state正常然后里边keepalive_try_counter增加计数的情况
103-
if (keepalive_try_counter > 3) {
104-
// 清理操作
105-
emit ReportOffline(OFF_TIMEOUT);
106-
sleeper->Interrupt();
10796
udp_sender.close();
10897
return;
10998
}
110-
keepalive_try_counter++;
111-
continue;
99+
} else {
100+
// 清理操作
101+
emit ReportOffline(OFF_TIMEOUT);
102+
udp_sender.close();
103+
return;
112104
}
113105
}
114106
}else{
115107
// 登录失败,提示用户失败原因
116108
emit ReportOffline(offLineReason);
109+
udp_sender.close();
110+
return;
117111
}
118112
}
119-
// 清理操作
120-
sleeper->Interrupt();
121-
udp_sender.close();
122113
}
123114

124115
bool DogCom::dhcp_challenge(QUdpSocket &udp_sender, unsigned char seed[])
@@ -138,7 +129,7 @@ bool DogCom::dhcp_challenge(QUdpSocket &udp_sender, unsigned char seed[])
138129
print_packet("[Challenge sent]", challenge_packet, 20);
139130

140131
qDebug()<<"reading from dest...";
141-
udp_sender.waitForReadyRead(1000);
132+
udp_sender.waitForReadyRead(1500);
142133
if(udp_sender.readDatagram((char*)recv_packet,1024,server_address,&port_dest)<=0){
143134
qDebug()<<"Failed to recv";
144135
qDebug()<<udp_sender.error();
@@ -331,7 +322,7 @@ int DogCom::dhcp_login(QUdpSocket &udp_sender, unsigned char seed[], unsigned ch
331322
udp_sender.writeDatagram((const char*)login_packet,login_packet_size,*server_address,port_dest);
332323
print_packet("[Login sent]",login_packet,login_packet_size);
333324

334-
udp_sender.waitForReadyRead(1000);
325+
udp_sender.waitForReadyRead(1500); // 注意这个包来得特别慢。。。。。。其他都等100ms就可以了这个500ms都不行。。。。。。
335326
if(udp_sender.readDatagram((char*)recv_packet,1024,server_address,&port_dest)<=0){
336327
qDebug()<<udp_sender.error();
337328
qDebug()<<"Failed to recv data";
@@ -377,7 +368,7 @@ int DogCom::keepalive_1(QUdpSocket &udp_sender, unsigned char auth_information[]
377368
udp_sender.writeDatagram((const char*)keepalive_1_packet1,8,*server_address,port_dest);
378369
print_packet("[Keepalive1 sent]",keepalive_1_packet1,42);
379370
while (1) {
380-
udp_sender.waitForReadyRead();
371+
udp_sender.waitForReadyRead(1500);
381372
if(udp_sender.readDatagram((char*)recv_packet1,1024,server_address,&port_dest)<=0){
382373
qDebug()<<"Failed to recv data";
383374
qDebug()<<udp_sender.error();
@@ -411,7 +402,7 @@ int DogCom::keepalive_1(QUdpSocket &udp_sender, unsigned char auth_information[]
411402

412403
udp_sender.writeDatagram((const char*)keepalive_1_packet2,42,*server_address,port_dest);
413404

414-
udp_sender.waitForReadyRead();
405+
udp_sender.waitForReadyRead(1500);
415406
if(udp_sender.readDatagram((char*)recv_packet2,1024,server_address,&port_dest)<=0){
416407
qDebug()<<"Failed to recv data";
417408
qDebug()<<udp_sender.error();
@@ -440,7 +431,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
440431
udp_sender.writeDatagram((const char*)keepalive_2_packet,40,*server_address,port_dest);
441432

442433
print_packet("[Keepalive2_file sent]",keepalive_2_packet,40);
443-
udp_sender.waitForReadyRead();
434+
udp_sender.waitForReadyRead(1500);
444435
if(udp_sender.readDatagram((char*)recv_packet,1024,server_address,&port_dest)<=0){
445436
qDebug()<<udp_sender.error();
446437
qDebug()<<"Failed to recv data";
@@ -470,7 +461,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
470461

471462
print_packet("[Keepalive2_A sent]",keepalive_2_packet,40);
472463

473-
udp_sender.waitForReadyRead();
464+
udp_sender.waitForReadyRead(1500);
474465
if(udp_sender.readDatagram((char*)recv_packet,1024,server_address,&port_dest)<=0){
475466
qDebug()<<udp_sender.error();
476467
qDebug()<<"Failed to recv data";
@@ -496,7 +487,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
496487

497488
print_packet("[Keepalive2_C sent]",keepalive_2_packet,40);
498489

499-
udp_sender.waitForReadyRead();
490+
udp_sender.waitForReadyRead(1500);
500491
if(udp_sender.readDatagram((char*)recv_packet,1024,server_address,&port_dest)<=0){
501492
qDebug()<<udp_sender.error();
502493
qDebug()<<"Failed to recv data";

dogcomcontroller.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ DogcomController::DogcomController()
1212
}
1313

1414
void DogcomController::Login(const QString &account,const QString &password,const QString &mac_addr){
15-
qDebug()<<"Resetting sleeper...";
16-
sleeper->Reset();
17-
qDebug()<<"Reset sleeper done.";
1815
qDebug()<<"Filling config...";
1916
dogcom->FillConfig(account,password,mac_addr);
2017
qDebug()<<"Fill config done.";

interruptiblesleeper.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
#include "interruptiblesleeper.h"
2+
#include <QDebug>
23

34
InterruptibleSleeper::InterruptibleSleeper(QObject *parent) : QObject(parent)
45
{
6+
qDebug()<<"InterruptibleSleepe Constructor";
57
}
68

79
bool InterruptibleSleeper::Sleep(int timeout)
810
{
9-
return !m.tryLock(timeout);
10-
//获取到锁 睡眠失败 被中断了
11-
//未获取到锁 睡眠成功 没有被中断
12-
}
13-
14-
void InterruptibleSleeper::Reset(){
15-
m.lock();
11+
qDebug()<<"tryLock...";
12+
m.tryLock();
13+
qDebug()<<"locked!";
14+
qDebug()<<"tryLock for"<<timeout<<"millseconds...";
15+
if(m.tryLock(timeout)){
16+
qDebug()<<"Interrupted! lock succeed";
17+
//获取到锁 睡眠失败 被中断了
18+
return false;
19+
}else{
20+
qDebug()<<"lock failed! sleep succeed";
21+
//未获取到锁 睡眠成功 没有被中断
22+
m.unlock();
23+
return true;
24+
}
1625
}
1726

1827
void InterruptibleSleeper::Interrupt(){

interruptiblesleeper.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
/**
88
* @brief The InterruptibleSleeper class
9-
* 使用说明:先Reset,然后Sleep指定时长即可,单位是ms
9+
* 使用说明:直接Sleep指定时长即可,单位是ms
1010
* 中止后台时调用Interrupt,会立即响应
11-
* Interrupt之后想重新用,再Reset一下,然后Sleep指定时长即可
11+
* 通过判断Sleep的返回值确定是否被中断,true即睡眠成功未被中断,false即被中断
1212
*/
1313
class InterruptibleSleeper : public QObject
1414
{
@@ -17,7 +17,6 @@ class InterruptibleSleeper : public QObject
1717
explicit InterruptibleSleeper(QObject *parent = nullptr);
1818
// 睡眠成功返回 true 被中断返回 false
1919
bool Sleep(int timeout);
20-
void Reset();
2120
void Interrupt();
2221

2322
private:

mainwindow.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,18 @@ void MainWindow::HandleOffline(int reason)
299299
break;
300300
}
301301
case OFF_CHALLENGE_FAILED:{
302-
QMessageBox::critical(this,tr("Login failed"),tr("Challenge failed. Please check your connection:)"));
302+
// 弹出一个提示框,带一个直接重启客户端的按钮
303+
QMessageBox msgBox;
304+
msgBox.setText(tr("Login failed")+" "+tr("Challenge failed. Please check your connection:)")+" "+
305+
tr("Attention that you should connect to wifi or wired firstly and then start the drcom client. If you have connected, you may restart drcom to solve the problem.")
306+
+" "+tr("Restart DrCOM?"));
307+
QAbstractButton *pButtonYes=msgBox.addButton(tr("Yes"),QMessageBox::YesRole);
308+
msgBox.addButton(tr("Nope"),QMessageBox::NoRole);
309+
msgBox.exec();
310+
if(msgBox.clickedButton()==pButtonYes){
311+
qDebug()<<"Restart DrCOM confirmed";
312+
RestartDrcom();
313+
}
303314
break;
304315
}
305316
case OFF_CHECK_MAC:{
@@ -347,7 +358,18 @@ void MainWindow::HandleOffline(int reason)
347358
break;
348359
}
349360
case OFF_TIMEOUT:{
350-
QMessageBox::critical(this,tr("You have been offline"),tr("Time out, please check your connection"));
361+
// 弹出一个提示框,带一个直接重启客户端的按钮
362+
QMessageBox msgBox;
363+
msgBox.setText(tr("You have been offline")+" "+tr("Time out, please check your connection")
364+
+" "+tr("Due to some reasons, you should connect to wifi or wired firstly and then start the drcom client. So you may not login until you restart DrCOM :D")
365+
+" "+tr("Restart DrCOM?"));
366+
QAbstractButton *pButtonYes=msgBox.addButton(tr("Yes"),QMessageBox::YesRole);
367+
msgBox.addButton(tr("Nope"),QMessageBox::NoRole);
368+
msgBox.exec();
369+
if(msgBox.clickedButton()==pButtonYes){
370+
qDebug()<<"Restart DrCOM confirmed";
371+
RestartDrcom();
372+
}
351373
break;
352374
}
353375
case OFF_UNKNOWN:
@@ -368,6 +390,8 @@ void MainWindow::HandleOffline(int reason)
368390
SetIcon(false);
369391
// 禁用注销按钮
370392
DisableLogOutButton(true);
393+
// 显示出窗口
394+
ShowLoginWindow();
371395
}
372396

373397
void MainWindow::HandleLoggedIn()

ts/DrCOM_zh_CN.qm

787 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)