mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-02-07 23:59:36 +08:00
deleted unused codes,reduce diff with non-mp version
This commit is contained in:
parent
ae9db0eecf
commit
57af53afa8
460
common.cpp
460
common.cpp
@ -13,6 +13,339 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
static int random_number_fd=-1;
|
static int random_number_fd=-1;
|
||||||
|
int force_socket_buf=0;
|
||||||
|
|
||||||
|
int address_t::from_str(char *str)
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
|
||||||
|
char ip_addr_str[100];u32_t port;
|
||||||
|
mylog(log_info,"parsing address: %s\n",str);
|
||||||
|
int is_ipv6=0;
|
||||||
|
if(sscanf(str, "[%[^]]]:%u", ip_addr_str,&port)==2)
|
||||||
|
{
|
||||||
|
mylog(log_info,"its an ipv6 adress\n");
|
||||||
|
inner.ipv6.sin6_family=AF_INET6;
|
||||||
|
is_ipv6=1;
|
||||||
|
}
|
||||||
|
else if(sscanf(str, "%[^:]:%u", ip_addr_str,&port)==2)
|
||||||
|
{
|
||||||
|
mylog(log_info,"its an ipv4 adress\n");
|
||||||
|
inner.ipv4.sin_family=AF_INET;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_error,"failed to parse\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
mylog(log_info,"ip_address is {%s}, port is {%u}\n",ip_addr_str,port);
|
||||||
|
|
||||||
|
if(port>65535)
|
||||||
|
{
|
||||||
|
mylog(log_error,"invalid port: %d\n",port);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ret=-100;
|
||||||
|
if(is_ipv6)
|
||||||
|
{
|
||||||
|
ret=inet_pton(AF_INET6, ip_addr_str,&(inner.ipv6.sin6_addr));
|
||||||
|
inner.ipv6.sin6_port=htons(port);
|
||||||
|
if(ret==0) // 0 if address type doesnt match
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is not an ipv6 address, %d\n",ip_addr_str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
else if(ret==1) // inet_pton returns 1 on success
|
||||||
|
{
|
||||||
|
//okay
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is invalid, %d\n",ip_addr_str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret=inet_pton(AF_INET, ip_addr_str,&(inner.ipv4.sin_addr));
|
||||||
|
inner.ipv4.sin_port=htons(port);
|
||||||
|
|
||||||
|
if(ret==0)
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is not an ipv4 address, %d\n",ip_addr_str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
else if(ret==1)
|
||||||
|
{
|
||||||
|
//okay
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is invalid, %d\n",ip_addr_str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int address_t::from_str_ip_only(char * str)
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
|
||||||
|
u32_t type;
|
||||||
|
|
||||||
|
if(strchr(str,':')==NULL)
|
||||||
|
type=AF_INET;
|
||||||
|
else
|
||||||
|
type=AF_INET6;
|
||||||
|
|
||||||
|
((sockaddr*)&inner)->sa_family=type;
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
if(type==AF_INET)
|
||||||
|
{
|
||||||
|
ret=inet_pton(type, str,&inner.ipv4.sin_addr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret=inet_pton(type, str,&inner.ipv6.sin6_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ret==0) // 0 if address type doesnt match
|
||||||
|
{
|
||||||
|
mylog(log_error,"confusion in parsing %s, %d\n",str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
else if(ret==1) // inet_pton returns 1 on success
|
||||||
|
{
|
||||||
|
//okay
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is invalid, %d\n",str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * address_t::get_str()
|
||||||
|
{
|
||||||
|
static char res[max_addr_len];
|
||||||
|
to_str(res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
void address_t::to_str(char * s)
|
||||||
|
{
|
||||||
|
//static char res[max_addr_len];
|
||||||
|
char ip_addr[max_addr_len];
|
||||||
|
u32_t port;
|
||||||
|
const char * ret=0;
|
||||||
|
if(get_type()==AF_INET6)
|
||||||
|
{
|
||||||
|
ret=inet_ntop(AF_INET6, &inner.ipv6.sin6_addr, ip_addr,max_addr_len);
|
||||||
|
port=inner.ipv6.sin6_port;
|
||||||
|
}
|
||||||
|
else if(get_type()==AF_INET)
|
||||||
|
{
|
||||||
|
ret=inet_ntop(AF_INET, &inner.ipv4.sin_addr, ip_addr,max_addr_len);
|
||||||
|
port=inner.ipv4.sin_port;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ret==0) //NULL on failure
|
||||||
|
{
|
||||||
|
mylog(log_error,"inet_ntop failed\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
port=ntohs(port);
|
||||||
|
|
||||||
|
ip_addr[max_addr_len-1]=0;
|
||||||
|
if(get_type()==AF_INET6)
|
||||||
|
{
|
||||||
|
sprintf(s,"[%s]:%u",ip_addr,(u32_t)port);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
sprintf(s,"%s:%u",ip_addr,(u32_t)port);
|
||||||
|
}
|
||||||
|
|
||||||
|
//return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* address_t::get_ip()
|
||||||
|
{
|
||||||
|
char ip_addr[max_addr_len];
|
||||||
|
static char s[max_addr_len];
|
||||||
|
const char * ret=0;
|
||||||
|
if(get_type()==AF_INET6)
|
||||||
|
{
|
||||||
|
ret=inet_ntop(AF_INET6, &inner.ipv6.sin6_addr, ip_addr,max_addr_len);
|
||||||
|
}
|
||||||
|
else if(get_type()==AF_INET)
|
||||||
|
{
|
||||||
|
ret=inet_ntop(AF_INET, &inner.ipv4.sin_addr, ip_addr,max_addr_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ret==0) //NULL on failure
|
||||||
|
{
|
||||||
|
mylog(log_error,"inet_ntop failed\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ip_addr[max_addr_len-1]=0;
|
||||||
|
if(get_type()==AF_INET6)
|
||||||
|
{
|
||||||
|
sprintf(s,"%s",ip_addr);
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
sprintf(s,"%s",ip_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int address_t::from_sockaddr(sockaddr * addr,socklen_t slen)
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
//memset(&inner,0,sizeof(inner));
|
||||||
|
if(addr->sa_family==AF_INET6)
|
||||||
|
{
|
||||||
|
assert(slen==sizeof(sockaddr_in6));
|
||||||
|
//inner.ipv6= *( (sockaddr_in6*) addr );
|
||||||
|
memcpy(&inner,addr,slen);
|
||||||
|
}
|
||||||
|
else if(addr->sa_family==AF_INET)
|
||||||
|
{
|
||||||
|
assert(slen==sizeof(sockaddr_in));
|
||||||
|
//inner.ipv4= *( (sockaddr_in*) addr );
|
||||||
|
memcpy(&inner,addr,slen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int address_t::new_connected_udp_fd()
|
||||||
|
{
|
||||||
|
|
||||||
|
int new_udp_fd;
|
||||||
|
new_udp_fd = socket(get_type(), SOCK_DGRAM, IPPROTO_UDP);
|
||||||
|
if (new_udp_fd < 0) {
|
||||||
|
mylog(log_warn, "create udp_fd error\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
setnonblocking(new_udp_fd);
|
||||||
|
set_buf_size(new_udp_fd,socket_buf_size);
|
||||||
|
|
||||||
|
mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
|
||||||
|
int ret = connect(new_udp_fd, (struct sockaddr *) &inner, get_len());
|
||||||
|
if (ret != 0) {
|
||||||
|
mylog(log_warn, "udp fd connect fail %d %s\n",ret,strerror(errno) );
|
||||||
|
//sock_close(new_udp_fd);
|
||||||
|
close(new_udp_fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_udp_fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool my_ip_t::equal (const my_ip_t &b) const
|
||||||
|
{
|
||||||
|
//extern int raw_ip_version;
|
||||||
|
if(raw_ip_version==AF_INET)
|
||||||
|
{
|
||||||
|
return v4==b.v4;
|
||||||
|
}else if(raw_ip_version==AF_INET6)
|
||||||
|
{
|
||||||
|
return memcmp(&v6,&b.v6,sizeof(v6))==0;
|
||||||
|
}
|
||||||
|
assert(0==1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
char * my_ip_t::get_str1() const
|
||||||
|
{
|
||||||
|
static char res[max_addr_len];
|
||||||
|
if(raw_ip_version==AF_INET6)
|
||||||
|
{
|
||||||
|
assert(inet_ntop(AF_INET6, &v6, res,max_addr_len)!=0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(raw_ip_version==AF_INET);
|
||||||
|
assert(inet_ntop(AF_INET, &v4, res,max_addr_len)!=0);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
char * my_ip_t::get_str2() const
|
||||||
|
{
|
||||||
|
static char res[max_addr_len];
|
||||||
|
if(raw_ip_version==AF_INET6)
|
||||||
|
{
|
||||||
|
assert(inet_ntop(AF_INET6, &v6, res,max_addr_len)!=0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(raw_ip_version==AF_INET);
|
||||||
|
assert(inet_ntop(AF_INET, &v4, res,max_addr_len)!=0);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int my_ip_t::from_address_t(address_t tmp_addr)
|
||||||
|
{
|
||||||
|
if(tmp_addr.get_type()==raw_ip_version&&raw_ip_version==AF_INET)
|
||||||
|
{
|
||||||
|
v4=tmp_addr.inner.ipv4.sin_addr.s_addr;
|
||||||
|
}
|
||||||
|
else if(tmp_addr.get_type()==raw_ip_version&&raw_ip_version==AF_INET6)
|
||||||
|
{
|
||||||
|
v6=tmp_addr.inner.ipv6.sin6_addr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
int my_ip_t::from_str(char * str)
|
||||||
|
{
|
||||||
|
u32_t type;
|
||||||
|
if(strchr(str,':')==NULL)
|
||||||
|
type=AF_INET;
|
||||||
|
else
|
||||||
|
type=AF_INET6;
|
||||||
|
int ret;
|
||||||
|
ret=inet_pton(type, str,this);
|
||||||
|
if(ret==0) // 0 if address type doesnt match
|
||||||
|
{
|
||||||
|
mylog(log_error,"confusion in parsing %s, %d\n",str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
else if(ret==1) // inet_pton returns 1 on success
|
||||||
|
{
|
||||||
|
//okay
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mylog(log_error,"ip_addr %s is invalid, %d\n",str,ret);
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}*/
|
||||||
|
|
||||||
int init_ws()
|
int init_ws()
|
||||||
{
|
{
|
||||||
@ -127,6 +460,20 @@ char * my_ntoa(u32_t ip)
|
|||||||
return inet_ntoa(a);
|
return inet_ntoa(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void init_random_number_fd()
|
||||||
|
{
|
||||||
|
|
||||||
|
random_number_fd=open("/dev/urandom",O_RDONLY);
|
||||||
|
|
||||||
|
if(random_number_fd==-1)
|
||||||
|
{
|
||||||
|
mylog(log_fatal,"error open /dev/urandom\n");
|
||||||
|
myexit(-1);
|
||||||
|
}
|
||||||
|
setnonblocking(random_number_fd);
|
||||||
|
}*/
|
||||||
|
|
||||||
#if !defined(__MINGW32__)
|
#if !defined(__MINGW32__)
|
||||||
struct random_fd_t
|
struct random_fd_t
|
||||||
{
|
{
|
||||||
@ -261,6 +608,48 @@ u64_t hton64(u64_t a)
|
|||||||
return ntoh64(a);
|
return ntoh64(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void write_u16(char * p,u16_t w)
|
||||||
|
{
|
||||||
|
*(unsigned char*)(p + 1) = (w & 0xff);
|
||||||
|
*(unsigned char*)(p + 0) = (w >> 8);
|
||||||
|
}
|
||||||
|
u16_t read_u16(char * p)
|
||||||
|
{
|
||||||
|
u16_t res;
|
||||||
|
res = *(const unsigned char*)(p + 0);
|
||||||
|
res = *(const unsigned char*)(p + 1) + (res << 8);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_u32(char * p,u32_t l)
|
||||||
|
{
|
||||||
|
*(unsigned char*)(p + 3) = (unsigned char)((l >> 0) & 0xff);
|
||||||
|
*(unsigned char*)(p + 2) = (unsigned char)((l >> 8) & 0xff);
|
||||||
|
*(unsigned char*)(p + 1) = (unsigned char)((l >> 16) & 0xff);
|
||||||
|
*(unsigned char*)(p + 0) = (unsigned char)((l >> 24) & 0xff);
|
||||||
|
}
|
||||||
|
u32_t read_u32(char * p)
|
||||||
|
{
|
||||||
|
u32_t res;
|
||||||
|
res = *(const unsigned char*)(p + 0);
|
||||||
|
res = *(const unsigned char*)(p + 1) + (res << 8);
|
||||||
|
res = *(const unsigned char*)(p + 2) + (res << 8);
|
||||||
|
res = *(const unsigned char*)(p + 3) + (res << 8);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_u64(char * s,u64_t a)
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
u64_t read_u64(char * s)
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setnonblocking(int sock) {
|
void setnonblocking(int sock) {
|
||||||
#if !defined(__MINGW32__)
|
#if !defined(__MINGW32__)
|
||||||
int opts;
|
int opts;
|
||||||
@ -313,7 +702,40 @@ unsigned short csum(const unsigned short *ptr,int nbytes) {//works both for big
|
|||||||
return(answer);
|
return(answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_buf_size(int fd,int socket_buf_size,int force_socket_buf)
|
unsigned short csum_with_header(char* header,int hlen,const unsigned short *ptr,int nbytes) {//works both for big and little endian
|
||||||
|
|
||||||
|
long sum;
|
||||||
|
unsigned short oddbyte;
|
||||||
|
short answer;
|
||||||
|
|
||||||
|
assert(hlen%2==0);
|
||||||
|
|
||||||
|
sum=0;
|
||||||
|
unsigned short * tmp= (unsigned short *)header;
|
||||||
|
for(int i=0;i<hlen/2;i++)
|
||||||
|
{
|
||||||
|
sum+=*tmp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while(nbytes>1) {
|
||||||
|
sum+=*ptr++;
|
||||||
|
nbytes-=2;
|
||||||
|
}
|
||||||
|
if(nbytes==1) {
|
||||||
|
oddbyte=0;
|
||||||
|
*((u_char*)&oddbyte)=*(u_char*)ptr;
|
||||||
|
sum+=oddbyte;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum = (sum>>16)+(sum & 0xffff);
|
||||||
|
sum = sum + (sum>>16);
|
||||||
|
answer=(short)~sum;
|
||||||
|
|
||||||
|
return(answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int set_buf_size(int fd,int socket_buf_size)
|
||||||
{
|
{
|
||||||
if(force_socket_buf)
|
if(force_socket_buf)
|
||||||
{
|
{
|
||||||
@ -408,10 +830,9 @@ int hex_to_u32_with_endian(const string & a,u32_t &output)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
bool larger_than_u32(u32_t a,u32_t b)
|
bool larger_than_u32(u32_t a,u32_t b)
|
||||||
//TODO
|
|
||||||
//looks like this can simply be done by return ((i32_t)(a-b) >0)
|
|
||||||
{
|
{
|
||||||
|
return ((i32_t(a-b)) >0);
|
||||||
|
/*
|
||||||
u32_t smaller,bigger;
|
u32_t smaller,bigger;
|
||||||
smaller=min(a,b);//smaller in normal sense
|
smaller=min(a,b);//smaller in normal sense
|
||||||
bigger=max(a,b);
|
bigger=max(a,b);
|
||||||
@ -438,11 +859,13 @@ bool larger_than_u32(u32_t a,u32_t b)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
bool larger_than_u16(uint16_t a,uint16_t b)
|
bool larger_than_u16(uint16_t a,uint16_t b)
|
||||||
{
|
{
|
||||||
|
return ((i16_t(a-b)) >0);
|
||||||
|
/*
|
||||||
uint16_t smaller,bigger;
|
uint16_t smaller,bigger;
|
||||||
smaller=min(a,b);//smaller in normal sense
|
smaller=min(a,b);//smaller in normal sense
|
||||||
bigger=max(a,b);
|
bigger=max(a,b);
|
||||||
@ -469,6 +892,7 @@ bool larger_than_u16(uint16_t a,uint16_t b)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void myexit(int a)
|
void myexit(int a)
|
||||||
@ -803,3 +1227,29 @@ void print_binary_chars(const char * a,int len)
|
|||||||
log_bare(log_debug,"\n");
|
log_bare(log_debug,"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32_t djb2(unsigned char *str,int len)
|
||||||
|
{
|
||||||
|
u32_t hash = 5381;
|
||||||
|
int c;
|
||||||
|
int i=0;
|
||||||
|
while(c = *str++,i++!=len)
|
||||||
|
{
|
||||||
|
hash = ((hash << 5) + hash)^c; /* (hash * 33) ^ c */
|
||||||
|
}
|
||||||
|
|
||||||
|
hash=htonl(hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32_t sdbm(unsigned char *str,int len)
|
||||||
|
{
|
||||||
|
u32_t hash = 0;
|
||||||
|
int c;
|
||||||
|
int i=0;
|
||||||
|
while(c = *str++,i++!=len)
|
||||||
|
{
|
||||||
|
hash = c + (hash << 6) + (hash << 16) - hash;
|
||||||
|
}
|
||||||
|
//hash=htonl(hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
305
common.h
305
common.h
@ -17,32 +17,14 @@
|
|||||||
|
|
||||||
#include<unistd.h>
|
#include<unistd.h>
|
||||||
#include<errno.h>
|
#include<errno.h>
|
||||||
//#include <sys/epoll.h>
|
|
||||||
//#include <sys/wait.h>
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdlib.h> //for exit(0);
|
#include <stdlib.h> //for exit(0);
|
||||||
#include <errno.h> //For errno - the error number
|
#include <errno.h> //For errno - the error number
|
||||||
//#include <netdb.h> // for gethostbyname()
|
|
||||||
//#include <netinet/tcp.h> //Provides declarations for tcp header
|
|
||||||
//#include <netinet/udp.h>
|
|
||||||
//#include <netinet/ip.h> //Provides declarations for ip header
|
|
||||||
//#include <netinet/if_ether.h>
|
|
||||||
//#include <arpa/inet.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
//#include <byteswap.h>
|
|
||||||
//#include <arpa/inet.h>
|
|
||||||
//#include <linux/if_ether.h>
|
|
||||||
//#include <linux/filter.h>
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
//#include <sys/timerfd.h>
|
|
||||||
//#include <net/if.h>
|
|
||||||
//#include <arpa/inet.h>
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
//#include <linux/if_packet.h>
|
|
||||||
//#include <byteswap.h>
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#if !defined(__CYGWIN__) && !defined(__MINGW32__)
|
#if !defined(__CYGWIN__) && !defined(__MINGW32__)
|
||||||
@ -65,7 +47,7 @@ typedef unsigned short u_int16_t;
|
|||||||
typedef unsigned int u_int32_t;
|
typedef unsigned int u_int32_t;
|
||||||
typedef int socklen_t;
|
typedef int socklen_t;
|
||||||
#else
|
#else
|
||||||
#include <sys/socket.h> //for socket ofcourse
|
#include <sys/socket.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@ -79,6 +61,7 @@ typedef int socklen_t;
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <list>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
|
#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
|
||||||
@ -141,6 +124,9 @@ typedef long long i64_t;
|
|||||||
typedef unsigned int u32_t;
|
typedef unsigned int u32_t;
|
||||||
typedef int i32_t;
|
typedef int i32_t;
|
||||||
|
|
||||||
|
typedef unsigned short u16_t;
|
||||||
|
typedef short i16_t;
|
||||||
|
|
||||||
typedef u32_t my_id_t;
|
typedef u32_t my_id_t;
|
||||||
|
|
||||||
typedef u64_t iv_t;
|
typedef u64_t iv_t;
|
||||||
@ -149,6 +135,11 @@ typedef u64_t padding_t;
|
|||||||
|
|
||||||
typedef u64_t anti_replay_seq_t;
|
typedef u64_t anti_replay_seq_t;
|
||||||
|
|
||||||
|
typedef u64_t my_time_t;
|
||||||
|
|
||||||
|
const int max_addr_len=100;
|
||||||
|
|
||||||
|
extern int force_socket_buf;
|
||||||
|
|
||||||
struct ip_port_t
|
struct ip_port_t
|
||||||
{
|
{
|
||||||
@ -162,11 +153,187 @@ struct ip_port_t
|
|||||||
|
|
||||||
typedef u64_t fd64_t;
|
typedef u64_t fd64_t;
|
||||||
|
|
||||||
|
u32_t djb2(unsigned char *str,int len);
|
||||||
|
u32_t sdbm(unsigned char *str,int len);
|
||||||
|
|
||||||
|
struct address_t //TODO scope id
|
||||||
|
{
|
||||||
|
struct hash_function
|
||||||
|
{
|
||||||
|
u32_t operator()(const address_t &key) const
|
||||||
|
{
|
||||||
|
return sdbm((unsigned char*)&key.inner,sizeof(key.inner));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
union storage_t //sockaddr_storage is too huge, we dont use it.
|
||||||
|
{
|
||||||
|
sockaddr_in ipv4;
|
||||||
|
sockaddr_in6 ipv6;
|
||||||
|
};
|
||||||
|
storage_t inner;
|
||||||
|
|
||||||
|
address_t()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
memset(&inner,0,sizeof(inner));
|
||||||
|
}
|
||||||
|
int from_ip_port(u32_t ip, int port)
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
inner.ipv4.sin_family=AF_INET;
|
||||||
|
inner.ipv4.sin_port=htons(port);
|
||||||
|
inner.ipv4.sin_addr.s_addr=ip;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int from_ip_port_new(int type, void * ip, int port)
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
if(type==AF_INET)
|
||||||
|
{
|
||||||
|
inner.ipv4.sin_family=AF_INET;
|
||||||
|
inner.ipv4.sin_port=htons(port);
|
||||||
|
inner.ipv4.sin_addr.s_addr=*((u32_t *)ip);
|
||||||
|
}
|
||||||
|
else if(type==AF_INET6)
|
||||||
|
{
|
||||||
|
inner.ipv6.sin6_family=AF_INET6;
|
||||||
|
inner.ipv6.sin6_port=htons(port);
|
||||||
|
inner.ipv6.sin6_addr=*((in6_addr*)ip);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int from_str(char * str);
|
||||||
|
|
||||||
|
int from_str_ip_only(char * str);
|
||||||
|
|
||||||
|
int from_sockaddr(sockaddr *,socklen_t);
|
||||||
|
|
||||||
|
char* get_str();
|
||||||
|
void to_str(char *);
|
||||||
|
|
||||||
|
inline u32_t get_type()
|
||||||
|
{
|
||||||
|
u32_t ret=((sockaddr*)&inner)->sa_family;
|
||||||
|
assert(ret==AF_INET||ret==AF_INET6);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u32_t get_len()
|
||||||
|
{
|
||||||
|
u32_t type=get_type();
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return sizeof(sockaddr_in);
|
||||||
|
case AF_INET6:
|
||||||
|
return sizeof(sockaddr_in6);
|
||||||
|
default:
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u32_t get_port()
|
||||||
|
{
|
||||||
|
u32_t type=get_type();
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return ntohs(inner.ipv4.sin_port);
|
||||||
|
case AF_INET6:
|
||||||
|
return ntohs(inner.ipv6.sin6_port);
|
||||||
|
default:
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void set_port(int port)
|
||||||
|
{
|
||||||
|
u32_t type=get_type();
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
inner.ipv4.sin_port=htons(port);
|
||||||
|
break;
|
||||||
|
case AF_INET6:
|
||||||
|
inner.ipv6.sin6_port=htons(port);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator == (const address_t &b) const
|
||||||
|
{
|
||||||
|
//return this->data==b.data;
|
||||||
|
return memcmp(&this->inner,&b.inner,sizeof(this->inner))==0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int new_connected_udp_fd();
|
||||||
|
|
||||||
|
char* get_ip();
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
template <>
|
||||||
|
struct hash<address_t>
|
||||||
|
{
|
||||||
|
std::size_t operator()(const address_t& key) const
|
||||||
|
{
|
||||||
|
|
||||||
|
//return address_t::hash_function(k);
|
||||||
|
return sdbm((unsigned char*)&key.inner,sizeof(key.inner));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
union my_ip_t //just a simple version of address_t,stores ip only
|
||||||
|
{
|
||||||
|
u32_t v4;
|
||||||
|
in6_addr v6;
|
||||||
|
|
||||||
|
bool equal (const my_ip_t &b) const;
|
||||||
|
|
||||||
|
//int from_str(char * str);
|
||||||
|
char * get_str1() const;
|
||||||
|
char * get_str2() const;
|
||||||
|
|
||||||
|
int from_address_t(address_t a);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct not_copy_able_t
|
||||||
|
{
|
||||||
|
not_copy_able_t()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
not_copy_able_t(const not_copy_able_t &other)
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
}
|
||||||
|
const not_copy_able_t & operator=(const not_copy_able_t &other)
|
||||||
|
{
|
||||||
|
assert(0==1);
|
||||||
|
return other;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const int max_data_len=1800;
|
const int max_data_len=1800;
|
||||||
const int buf_len=max_data_len+400;
|
const int buf_len=max_data_len+400;
|
||||||
const int max_address_len=512;
|
|
||||||
const int queue_len=2000;
|
const int queue_len=2000;
|
||||||
|
|
||||||
|
//const int max_address_len=512;
|
||||||
|
|
||||||
struct queue_t
|
struct queue_t
|
||||||
{
|
{
|
||||||
char data[queue_len][buf_len];
|
char data[queue_len][buf_len];
|
||||||
@ -225,10 +392,18 @@ u32_t get_true_random_number();
|
|||||||
u32_t get_true_random_number_nz();
|
u32_t get_true_random_number_nz();
|
||||||
u64_t ntoh64(u64_t a);
|
u64_t ntoh64(u64_t a);
|
||||||
u64_t hton64(u64_t a);
|
u64_t hton64(u64_t a);
|
||||||
|
|
||||||
|
void write_u16(char *,u16_t a);// network order
|
||||||
|
u16_t read_u16(char *);
|
||||||
|
void write_u32(char *,u32_t a);// network order
|
||||||
|
u32_t read_u32(char *);
|
||||||
|
void write_u64(char *,u64_t a);
|
||||||
|
u64_t read_u64(char *);
|
||||||
|
|
||||||
bool larger_than_u16(uint16_t a,uint16_t b);
|
bool larger_than_u16(uint16_t a,uint16_t b);
|
||||||
bool larger_than_u32(u32_t a,u32_t b);
|
bool larger_than_u32(u32_t a,u32_t b);
|
||||||
void setnonblocking(int sock);
|
void setnonblocking(int sock);
|
||||||
int set_buf_size(int fd,int socket_buf_size,int force_socket_buf);
|
int set_buf_size(int fd,int socket_buf_size);
|
||||||
|
|
||||||
void myexit(int a);
|
void myexit(int a);
|
||||||
|
|
||||||
@ -263,4 +438,92 @@ int create_fifo(char * file);
|
|||||||
|
|
||||||
void print_binary_chars(const char * a,int len);
|
void print_binary_chars(const char * a,int len);
|
||||||
|
|
||||||
|
template <class key_t>
|
||||||
|
struct lru_collector_t:not_copy_able_t
|
||||||
|
{
|
||||||
|
//typedef void* key_t;
|
||||||
|
//#define key_t void*
|
||||||
|
struct lru_pair_t
|
||||||
|
{
|
||||||
|
key_t key;
|
||||||
|
my_time_t ts;
|
||||||
|
};
|
||||||
|
|
||||||
|
unordered_map<key_t,typename list<lru_pair_t>::iterator> mp;
|
||||||
|
|
||||||
|
list<lru_pair_t> q;
|
||||||
|
int update(key_t key)
|
||||||
|
{
|
||||||
|
assert(mp.find(key)!=mp.end());
|
||||||
|
auto it=mp[key];
|
||||||
|
q.erase(it);
|
||||||
|
|
||||||
|
my_time_t value=get_current_time();
|
||||||
|
if(!q.empty())
|
||||||
|
{
|
||||||
|
assert(value >=q.front().ts);
|
||||||
|
}
|
||||||
|
lru_pair_t tmp; tmp.key=key; tmp.ts=value;
|
||||||
|
q.push_front( tmp);
|
||||||
|
mp[key]=q.begin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int new_key(key_t key)
|
||||||
|
{
|
||||||
|
assert(mp.find(key)==mp.end());
|
||||||
|
|
||||||
|
my_time_t value=get_current_time();
|
||||||
|
if(!q.empty())
|
||||||
|
{
|
||||||
|
assert(value >=q.front().ts);
|
||||||
|
}
|
||||||
|
lru_pair_t tmp; tmp.key=key; tmp.ts=value;
|
||||||
|
q.push_front( tmp);
|
||||||
|
mp[key]=q.begin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int size()
|
||||||
|
{
|
||||||
|
return q.size();
|
||||||
|
}
|
||||||
|
int empty()
|
||||||
|
{
|
||||||
|
return q.empty();
|
||||||
|
}
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
mp.clear(); q.clear();
|
||||||
|
}
|
||||||
|
my_time_t ts_of(key_t key)
|
||||||
|
{
|
||||||
|
assert(mp.find(key)!=mp.end());
|
||||||
|
return mp[key]->ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
my_time_t peek_back(key_t &key)
|
||||||
|
{
|
||||||
|
assert(!q.empty());
|
||||||
|
auto it=q.end(); it--;
|
||||||
|
key=it->key;
|
||||||
|
return it->ts;
|
||||||
|
}
|
||||||
|
void erase(key_t key)
|
||||||
|
{
|
||||||
|
assert(mp.find(key)!=mp.end());
|
||||||
|
q.erase(mp[key]);
|
||||||
|
mp.erase(key);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
void erase_back()
|
||||||
|
{
|
||||||
|
assert(!q.empty());
|
||||||
|
auto it=q.end(); it--;
|
||||||
|
key_t key=it->key;
|
||||||
|
erase(key);
|
||||||
|
}*/
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* COMMON_H_ */
|
#endif /* COMMON_H_ */
|
||||||
|
167
connection.cpp
167
connection.cpp
@ -16,8 +16,6 @@ const int disable_conv_clear=0;//a udp connection in the multiplexer is called c
|
|||||||
|
|
||||||
const int disable_conn_clear=0;//a raw connection is called conn.
|
const int disable_conn_clear=0;//a raw connection is called conn.
|
||||||
|
|
||||||
conn_manager_t conn_manager;
|
|
||||||
|
|
||||||
anti_replay_seq_t anti_replay_t::get_new_seq_for_send()
|
anti_replay_seq_t anti_replay_t::get_new_seq_for_send()
|
||||||
{
|
{
|
||||||
return anti_replay_seq++;
|
return anti_replay_seq++;
|
||||||
@ -312,171 +310,6 @@ conv_manager_t::~conv_manager_t()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
conn_manager_t::conn_manager_t()
|
|
||||||
{
|
|
||||||
ready_num=0;
|
|
||||||
mp.reserve(10007);
|
|
||||||
clear_it=mp.begin();
|
|
||||||
// timer_fd_mp.reserve(10007);
|
|
||||||
const_id_mp.reserve(10007);
|
|
||||||
// udp_fd_mp.reserve(100007);
|
|
||||||
last_clear_time=0;
|
|
||||||
//current_ready_ip=0;
|
|
||||||
// current_ready_port=0;
|
|
||||||
}
|
|
||||||
int conn_manager_t::exist(u32_t ip,uint16_t port)
|
|
||||||
{
|
|
||||||
u64_t u64=0;
|
|
||||||
u64=ip;
|
|
||||||
u64<<=32u;
|
|
||||||
u64|=port;
|
|
||||||
if(mp.find(u64)!=mp.end())
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
int insert(uint32_t ip,uint16_t port)
|
|
||||||
{
|
|
||||||
uint64_t u64=0;
|
|
||||||
u64=ip;
|
|
||||||
u64<<=32u;
|
|
||||||
u64|=port;
|
|
||||||
mp[u64];
|
|
||||||
return 0;
|
|
||||||
}*/
|
|
||||||
conn_info_t *& conn_manager_t::find_insert_p(u32_t ip,uint16_t port) //be aware,the adress may change after rehash
|
|
||||||
{
|
|
||||||
u64_t u64=0;
|
|
||||||
u64=ip;
|
|
||||||
u64<<=32u;
|
|
||||||
u64|=port;
|
|
||||||
unordered_map<u64_t,conn_info_t*>::iterator it=mp.find(u64);
|
|
||||||
if(it==mp.end())
|
|
||||||
{
|
|
||||||
mp[u64]=new conn_info_t;
|
|
||||||
}
|
|
||||||
return mp[u64];
|
|
||||||
}
|
|
||||||
conn_info_t & conn_manager_t::find_insert(u32_t ip,uint16_t port) //be aware,the adress may change after rehash
|
|
||||||
{
|
|
||||||
u64_t u64=0;
|
|
||||||
u64=ip;
|
|
||||||
u64<<=32u;
|
|
||||||
u64|=port;
|
|
||||||
unordered_map<u64_t,conn_info_t*>::iterator it=mp.find(u64);
|
|
||||||
if(it==mp.end())
|
|
||||||
{
|
|
||||||
mp[u64]=new conn_info_t;
|
|
||||||
}
|
|
||||||
return *mp[u64];
|
|
||||||
}
|
|
||||||
int conn_manager_t::erase(unordered_map<u64_t,conn_info_t*>::iterator erase_it)
|
|
||||||
{
|
|
||||||
if(erase_it->second->state.server_current_state==server_ready)
|
|
||||||
{
|
|
||||||
ready_num--;
|
|
||||||
assert(i32_t(ready_num)!=-1);
|
|
||||||
assert(erase_it->second!=0);
|
|
||||||
|
|
||||||
assert(erase_it->second->timer_fd64 !=0);
|
|
||||||
|
|
||||||
assert(fd_manager.exist(erase_it->second->timer_fd64));
|
|
||||||
|
|
||||||
assert(erase_it->second->oppsite_const_id!=0);
|
|
||||||
assert(const_id_mp.find(erase_it->second->oppsite_const_id)!=const_id_mp.end());
|
|
||||||
|
|
||||||
|
|
||||||
//assert(timer_fd_mp.find(erase_it->second->timer_fd)!=timer_fd_mp.end());
|
|
||||||
|
|
||||||
const_id_mp.erase(erase_it->second->oppsite_const_id);
|
|
||||||
|
|
||||||
fd_manager.fd64_close(erase_it->second->timer_fd64);
|
|
||||||
|
|
||||||
erase_it->second->timer_fd64=0;
|
|
||||||
//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);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
assert(erase_it->second->blob==0);
|
|
||||||
assert(erase_it->second->timer_fd64 ==0);
|
|
||||||
|
|
||||||
|
|
||||||
assert(erase_it->second->oppsite_const_id==0);
|
|
||||||
delete(erase_it->second);
|
|
||||||
mp.erase(erase_it->first);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int conn_manager_t::clear_inactive()
|
|
||||||
{
|
|
||||||
if(get_current_time()-last_clear_time>conn_clear_interval)
|
|
||||||
{
|
|
||||||
last_clear_time=get_current_time();
|
|
||||||
return clear_inactive0();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int conn_manager_t::clear_inactive0()
|
|
||||||
{
|
|
||||||
unordered_map<u64_t,conn_info_t*>::iterator it;
|
|
||||||
unordered_map<u64_t,conn_info_t*>::iterator old_it;
|
|
||||||
|
|
||||||
if(disable_conn_clear) return 0;
|
|
||||||
|
|
||||||
//map<uint32_t,uint64_t>::iterator it;
|
|
||||||
int cnt=0;
|
|
||||||
it=clear_it;
|
|
||||||
int size=mp.size();
|
|
||||||
int num_to_clean=size/conn_clear_ratio+conn_clear_min; //clear 1/10 each time,to avoid latency glitch
|
|
||||||
|
|
||||||
mylog(log_trace,"mp.size() %d\n", size);
|
|
||||||
|
|
||||||
num_to_clean=min(num_to_clean,(int)mp.size());
|
|
||||||
u64_t current_time=get_current_time();
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
if(cnt>=num_to_clean) break;
|
|
||||||
if(mp.begin()==mp.end()) break;
|
|
||||||
|
|
||||||
if(it==mp.end())
|
|
||||||
{
|
|
||||||
it=mp.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(it->second->state.server_current_state==server_ready &¤t_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 )
|
|
||||||
{
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
else if(it->second->blob!=0&&it->second->blob->conv_manager.get_size() >0)
|
|
||||||
{
|
|
||||||
assert(it->second->state.server_current_state==server_ready);
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mylog(log_info,"[%s:%d]inactive conn cleared \n",my_ntoa(it->second->raw_info.recv_info.src_ip),it->second->raw_info.recv_info.src_port);
|
|
||||||
old_it=it;
|
|
||||||
it++;
|
|
||||||
erase(old_it);
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
clear_it=it;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int send_bare(raw_info_t &raw_info,const char* data,int len)//send function with encryption but no anti replay,this is used when client and server verifys each other
|
int send_bare(raw_info_t &raw_info,const char* data,int len)//send function with encryption but no anti replay,this is used when client and server verifys each other
|
||||||
//you have to design the protocol carefully, so that you wont be affect by relay attack
|
//you have to design the protocol carefully, so that you wont be affect by relay attack
|
||||||
|
2
main.cpp
2
main.cpp
@ -880,7 +880,7 @@ int client_event_loop()
|
|||||||
|
|
||||||
|
|
||||||
udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
set_buf_size(udp_fd,socket_buf_size,force_socket_buf);
|
set_buf_size(udp_fd,socket_buf_size);
|
||||||
|
|
||||||
int yes = 1;
|
int yes = 1;
|
||||||
|
|
||||||
|
5
misc.cpp
5
misc.cpp
@ -28,7 +28,7 @@ int ttl_value=64;
|
|||||||
|
|
||||||
fd_manager_t fd_manager;
|
fd_manager_t fd_manager;
|
||||||
|
|
||||||
char remote_address[max_address_len]="";
|
char remote_address[max_addr_len]="";
|
||||||
char local_ip[100]="0.0.0.0", remote_ip[100]="255.255.255.255",source_ip[100]="0.0.0.0";//local_ip is for -l option,remote_ip for -r option,source for --source-ip
|
char local_ip[100]="0.0.0.0", remote_ip[100]="255.255.255.255",source_ip[100]="0.0.0.0";//local_ip is for -l option,remote_ip for -r option,source for --source-ip
|
||||||
u32_t local_ip_uint32,remote_ip_uint32,source_ip_uint32;//convert from last line.
|
u32_t local_ip_uint32,remote_ip_uint32,source_ip_uint32;//convert from last line.
|
||||||
int local_port = -1, remote_port=-1,source_port=0;//similiar to local_ip remote_ip,buf for port.source_port=0 indicates --source-port is not enabled
|
int local_port = -1, remote_port=-1,source_port=0;//similiar to local_ip remote_ip,buf for port.source_port=0 indicates --source-port is not enabled
|
||||||
@ -71,6 +71,7 @@ int iptables_rule_keep_index=0;
|
|||||||
|
|
||||||
program_mode_t program_mode=unset_mode;//0 unset; 1client 2server
|
program_mode_t program_mode=unset_mode;//0 unset; 1client 2server
|
||||||
raw_mode_t raw_mode=mode_faketcp;
|
raw_mode_t raw_mode=mode_faketcp;
|
||||||
|
u32_t raw_ip_version=(u32_t)-1;
|
||||||
unordered_map<int, const char*> raw_mode_tostring = {{mode_faketcp, "faketcp"}, {mode_udp, "udp"}, {mode_icmp, "icmp"}};
|
unordered_map<int, const char*> raw_mode_tostring = {{mode_faketcp, "faketcp"}, {mode_udp, "udp"}, {mode_icmp, "icmp"}};
|
||||||
|
|
||||||
int about_to_exit=0;
|
int about_to_exit=0;
|
||||||
@ -80,7 +81,7 @@ int about_to_exit=0;
|
|||||||
|
|
||||||
|
|
||||||
int socket_buf_size=1024*1024;
|
int socket_buf_size=1024*1024;
|
||||||
int force_socket_buf=0;
|
//int force_socket_buf=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5
misc.h
5
misc.h
@ -73,7 +73,7 @@ union current_state_t
|
|||||||
client_current_state_t client_current_state;
|
client_current_state_t client_current_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char remote_address[max_address_len];
|
extern char remote_address[max_addr_len];
|
||||||
extern char local_ip[100], remote_ip[100],source_ip[100];//local_ip is for -l option,remote_ip for -r option,source for --source-ip
|
extern char local_ip[100], remote_ip[100],source_ip[100];//local_ip is for -l option,remote_ip for -r option,source for --source-ip
|
||||||
extern u32_t local_ip_uint32,remote_ip_uint32,source_ip_uint32;//convert from last line.
|
extern u32_t local_ip_uint32,remote_ip_uint32,source_ip_uint32;//convert from last line.
|
||||||
extern int local_port , remote_port,source_port;//similiar to local_ip remote_ip,buf for port.source_port=0 indicates --source-port is not enabled
|
extern int local_port , remote_port,source_port;//similiar to local_ip remote_ip,buf for port.source_port=0 indicates --source-port is not enabled
|
||||||
@ -106,6 +106,7 @@ extern char fifo_file[1000];
|
|||||||
|
|
||||||
|
|
||||||
extern raw_mode_t raw_mode;
|
extern raw_mode_t raw_mode;
|
||||||
|
extern u32_t raw_ip_version;
|
||||||
|
|
||||||
extern program_mode_t program_mode;
|
extern program_mode_t program_mode;
|
||||||
extern unordered_map<int, const char*> raw_mode_tostring ;
|
extern unordered_map<int, const char*> raw_mode_tostring ;
|
||||||
@ -113,7 +114,7 @@ extern unordered_map<int, const char*> raw_mode_tostring ;
|
|||||||
extern int about_to_exit;
|
extern int about_to_exit;
|
||||||
|
|
||||||
extern int socket_buf_size;
|
extern int socket_buf_size;
|
||||||
extern int force_socket_buf;
|
//extern int force_socket_buf;
|
||||||
|
|
||||||
extern pthread_t keep_thread;
|
extern pthread_t keep_thread;
|
||||||
extern int keep_thread_running;
|
extern int keep_thread_running;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user