From b0c8448fdf88c1d21a750cdd51697ba165a3f43c Mon Sep 17 00:00:00 2001 From: wangyu Date: Mon, 31 Jul 2017 19:50:05 +0800 Subject: [PATCH] fixed sed ack_seq of faketcp mode --- main.cpp | 33 +++++++++++++++++++++++++++++++-- network.cpp | 5 +++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 629701f..c828db0 100755 --- a/main.cpp +++ b/main.cpp @@ -976,6 +976,7 @@ int keep_connection_client(conn_info_t &conn_info) //for client } if(conn_info.state.client_current_state==client_syn_sent ) { + assert(raw_mode==mode_faketcp); if(get_current_time()-conn_info.last_state_time>client_handshake_timeout) { conn_info.state.client_current_state=client_nothing; @@ -985,6 +986,7 @@ int keep_connection_client(conn_info_t &conn_info) //for client else if(get_current_time()-conn_info.last_hb_sent_time>client_retry_interval) { mylog(log_info,"retry send sync\n"); + send_info.seq=send_info.first_seq; send_bare(raw_info,0,0); /////////////send conn_info.last_hb_sent_time=get_current_time(); } @@ -1002,6 +1004,8 @@ int keep_connection_client(conn_info_t &conn_info) //for client { if(raw_mode==mode_faketcp) { + send_info.seq=send_info.first_seq+1; + send_info.ack_seq=send_info.first_ack_seq; send_bare(raw_info,0,0);/////////////send } else if(raw_mode==mode_udp||raw_mode==mode_icmp) @@ -1262,7 +1266,15 @@ int client_on_raw_recv(conn_info_t &conn_info) return 0; } + if(recv_info.ack_seq!=send_info.first_seq+1) + { + mylog(log_info,"unexpected ack_seq:%d ,should be %d\n",recv_info.ack_seq,send_info.first_seq+1); + return 0; + } + send_info.ack_seq=recv_info.seq+1; + send_info.first_ack_seq=send_info.ack_seq; + send_info.psh=0; send_info.syn=0; send_info.ack=1; @@ -1304,7 +1316,8 @@ int client_on_raw_recv(conn_info_t &conn_info) printf("not a heartbeat\n"); return 0; }*/ - + send_info.seq=send_info.first_seq+1; + send_info.ack_seq=send_info.first_ack_seq; conn_info.oppsite_id= ntohl(* ((uint32_t *)&data[0])); @@ -1830,9 +1843,22 @@ int server_on_raw_recv_multi() if( recv_info.syn==0&&recv_info.ack==1 &&data_len==0) //received ack as expect { + if(recv_info.ack_seq!=send_info.first_seq+1) + { + mylog(log_info,"[%s]unexpect ack_seq %d,should be\n",ip_port,recv_info.ack_seq,send_info.first_seq+1); + return 0; + } + if(recv_info.seq!=send_info.first_ack_seq) + { + mylog(log_info,"[%s]unexpect seq %d,should be\n",ip_port,recv_info.seq,send_info.first_ack_seq); + return 0; + } send_info.syn=0; send_info.ack=1; - send_info.seq+=1;////////is this right? + //send_info.seq+=1;////////is this right? + + send_info.seq=send_info.first_seq+1; + send_info.ack_seq=send_info.first_ack_seq; conn_info.my_id=get_true_random_number_nz(); send_handshake(raw_info,conn_info.my_id,0,const_id); //////////////send @@ -1877,6 +1903,9 @@ int server_on_raw_recv_multi() send_info.syn=0; send_info.ack=1; + send_info.seq=send_info.first_seq+1; + send_info.ack_seq=send_info.first_ack_seq; + conn_info.my_id=get_true_random_number_nz(); mylog(log_info,"[%s]re-sent handshake\n",ip_port); send_handshake(raw_info,conn_info.my_id,0,const_id); diff --git a/network.cpp b/network.cpp index 12f444f..aa582aa 100644 --- a/network.cpp +++ b/network.cpp @@ -1061,6 +1061,11 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) payloadlen = ip_payloadlen-tcphdrlen; payload=tcp_begin+tcphdrlen; + + if (recv_info.syn == 0 && recv_info.ack == 1&& payloadlen != 0) //only modify send_info when the packet is not part of handshake + { + send_info.ack_seq=recv_info.seq; + } return 0; } /*