diff --git a/common.h b/common.h index 3eb3518..bd5d152 100644 --- a/common.h +++ b/common.h @@ -65,32 +65,29 @@ using namespace std; const int max_data_len=65535; const int buf_len=max_data_len+200; +const uint32_t max_handshake_conn_num=10000; +const uint32_t max_ready_conn_num=1000; +const uint32_t anti_replay_window_size=1000; +const int max_conv_num=10000; const uint32_t client_handshake_timeout=3000; -const uint32_t server_handshake_timeout=10000; +const uint32_t server_handshake_timeout=10000;// this should be much longer than clients. client retry initially ,server retry passtively + +const int conv_clear_ratio=10; //conv grabage collecter check 1/10 of all conv one time +const int conn_clear_ratio=10; -const uint32_t heartbeat_timeout=10000; -const uint32_t udp_timeout=3000; const uint32_t heartbeat_interval=1000; -const uint32_t timer_interval=500; +const uint32_t timer_interval=400;//this should be smaller than heartbeat_interval const int RETRY_TIME=3; -const uint32_t anti_replay_window_size=1000; - -const int max_conv_num=10000; const uint32_t conv_timeout=120000; //60 second -const int conv_clear_ratio=10; -const uint32_t max_handshake_conn_num=10000; -const uint32_t max_ready_conn_num=1000; - -const uint32_t conn_timeout=conv_timeout+60000; - -const int conn_clear_ratio=10; +const uint32_t client_conn_timeout=10000; +const uint32_t server_conn_timeout=conv_timeout+60000;//this should be 60s+ longer than conv_timeout,so that conv_manager can destruct convs gradually,to avoid latency glicth diff --git a/encrypt.cpp b/encrypt.cpp index 1a4c949..d54c6c9 100755 --- a/encrypt.cpp +++ b/encrypt.cpp @@ -269,7 +269,7 @@ int my_decrypt(const char *data,char *output,int &len,char * key) if(len>max_data_len) return -1; if(cipher_decrypt(data,output,len,key) !=0) {mylog(log_debug,"cipher_decrypt failed \n"); return -1;} - if(auth_verify(output,len)!=0) {mylog(log_debug,"auth_verify failed ");return -1;} + if(auth_verify(output,len)!=0) {mylog(log_debug,"auth_verify failed\n");return -1;} return 0; } diff --git a/main.cpp b/main.cpp index bb6d6b8..619a1d8 100755 --- a/main.cpp +++ b/main.cpp @@ -305,14 +305,7 @@ struct conn_info_t myexit(-1); return *this; } - ~conn_info_t() - { - if(conv_manager!=0) - delete conv_manager; - if(anti_replay!=0) - delete anti_replay; - //send_packet_info.protocol=g_packet_info_send.protocol; - } + ~conn_info_t(); };//g_conn_info; struct conn_manager_t @@ -325,11 +318,10 @@ struct conn_manager_t unordered_map const_id_mp; - unordered_map::iterator clear_it; + unordered_map mp; //put it at end so that it de-consturcts first + + unordered_map::iterator clear_it; - unordered_map mp; //put it at end so that it de-consturcts first - //uint32_t current_ready_ip; - //uint16_t current_ready_port; conn_manager_t() { ready_num=0; @@ -353,6 +345,7 @@ struct conn_manager_t } return 0; } + /* int insert(uint32_t ip,uint16_t port) { uint64_t u64=0; @@ -361,31 +354,50 @@ struct conn_manager_t u64|=port; mp[u64]; return 0; - } - conn_info_t & find(uint32_t ip,uint16_t port) //be aware,the adress may change after rehash + }*/ + conn_info_t *& find_insert_p(uint32_t ip,uint16_t port) //be aware,the adress may change after rehash { uint64_t u64=0; u64=ip; u64<<=32u; u64|=port; + unordered_map::iterator it=mp.find(u64); + if(it==mp.end()) + { + mp[u64]=new conn_info_t; + } return mp[u64]; } - int erase(unordered_map::iterator erase_it) + conn_info_t & find_insert(uint32_t ip,uint16_t port) //be aware,the adress may change after rehash { - if(erase_it->second.state.server_current_state==server_ready) + uint64_t u64=0; + u64=ip; + u64<<=32u; + u64|=port; + unordered_map::iterator it=mp.find(u64); + if(it==mp.end()) + { + mp[u64]=new conn_info_t; + } + return *mp[u64]; + } + int erase(unordered_map::iterator erase_it) + { + if(erase_it->second->state.server_current_state==server_ready) { ready_num--; - const_id_mp.erase(erase_it->second.oppsite_const_id); - timer_fd_mp.erase(erase_it->second.timer_fd); - close(erase_it->second.timer_fd);// close will auto delte it from epoll + const_id_mp.erase(erase_it->second->oppsite_const_id); + timer_fd_mp.erase(erase_it->second->timer_fd); + close(erase_it->second->timer_fd);// close will auto delte it from epoll + delete(erase_it->second); mp.erase(erase_it->first); } return 0; } int clear_inactive() { - unordered_map::iterator it; - unordered_map::iterator old_it; + unordered_map::iterator it; + unordered_map::iterator old_it; if(disable_conn_clear) return 0; @@ -406,11 +418,11 @@ int clear_inactive() it=mp.begin(); } - if(it->second.state.server_current_state==server_ready&& current_time - it->second.last_hb_recv_time <=conn_timeout ) + if(it->second->state.server_current_state==server_ready&& current_time - it->second->last_hb_recv_time <=server_conn_timeout ) { it++; } - else if(it->second.state.server_current_state!=server_ready&& current_time - it->second.last_state_time <=server_handshake_timeout ) + else if(it->second->state.server_current_state!=server_ready&& current_time - it->second->last_state_time <=server_handshake_timeout ) { it++; } @@ -428,6 +440,17 @@ int clear_inactive() }conn_manager; +conn_info_t::~conn_info_t() +{ + if(oppsite_const_id!=0) + conn_manager.const_id_mp.erase(oppsite_const_id); + if(conv_manager!=0) + delete conv_manager; + if(anti_replay!=0) + delete anti_replay; + //send_packet_info.protocol=g_packet_info_send.protocol; +} + int TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT; ////////==========================type divider======================================================= @@ -969,7 +992,7 @@ int keep_connection_client(conn_info_t &conn_info) //for client if(conn_info.state.client_current_state==client_ready) { mylog(log_trace,"time %lld %lld\n",get_current_time(),conn_info.last_state_time); - if(get_current_time()-conn_info.last_hb_recv_time>heartbeat_timeout) + if(get_current_time()-conn_info.last_hb_recv_time>client_conn_timeout) { conn_info.state.client_current_state=client_nothing; conn_info.my_id=get_true_random_number_nz(); @@ -1111,7 +1134,8 @@ int set_timer(int epollfd,int &timer_fd) mylog(log_fatal,"timer_fd create error\n"); myexit(1); } - its.it_interval.tv_nsec=timer_interval*1000ll*1000ll; + its.it_interval.tv_sec=(timer_interval/1000); + its.it_interval.tv_nsec=(timer_interval%1000)*1000ll*1000ll; its.it_value.tv_nsec=1; //imidiately timerfd_settime(timer_fd,0,&its,0); @@ -1140,7 +1164,8 @@ int set_timer_server(int epollfd,int &timer_fd) mylog(log_fatal,"timer_fd create error\n"); myexit(1); } - its.it_interval.tv_nsec=timer_interval*1000ll*1000ll; + its.it_interval.tv_sec=(timer_interval/1000); + its.it_interval.tv_nsec=(timer_interval%1000)*1000ll*1000ll; its.it_value.tv_nsec=1; //imidiately timerfd_settime(timer_fd,0,&its,0); @@ -1164,10 +1189,13 @@ int client_on_raw_recv(conn_info_t &conn_info) raw_info_t &raw_info=conn_info.raw_info; - mylog(log_debug,"i m here\n"); + + if(conn_info.state.client_current_state==client_nothing ) + { + recv_raw(raw_info,data,data_len);//todo change it to something else faster + } if(conn_info.state.client_current_state==client_syn_sent ) { - mylog(log_debug,"i m here3\n"); if(recv_bare(raw_info,data,data_len)!=0) { @@ -1205,7 +1233,6 @@ int client_on_raw_recv(conn_info_t &conn_info) if(conn_info.state.client_current_state==client_ack_sent ) { - mylog(log_debug,"i m here2\n"); if(recv_bare(raw_info,data,data_len)!=0) { mylog(log_debug,"recv_bare failed!\n"); @@ -1379,7 +1406,7 @@ int server_on_raw_ready(conn_info_t &conn_info) if (data[0] == 'h' && data_len == 1) { uint32_t tmp = ntohl(*((uint32_t *) &data[1 + sizeof(uint32_t)])); - mylog(log_debug, "received hb <%x,%x>\n", conn_info.oppsite_id, tmp); + mylog(log_debug,"[%s:%d]received hb \n",my_ntoa(recv_info.src_ip),recv_info.src_port); conn_info.last_hb_recv_time = current_time_rough; return 0; } else if (data[0] == 'd' && data_len >=int( sizeof(uint32_t) + 1)) { @@ -1387,7 +1414,7 @@ int server_on_raw_ready(conn_info_t &conn_info) conn_info.last_hb_recv_time = current_time_rough; - mylog(log_debug, "<<<>>>\n", tmp_conv_id); + mylog(log_trace, "<<<>>>\n", tmp_conv_id); if (!conn_info.conv_manager->is_conv_used(tmp_conv_id)) { if (conn_info.conv_manager->get_size() >= max_conv_num) { mylog(log_warn, @@ -1453,11 +1480,11 @@ int server_on_raw_ready(conn_info_t &conn_info) int fd = int((u64 << 32u) >> 32u); - mylog(log_debug, "received a data from fake tcp,len:%d\n", data_len); + mylog(log_trace, "received a data from fake tcp,len:%d\n", data_len); int ret = send(fd, data + 1 + sizeof(uint32_t), data_len - (1 + sizeof(uint32_t)), 0); - mylog(log_debug, "%d byte sent ,fd :%d\n ", ret, fd); + mylog(log_trace, "%d byte sent ,fd :%d\n ", ret, fd); if (ret < 0) { mylog(log_warn, "send returned %d\n", ret); //perror("what happened????"); @@ -1506,7 +1533,7 @@ int server_on_raw_recv_multi() return 0; } } - conn_info_t &conn_info=conn_manager.find(ip,port); + conn_info_t &conn_info=conn_manager.find_insert(ip,port); conn_info.raw_info=tmp_raw_info; packet_info_t &send_info=conn_info.raw_info.send_info; packet_info_t &recv_info=conn_info.raw_info.recv_info; @@ -1560,7 +1587,7 @@ int server_on_raw_recv_multi() mylog(log_info,"reached max_handshake_conn_num,ignored new handshake\n"); return 0; } - conn_info_t & conn_info=conn_manager.find(ip,port);//insert if not exist + conn_info_t & conn_info=conn_manager.find_insert(ip,port);//insert if not exist packet_info_t &send_info=conn_info.raw_info.send_info; packet_info_t &recv_info=conn_info.raw_info.recv_info; @@ -1615,7 +1642,7 @@ int server_on_raw_recv_multi() return 0; } - mylog(log_debug,"!!!\n"); + //mylog(log_debug,"!!!\n"); uint32_t tmp_session_id= ntohl(* ((uint32_t *)&data[sizeof(id_t)])); uint32_t tmp_oppsite_const_id=ntohl(* ((uint32_t *)&data[sizeof(id_t)*2])); @@ -1653,6 +1680,7 @@ int server_on_raw_recv_multi() conn_info.state.server_current_state = server_ready; conn_info.oppsite_const_id=tmp_oppsite_const_id; conn_manager.ready_num++; + conn_manager.const_id_mp[tmp_oppsite_const_id]=&conn_info; //conn_info.last_state_time=get_current_time(); //dont change this!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1697,19 +1725,36 @@ int server_on_raw_recv_multi() { mylog(log_info,"conn_info.last_state_timere_init(); + + + conn_info.state.server_current_state=server_nothing; + conn_info.oppsite_const_id=0; + + + } else { @@ -2370,7 +2415,7 @@ int server_event_loop() int recv_len=recv(fd,buf,buf_len,0); - mylog(log_debug,"received a packet from udp_fd,len:%d\n",recv_len); + mylog(log_trace,"received a packet from udp_fd,len:%d\n",recv_len); if(recv_len<0) { diff --git a/network.cpp b/network.cpp index 3de88da..0dd68d6 100644 --- a/network.cpp +++ b/network.cpp @@ -514,7 +514,7 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { packet_info_t &send_info=raw_info.send_info; packet_info_t &recv_info=raw_info.recv_info; - mylog(log_debug,"syn %d\n",send_info.syn); + //mylog(log_debug,"syn %d\n",send_info.syn); char send_raw_tcp_buf0[buf_len]; char *send_raw_tcp_buf=send_raw_tcp_buf0;