@@ -39,6 +39,7 @@ void DogCom::print_packet(const char msg[], const unsigned char *packet, int len
39
39
40
40
void DogCom::run ()
41
41
{
42
+ // 每一个ReportOffline后边都跟着一个return语句,防止程序逻辑混乱
42
43
// qDebug()<<"account:"<<account;
43
44
// qDebug()<<"password:"<<password;
44
45
// qDebug()<<"mac_addr:"<<mac_addr;
@@ -52,9 +53,8 @@ void DogCom::run()
52
53
PORT_BIND)){
53
54
qDebug ()<<" Bind Failed!" ;
54
55
qDebug ()<<udp_sender.error ();
55
- emit ReportOffline (OFF_BIND_FAILED);
56
56
// 清理操作
57
- sleeper-> Interrupt ( );
57
+ emit ReportOffline (OFF_BIND_FAILED );
58
58
udp_sender.close ();
59
59
return ;
60
60
}else {
@@ -65,24 +65,24 @@ void DogCom::run()
65
65
unsigned char auth_information[16 ];
66
66
if (!dhcp_challenge (udp_sender,seed)){
67
67
emit ReportOffline (OFF_CHALLENGE_FAILED);
68
+ udp_sender.close ();
69
+ return ;
68
70
}else {
69
71
// challenge成功 开始登录
70
72
qDebug ()<<" trying to login..." ;
71
- // 此时还没有确定在线,用户不能执行注销操作
72
- // 因此可以放心地使用Sleep而不必担心被Interrupt
73
73
sleeper->Sleep (200 );// 0.2 sec
74
74
qDebug ()<<" Wait for 0.2 second done." ;
75
75
int offLineReason;
76
76
if ((offLineReason=dhcp_login (udp_sender,seed,auth_information))==-1 ){
77
77
// 登录成功
78
78
emit ReportOnline ();
79
79
int keepalive_counter = 0 ;
80
- int keepalive_try_counter = 0 ;
81
80
int first = 1 ;
82
81
while (true ) {
83
82
if (udp_sender.state ()!=QUdpSocket::BoundState){
84
83
emit ReportOffline (OFF_TIMEOUT);
85
- break ;
84
+ udp_sender.close ();
85
+ return ;
86
86
}
87
87
if (!keepalive_1 (udp_sender, auth_information)) {
88
88
sleeper->Sleep (200 ); // 0.2 second
@@ -93,32 +93,23 @@ void DogCom::run()
93
93
if (!sleeper->Sleep (20000 )){
94
94
qDebug ()<<" Interruptted by user" ;
95
95
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 ();
107
96
udp_sender.close ();
108
97
return ;
109
98
}
110
- keepalive_try_counter++;
111
- continue ;
99
+ } else {
100
+ // 清理操作
101
+ emit ReportOffline (OFF_TIMEOUT);
102
+ udp_sender.close ();
103
+ return ;
112
104
}
113
105
}
114
106
}else {
115
107
// 登录失败,提示用户失败原因
116
108
emit ReportOffline (offLineReason);
109
+ udp_sender.close ();
110
+ return ;
117
111
}
118
112
}
119
- // 清理操作
120
- sleeper->Interrupt ();
121
- udp_sender.close ();
122
113
}
123
114
124
115
bool DogCom::dhcp_challenge (QUdpSocket &udp_sender, unsigned char seed[])
@@ -138,7 +129,7 @@ bool DogCom::dhcp_challenge(QUdpSocket &udp_sender, unsigned char seed[])
138
129
print_packet (" [Challenge sent]" , challenge_packet, 20 );
139
130
140
131
qDebug ()<<" reading from dest..." ;
141
- udp_sender.waitForReadyRead (1000 );
132
+ udp_sender.waitForReadyRead (1500 );
142
133
if (udp_sender.readDatagram ((char *)recv_packet,1024 ,server_address,&port_dest)<=0 ){
143
134
qDebug ()<<" Failed to recv" ;
144
135
qDebug ()<<udp_sender.error ();
@@ -331,7 +322,7 @@ int DogCom::dhcp_login(QUdpSocket &udp_sender, unsigned char seed[], unsigned ch
331
322
udp_sender.writeDatagram ((const char *)login_packet,login_packet_size,*server_address,port_dest);
332
323
print_packet (" [Login sent]" ,login_packet,login_packet_size);
333
324
334
- udp_sender.waitForReadyRead (1000 );
325
+ udp_sender.waitForReadyRead (1500 ); // 注意这个包来得特别慢。。。。。。其他都等100ms就可以了这个500ms都不行。。。。。。
335
326
if (udp_sender.readDatagram ((char *)recv_packet,1024 ,server_address,&port_dest)<=0 ){
336
327
qDebug ()<<udp_sender.error ();
337
328
qDebug ()<<" Failed to recv data" ;
@@ -377,7 +368,7 @@ int DogCom::keepalive_1(QUdpSocket &udp_sender, unsigned char auth_information[]
377
368
udp_sender.writeDatagram ((const char *)keepalive_1_packet1,8 ,*server_address,port_dest);
378
369
print_packet (" [Keepalive1 sent]" ,keepalive_1_packet1,42 );
379
370
while (1 ) {
380
- udp_sender.waitForReadyRead ();
371
+ udp_sender.waitForReadyRead (1500 );
381
372
if (udp_sender.readDatagram ((char *)recv_packet1,1024 ,server_address,&port_dest)<=0 ){
382
373
qDebug ()<<" Failed to recv data" ;
383
374
qDebug ()<<udp_sender.error ();
@@ -411,7 +402,7 @@ int DogCom::keepalive_1(QUdpSocket &udp_sender, unsigned char auth_information[]
411
402
412
403
udp_sender.writeDatagram ((const char *)keepalive_1_packet2,42 ,*server_address,port_dest);
413
404
414
- udp_sender.waitForReadyRead ();
405
+ udp_sender.waitForReadyRead (1500 );
415
406
if (udp_sender.readDatagram ((char *)recv_packet2,1024 ,server_address,&port_dest)<=0 ){
416
407
qDebug ()<<" Failed to recv data" ;
417
408
qDebug ()<<udp_sender.error ();
@@ -440,7 +431,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
440
431
udp_sender.writeDatagram ((const char *)keepalive_2_packet,40 ,*server_address,port_dest);
441
432
442
433
print_packet (" [Keepalive2_file sent]" ,keepalive_2_packet,40 );
443
- udp_sender.waitForReadyRead ();
434
+ udp_sender.waitForReadyRead (1500 );
444
435
if (udp_sender.readDatagram ((char *)recv_packet,1024 ,server_address,&port_dest)<=0 ){
445
436
qDebug ()<<udp_sender.error ();
446
437
qDebug ()<<" Failed to recv data" ;
@@ -470,7 +461,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
470
461
471
462
print_packet (" [Keepalive2_A sent]" ,keepalive_2_packet,40 );
472
463
473
- udp_sender.waitForReadyRead ();
464
+ udp_sender.waitForReadyRead (1500 );
474
465
if (udp_sender.readDatagram ((char *)recv_packet,1024 ,server_address,&port_dest)<=0 ){
475
466
qDebug ()<<udp_sender.error ();
476
467
qDebug ()<<" Failed to recv data" ;
@@ -496,7 +487,7 @@ int DogCom::keepalive_2(QUdpSocket &udp_sender, int *keepalive_counter, int *fir
496
487
497
488
print_packet (" [Keepalive2_C sent]" ,keepalive_2_packet,40 );
498
489
499
- udp_sender.waitForReadyRead ();
490
+ udp_sender.waitForReadyRead (1500 );
500
491
if (udp_sender.readDatagram ((char *)recv_packet,1024 ,server_address,&port_dest)<=0 ){
501
492
qDebug ()<<udp_sender.error ();
502
493
qDebug ()<<" Failed to recv data" ;
0 commit comments