removed fd sn

This commit is contained in:
wangyu 2017-07-28 11:31:37 +08:00 committed by wangyu
parent 52358117e6
commit e89d7649b6

@ -112,10 +112,12 @@ const int disable_conv_clear=0;
int seq_mode=2; //0 dont increase /1 increase //increase randomly,about every 5 packet int seq_mode=2; //0 dont increase /1 increase //increase randomly,about every 5 packet
/*
const uint64_t epoll_timer_fd_sn=1; const uint64_t epoll_timer_fd_sn=1;
const uint64_t epoll_raw_recv_fd_sn=2; const uint64_t epoll_raw_recv_fd_sn=2;
const uint64_t epoll_udp_fd_sn_begin=0xFFFFFFFFllu+1; const uint64_t epoll_udp_fd_sn_begin=0xFFFFFFFFllu+1;
uint64_t epoll_udp_fd_sn=epoll_udp_fd_sn_begin; //all udp_fd_sn > max uint32 uint64_t epoll_udp_fd_sn=epoll_udp_fd_sn_begin; //all udp_fd_sn > max uint32
*/
enum server_current_state_t {server_nothing=0,server_syn_ack_sent,server_handshake_sent,server_ready}; enum server_current_state_t {server_nothing=0,server_syn_ack_sent,server_handshake_sent,server_ready};
enum client_current_state_t {client_nothing=0,client_syn_sent,client_ack_sent,client_handshake_sent,client_ready}; enum client_current_state_t {client_nothing=0,client_syn_sent,client_ack_sent,client_handshake_sent,client_ready};
@ -127,6 +129,7 @@ int raw_send_fd=-1;
int bind_fd=-1; int bind_fd=-1;
int epollfd=-1; int epollfd=-1;
int random_number_fd=-1; int random_number_fd=-1;
int timer_fd=-1;
char key_string[1000]= "secret key"; char key_string[1000]= "secret key";
@ -335,7 +338,7 @@ uint64_t get_current_time();
void server_clear_function(uint64_t u64);
struct conv_manager_t //TODO change map to unordered map struct conv_manager_t //TODO change map to unordered map
{ {
//typedef hash_map map; //typedef hash_map map;
@ -349,36 +352,29 @@ struct conv_manager_t //TODO change map to unordered map
unordered_map<uint32_t,uint64_t>::iterator it; unordered_map<uint32_t,uint64_t>::iterator it;
unordered_map<uint32_t,uint64_t>::iterator old_it; unordered_map<uint32_t,uint64_t>::iterator old_it;
void (*clear_function)(uint64_t u64) ; //void (*clear_function)(uint64_t u64) ;
conv_manager_t() conv_manager_t()
{ {
clear_it=conv_last_active_time.begin(); clear_it=conv_last_active_time.begin();
clear_function=0; //clear_function=0;
} }
int get_size() int get_size()
{ {
return conv_to_u64.size(); return conv_to_u64.size();
} }
void set_clear_function(void (*a)(uint64_t u64))
{
clear_function=a;
u64_to_conv.reserve(100007);
conv_to_u64.reserve(100007);
conv_last_active_time.reserve(100007);
}
void clear() void clear()
{ {
if(disable_conv_clear) return ; if(disable_conv_clear) return ;
if(clear_function!=0) if(program_mode==server_mode)
{ {
for(it=conv_to_u64.begin();it!=conv_to_u64.end();it++) for(it=conv_to_u64.begin();it!=conv_to_u64.end();it++)
{ {
//int fd=int((it->second<<32u)>>32u); //int fd=int((it->second<<32u)>>32u);
clear_function( it->second); server_clear_function( it->second);
} }
} }
u64_to_conv.clear(); u64_to_conv.clear();
@ -428,9 +424,9 @@ struct conv_manager_t //TODO change map to unordered map
{ {
if(disable_conv_clear) return 0; if(disable_conv_clear) return 0;
uint64_t u64=conv_to_u64[conv]; uint64_t u64=conv_to_u64[conv];
if(clear_function!=0) if(program_mode==server_mode)
{ {
clear_function(u64); server_clear_function(u64);
} }
conv_to_u64.erase(conv); conv_to_u64.erase(conv);
u64_to_conv.erase(u64); u64_to_conv.erase(u64);
@ -1063,7 +1059,7 @@ int peek_raw(uint32_t &ip,uint16_t &port)
struct tcphdr *tcph=(tcphdr *)payload; struct tcphdr *tcph=(tcphdr *)payload;
if(recv_len<iphdrlen+sizeof(tcphdr)) if(recv_len<iphdrlen+sizeof(tcphdr))
return -1; return -1;
port=ntohs(tcph->dest); port=ntohs(tcph->source);
break; break;
} }
case mode_udp: case mode_udp:
@ -1072,7 +1068,7 @@ int peek_raw(uint32_t &ip,uint16_t &port)
struct udphdr *udph=(udphdr *)payload; struct udphdr *udph=(udphdr *)payload;
if(recv_len<iphdrlen+sizeof(udphdr)) if(recv_len<iphdrlen+sizeof(udphdr))
return -1; return -1;
port=ntohs(udph->dest); port=ntohs(udph->source);
break; break;
} }
case mode_icmp: case mode_icmp:
@ -2611,7 +2607,7 @@ int set_timer(int epollfd,int &timer_fd)
ev.events = EPOLLIN; ev.events = EPOLLIN;
ev.data.u64 = epoll_timer_fd_sn; ev.data.u64 = timer_fd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, timer_fd, &ev); epoll_ctl(epollfd, EPOLL_CTL_ADD, timer_fd, &ev);
if (ret < 0) { if (ret < 0) {
@ -2874,6 +2870,7 @@ int server_on_raw_ready()
mylog(log_warn, "create udp_fd error\n"); mylog(log_warn, "create udp_fd error\n");
return -1; return -1;
} }
setnonblocking(new_udp_fd);
set_buf_size(new_udp_fd); set_buf_size(new_udp_fd);
mylog(log_debug, "created new udp_fd %d\n", new_udp_fd); mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
@ -2886,8 +2883,7 @@ int server_on_raw_ready()
} }
struct epoll_event ev; struct epoll_event ev;
uint64_t u64 = ((u_int64_t(tmp_conv_id)) << 32u) uint64_t u64 = new_udp_fd;
+ (uint32_t) new_udp_fd;
mylog(log_trace, "u64: %ld\n", u64); mylog(log_trace, "u64: %ld\n", u64);
ev.events = EPOLLIN; ev.events = EPOLLIN;
@ -2906,6 +2902,8 @@ int server_on_raw_ready()
mylog(log_info, "new conv conv_id=%x, assigned fd=%d\n", mylog(log_info, "new conv conv_id=%x, assigned fd=%d\n",
tmp_conv_id, new_udp_fd); tmp_conv_id, new_udp_fd);
} }
uint64_t u64 = conv_manager.find_u64_by_conv(tmp_conv_id); uint64_t u64 = conv_manager.find_u64_by_conv(tmp_conv_id);
@ -3496,14 +3494,14 @@ int client_event_loop()
} }
ev.events = EPOLLIN; ev.events = EPOLLIN;
ev.data.u64 = epoll_udp_fd_sn; ev.data.u64 = udp_fd;
ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, udp_fd, &ev); ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, udp_fd, &ev);
if (ret!=0) { if (ret!=0) {
mylog(log_fatal,"add udp_listen_fd error\n"); mylog(log_fatal,"add udp_listen_fd error\n");
myexit(-1); myexit(-1);
} }
ev.events = EPOLLIN; ev.events = EPOLLIN;
ev.data.u64 = epoll_raw_recv_fd_sn; ev.data.u64 = raw_recv_fd;
ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev); ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev);
if (ret!= 0) { if (ret!= 0) {
@ -3517,7 +3515,7 @@ int client_event_loop()
//memset(&udp_old_addr_in,0,sizeof(sockaddr_in)); //memset(&udp_old_addr_in,0,sizeof(sockaddr_in));
int unbind=1; int unbind=1;
int timer_fd;
set_timer(epollfd,timer_fd); set_timer(epollfd,timer_fd);
@ -3531,26 +3529,26 @@ int client_event_loop()
} }
int n; int n;
for (n = 0; n < nfds; ++n) { for (n = 0; n < nfds; ++n) {
if (events[n].data.u64 == epoll_raw_recv_fd_sn) if (events[n].data.u64 == raw_recv_fd)
{ {
iphdr *iph;tcphdr *tcph; iphdr *iph;tcphdr *tcph;
client_on_raw_recv(); client_on_raw_recv();
} }
if(events[n].data.u64 ==epoll_timer_fd_sn) if(events[n].data.u64 ==timer_fd)
{ {
uint64_t value; uint64_t value;
read(timer_fd, &value, 8); read(timer_fd, &value, 8);
keep_connection_client(); keep_connection_client();
} }
if (events[n].data.u64 == epoll_udp_fd_sn) if (events[n].data.u64 == udp_fd)
{ {
socklen_t recv_len; socklen_t recv_len;
struct sockaddr_in udp_new_addr_in; struct sockaddr_in udp_new_addr_in;
if ((recv_len = recvfrom(udp_fd, buf, buf_len, 0, if ((recv_len = recvfrom(udp_fd, buf, buf_len, 0,
(struct sockaddr *) &udp_new_addr_in, &slen)) == -1) { (struct sockaddr *) &udp_new_addr_in, &slen)) == -1) {
mylog(log_error,"recv_from error\n"); mylog(log_error,"recv_from error,this shouldnt happen at client\n");
//exit(1); exit(1);
}; };
mylog(log_trace,"Received packet from %s:%d,len: %d\n", inet_ntoa(udp_new_addr_in.sin_addr), mylog(log_trace,"Received packet from %s:%d,len: %d\n", inet_ntoa(udp_new_addr_in.sin_addr),
@ -3614,7 +3612,6 @@ int server_event_loop()
{ {
char buf[buf_len]; char buf[buf_len];
conv_manager.set_clear_function(server_clear_function);
int i, j, k;int ret; int i, j, k;int ret;
//g_packet_info_send.src_ip=inet_addr(local_address); //g_packet_info_send.src_ip=inet_addr(local_address);
@ -3666,7 +3663,7 @@ int server_event_loop()
} }
ev.events = EPOLLIN; ev.events = EPOLLIN;
ev.data.u64 = epoll_raw_recv_fd_sn; ev.data.u64 = raw_recv_fd;
ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev); ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, raw_recv_fd, &ev);
if (ret!= 0) { if (ret!= 0) {
@ -3686,19 +3683,33 @@ int server_event_loop()
const int MTU=1440; const int MTU=1440;
for (n = 0; n < nfds; ++n) for (n = 0; n < nfds; ++n)
{ {
if ((events[n].data.u64 >>32u) > 0u) //printf("%d %d %d %d\n",timer_fd,raw_recv_fd,raw_send_fd,n);
if (events[n].data.u64 == timer_fd)
{ {
uint32_t conv_id=events[n].data.u64>>32u; uint64_t value;
read(timer_fd, &value, 8);
keep_connection_server_multi();
}
else if (events[n].data.u64 == raw_recv_fd)
{
iphdr *iph;tcphdr *tcph;
server_on_raw_recv_multi();
}
else
//if ((events[n].data.u64 >>32u) > 0u)
{
//uint32_t conv_id=events[n].data.u64>>32u;
int fd=int((events[n].data.u64<<32u)>>32u); int fd=int(events[n].data.u64);
if(!conv_manager.is_u64_used(events[n].data.u64)) if(!conv_manager.is_u64_used(events[n].data.u64))
{ {
mylog(log_debug,"conv %x no longer exists\n",conv_id); mylog(log_debug,"conv no longer exists,udp fd %d\n",fd);
int recv_len=recv(fd,buf,buf_len,0); ///////////TODO ,delete this int recv_len=recv(fd,buf,buf_len,0); ///////////TODO ,delete this
continue; continue;
} }
uint32_t conv_id=conv_manager.find_conv_by_u64(fd);
int recv_len=recv(fd,buf,buf_len,0); int recv_len=recv(fd,buf,buf_len,0);
@ -3722,18 +3733,6 @@ int server_event_loop()
mylog(log_trace,"send !!\n"); mylog(log_trace,"send !!\n");
} }
} }
//printf("%d %d %d %d\n",timer_fd,raw_recv_fd,raw_send_fd,n);
if (events[n].data.u64 == epoll_timer_fd_sn)
{
uint64_t value;
read(timer_fd, &value, 8);
keep_connection_server_multi();
}
if (events[n].data.u64 == epoll_raw_recv_fd_sn)
{
iphdr *iph;tcphdr *tcph;
server_on_raw_recv_multi();
}
} }
} }