mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 14:29:34 +08:00
fixed epoll dead loop
This commit is contained in:
parent
2245fbdb54
commit
2fc8149116
2
common.h
2
common.h
@ -49,7 +49,7 @@
|
||||
#include<unordered_map>
|
||||
using namespace std;
|
||||
|
||||
const int max_data_len=65535;
|
||||
const int max_data_len=800;
|
||||
const int buf_len=max_data_len+200;
|
||||
const uint32_t max_handshake_conn_num=10000;
|
||||
const uint32_t max_ready_conn_num=1000;
|
||||
|
@ -298,7 +298,7 @@ int my_encrypt_old(const char *data0,char *output,int &len,char * key)
|
||||
len= (len/16)*16+16;
|
||||
}
|
||||
|
||||
if(len>65535) return -1;
|
||||
if(len>max_data_len) return -1;
|
||||
|
||||
data[len-16-2]= (unsigned char)( (uint16_t(ori_len))>>8);
|
||||
data[len-16-1]=(unsigned char)( ((uint16_t(ori_len))<<8)>>8) ;
|
||||
@ -336,7 +336,7 @@ int my_decrypt_old(const char *data0,char *output,int &len,char * key)
|
||||
return 0;
|
||||
}
|
||||
uint8_t md5_res[16];
|
||||
if(len>65535) return -1;
|
||||
if(len>max_data_len) return -1;
|
||||
if(len<32) return -1;
|
||||
if(len%16 !=0) return -1;
|
||||
|
||||
|
60
main.cpp
60
main.cpp
@ -27,6 +27,7 @@ int bind_fd=-1; //bind only,never send or recv
|
||||
int epollfd=-1;
|
||||
int timer_fd=-1;
|
||||
int fail_time_counter=0;
|
||||
int epoll_trigger_counter=0;
|
||||
|
||||
char key_string[1000]= "secret key";
|
||||
char key[16],key2[16];
|
||||
@ -1443,6 +1444,12 @@ int server_on_raw_ready(conn_info_t &conn_info)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((raw_mode == mode_faketcp && (recv_info.syn == 1 || recv_info.ack != 1))|| data_len == 0)
|
||||
{
|
||||
//recv(raw_recv_fd, 0,0, 0 );//
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (recv_info.src_ip != send_info.dst_ip
|
||||
|| recv_info.src_port != send_info.dst_port) {
|
||||
mylog(log_debug, "unexpected adress\n");
|
||||
@ -1685,12 +1692,14 @@ int server_on_raw_pre_ready(conn_info_t &conn_info,char * data,int data_len)
|
||||
}
|
||||
int server_on_raw_recv_multi()
|
||||
{
|
||||
char dummy_buf[buf_len];
|
||||
uint32_t ip;uint16_t port;
|
||||
if(peek_raw(ip,port)<0)
|
||||
{
|
||||
struct sockaddr saddr;
|
||||
socklen_t saddr_size;
|
||||
recvfrom(raw_recv_fd, 0,0, 0 ,&saddr , &saddr_size);//
|
||||
recv(raw_recv_fd, 0,0, 0 );//
|
||||
//struct sockaddr saddr;
|
||||
//socklen_t saddr_size;
|
||||
///recvfrom(raw_recv_fd, 0,0, 0 ,&saddr , &saddr_size);//
|
||||
mylog(log_trace,"peek_raw failed\n");
|
||||
return -1;
|
||||
}
|
||||
@ -1781,6 +1790,7 @@ int server_on_raw_recv_multi()
|
||||
if(conn_manager.mp.size()>=max_handshake_conn_num)
|
||||
{
|
||||
mylog(log_info,"[%s]reached max_handshake_conn_num,ignored new handshake\n",ip_port);
|
||||
recv(raw_recv_fd, 0,0, 0 );//
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1791,8 +1801,6 @@ int server_on_raw_recv_multi()
|
||||
|
||||
if(conn_info.state.server_current_state==server_ready)
|
||||
{
|
||||
if ((raw_mode == mode_faketcp && (recv_info.syn == 1 || recv_info.ack != 1))|| data_len == 0)
|
||||
return 0;
|
||||
return server_on_raw_ready(conn_info);
|
||||
}
|
||||
|
||||
@ -2301,6 +2309,7 @@ int client_event_loop()
|
||||
mylog(log_debug,"send_raw : from %x %d to %x %d\n",send_info.src_ip,send_info.src_port,send_info.dst_ip,send_info.dst_port);
|
||||
while(1)////////////////////////
|
||||
{
|
||||
epoll_trigger_counter++;
|
||||
int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
|
||||
if (nfds < 0) { //allow zero
|
||||
mylog(log_fatal,"epoll_wait return %d\n", nfds);
|
||||
@ -2313,13 +2322,16 @@ int client_event_loop()
|
||||
iphdr *iph;tcphdr *tcph;
|
||||
client_on_raw_recv(conn_info);
|
||||
}
|
||||
if(events[idx].data.u64 ==(uint64_t)timer_fd)
|
||||
else if(events[idx].data.u64 ==(uint64_t)timer_fd)
|
||||
{
|
||||
uint64_t value;
|
||||
read(timer_fd, &value, 8);
|
||||
keep_connection_client(conn_info);
|
||||
|
||||
mylog(log_debug,"epoll_trigger_counter: %d \n",epoll_trigger_counter);
|
||||
epoll_trigger_counter=0;
|
||||
}
|
||||
if (events[idx].data.u64 == (uint64_t)udp_fd)
|
||||
else if (events[idx].data.u64 == (uint64_t)udp_fd)
|
||||
{
|
||||
|
||||
int recv_len;
|
||||
@ -2389,6 +2401,11 @@ int client_event_loop()
|
||||
send_data_safer(conn_info,buf,recv_len,conv);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mylog(log_fatal,"unknown fd,this should never happen\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -2463,6 +2480,7 @@ int server_event_loop()
|
||||
|
||||
while(1)////////////////////////
|
||||
{
|
||||
|
||||
int nfds = epoll_wait(epollfd, events, max_events, 180 * 1000);
|
||||
if (nfds < 0) { //allow zero
|
||||
mylog(log_fatal,"epoll_wait return %d\n", nfds);
|
||||
@ -2471,20 +2489,35 @@ int server_event_loop()
|
||||
int idx;
|
||||
for (idx = 0; idx < nfds; ++idx)
|
||||
{
|
||||
//mylog(log_debug,"ndfs: %d \n",nfds);
|
||||
epoll_trigger_counter++;
|
||||
//printf("%d %d %d %d\n",timer_fd,raw_recv_fd,raw_send_fd,n);
|
||||
if ((events[idx].data.u64 ) == (uint64_t)timer_fd)
|
||||
{
|
||||
uint64_t dummy;
|
||||
read(timer_fd, &dummy, 8);
|
||||
current_time_rough=get_current_time();
|
||||
|
||||
long int begin=get_current_time();
|
||||
conn_manager.clear_inactive();
|
||||
long int end=get_current_time()-begin;
|
||||
|
||||
if(end>1)mylog(log_debug,"%lld,conn_manager.clear_inactive();,%lld \n",begin,end);
|
||||
|
||||
mylog(log_debug,"epoll_trigger_counter: %d \n",epoll_trigger_counter);
|
||||
epoll_trigger_counter=0;
|
||||
|
||||
}
|
||||
else if (events[idx].data.u64 == (uint64_t)raw_recv_fd)
|
||||
{
|
||||
long int begin=get_current_time();
|
||||
server_on_raw_recv_multi();
|
||||
long int end=get_current_time()-begin;
|
||||
if(end>1)mylog(log_debug,"%lld,server_on_raw_recv_multi(),%lld \n",begin,end);
|
||||
}
|
||||
else if ((events[idx].data.u64 >>32u) == 2u)
|
||||
{
|
||||
long int begin=get_current_time();
|
||||
int fd=get_u64_l(events[idx].data.u64);
|
||||
uint64_t dummy;
|
||||
read(fd, &dummy, 8);
|
||||
@ -2509,11 +2542,16 @@ int server_event_loop()
|
||||
}
|
||||
//conn_info_t &conn_info=conn_manager.find(ip,port);
|
||||
keep_connection_server_multi(*p_conn_info);
|
||||
|
||||
long int end=get_current_time()-begin;
|
||||
if(end>1)mylog(log_debug,"%lld,keep_connection_server_multi,%lld \n",begin,end);
|
||||
}
|
||||
else if ((events[idx].data.u64 >>32u) == 1u)
|
||||
{
|
||||
//uint32_t conv_id=events[n].data.u64>>32u;
|
||||
|
||||
long int begin=get_current_time();
|
||||
|
||||
int fd=int((events[idx].data.u64<<32u)>>32u);
|
||||
|
||||
if(conn_manager.udp_fd_mp.find(fd)==conn_manager.udp_fd_mp.end()) //this can happen,when fd is a just closed fd
|
||||
@ -2567,6 +2605,14 @@ int server_event_loop()
|
||||
//send_data(g_packet_info_send,buf,recv_len,my_id,oppsite_id,conv_id);
|
||||
mylog(log_trace,"send_data_safer ,sent !!\n");
|
||||
}
|
||||
|
||||
long int end=get_current_time()-begin;
|
||||
if(end>1) mylog(log_debug,"%lld,send_data_safer,%lld \n",begin,end);
|
||||
}
|
||||
else
|
||||
{
|
||||
mylog(log_fatal,"unknown fd,this should never happen\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user