@@ -39,6 +39,7 @@ void DogCom::print_packet(const char msg[], const unsigned char *packet, int len
3939
4040void 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
124115bool 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" ;
0 commit comments