mirror of
https://github.com/wangyu-/UDPspeeder.git
synced 2025-01-18 22:09:35 +08:00
change random number generator
This commit is contained in:
parent
9fd6428525
commit
d4ee2d314b
126
common.cpp
126
common.cpp
@ -8,7 +8,8 @@
|
||||
#include "common.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
#include <random>
|
||||
#include <cmath>
|
||||
|
||||
int about_to_exit=0;
|
||||
|
||||
@ -28,9 +29,35 @@ int socket_buf_size=1024*1024;
|
||||
|
||||
|
||||
|
||||
struct random_fd_t
|
||||
struct my_random_t
|
||||
{
|
||||
int random_number_fd;
|
||||
std::random_device rd;
|
||||
std::mt19937 gen;
|
||||
std::uniform_int_distribution<u64_t> dis64;
|
||||
std::uniform_int_distribution<u32_t> dis32;
|
||||
|
||||
std::uniform_int_distribution<unsigned char> dis8;
|
||||
|
||||
my_random_t()
|
||||
{
|
||||
std::mt19937 gen_tmp(rd());
|
||||
gen=gen_tmp;
|
||||
gen.discard(700000); //magic
|
||||
}
|
||||
u64_t gen64()
|
||||
{
|
||||
return dis64(gen);
|
||||
}
|
||||
u32_t gen32()
|
||||
{
|
||||
return dis32(gen);
|
||||
}
|
||||
|
||||
unsigned char gen8()
|
||||
{
|
||||
return dis8(gen);
|
||||
}
|
||||
/*int random_number_fd;
|
||||
random_fd_t()
|
||||
{
|
||||
random_number_fd=open("/dev/urandom",O_RDONLY);
|
||||
@ -45,8 +72,39 @@ struct random_fd_t
|
||||
int get_fd()
|
||||
{
|
||||
return random_number_fd;
|
||||
}*/
|
||||
}my_random;
|
||||
|
||||
void get_fake_random_chars(char * s,int len)
|
||||
{
|
||||
char *p=s;
|
||||
int left=len;
|
||||
|
||||
while(left>=(int)sizeof(u64_t))
|
||||
{
|
||||
*((u64_t*)p)=my_random.gen64(); //no endianess problem here , but may break strict-alias?
|
||||
|
||||
p+=sizeof(u64_t);
|
||||
left-=sizeof(u64_t);
|
||||
}
|
||||
}random_fd;
|
||||
if(left)
|
||||
{
|
||||
u64_t tmp=my_random.gen64();
|
||||
memcpy(p,&tmp,left);
|
||||
}
|
||||
}
|
||||
|
||||
int random_between(u32_t a,u32_t b)
|
||||
{
|
||||
if(a>b)
|
||||
{
|
||||
mylog(log_fatal,"min >max?? %d %d\n",a ,b);
|
||||
myexit(1);
|
||||
}
|
||||
if(a==b)return a;
|
||||
else return a+get_fake_random_number()%(b+1-a);
|
||||
}
|
||||
|
||||
/*
|
||||
u64_t get_current_time()//ms
|
||||
{
|
||||
@ -181,36 +239,36 @@ int clear_iptables_rule()
|
||||
|
||||
|
||||
|
||||
u64_t get_true_random_number_64()
|
||||
u64_t get_fake_random_number_64()
|
||||
{
|
||||
u64_t ret;
|
||||
int size=read(random_fd.get_fd(),&ret,sizeof(ret));
|
||||
if(size!=sizeof(ret))
|
||||
{
|
||||
mylog(log_fatal,"get random number failed %d\n",size);
|
||||
//u64_t ret;
|
||||
//int size=read(random_fd.get_fd(),&ret,sizeof(ret));
|
||||
//if(size!=sizeof(ret))
|
||||
//{
|
||||
// mylog(log_fatal,"get random number failed %d\n",size);
|
||||
|
||||
myexit(-1);
|
||||
}
|
||||
// myexit(-1);
|
||||
//}
|
||||
|
||||
return ret;
|
||||
return my_random.gen64();
|
||||
}
|
||||
u32_t get_true_random_number()
|
||||
u32_t get_fake_random_number()
|
||||
{
|
||||
u32_t ret;
|
||||
int size=read(random_fd.get_fd(),&ret,sizeof(ret));
|
||||
if(size!=sizeof(ret))
|
||||
{
|
||||
mylog(log_fatal,"get random number failed %d\n",size);
|
||||
myexit(-1);
|
||||
}
|
||||
return ret;
|
||||
//u32_t ret;
|
||||
//int size=read(random_fd.get_fd(),&ret,sizeof(ret));
|
||||
//if(size!=sizeof(ret))
|
||||
//{
|
||||
// mylog(log_fatal,"get random number failed %d\n",size);
|
||||
// myexit(-1);
|
||||
//}
|
||||
return my_random.gen32();
|
||||
}
|
||||
u32_t get_true_random_number_nz() //nz for non-zero
|
||||
u32_t get_fake_random_number_nz() //nz for non-zero
|
||||
{
|
||||
u32_t ret=0;
|
||||
while(ret==0)
|
||||
{
|
||||
ret=get_true_random_number();
|
||||
ret=get_fake_random_number();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -446,26 +504,8 @@ bool larger_than_u16(uint16_t a,uint16_t b)
|
||||
}
|
||||
}
|
||||
|
||||
void get_true_random_chars(char * s,int len)
|
||||
{
|
||||
int size=read(random_fd.get_fd(),s,len);
|
||||
if(size!=len)
|
||||
{
|
||||
printf("get random number failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
int random_between(u32_t a,u32_t b)
|
||||
{
|
||||
if(a>b)
|
||||
{
|
||||
mylog(log_fatal,"min >max?? %d %d\n",a ,b);
|
||||
myexit(1);
|
||||
}
|
||||
if(a==b)return a;
|
||||
else return a+get_true_random_number()%(b+1-a);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
int set_timer_ms(int epollfd,int &timer_fd,u32_t timer_interval)
|
||||
|
10
common.h
10
common.h
@ -58,7 +58,7 @@ typedef int i32_t;
|
||||
typedef unsigned short u16_t;
|
||||
typedef short i16_t;
|
||||
|
||||
struct itimerspec {
|
||||
struct my_itimerspec {
|
||||
struct timespec it_interval; /* Timer interval */
|
||||
struct timespec it_value; /* Initial expiration */
|
||||
};
|
||||
@ -209,9 +209,9 @@ char * my_ntoa(u32_t ip);
|
||||
|
||||
void myexit(int a);
|
||||
void init_random_number_fd();
|
||||
u64_t get_true_random_number_64();
|
||||
u32_t get_true_random_number();
|
||||
u32_t get_true_random_number_nz();
|
||||
u64_t get_fake_random_number_64();
|
||||
u32_t get_fake_random_number();
|
||||
u32_t get_fake_random_number_nz();
|
||||
u64_t ntoh64(u64_t a);
|
||||
u64_t hton64(u64_t a);
|
||||
bool larger_than_u16(uint16_t a,uint16_t b);
|
||||
@ -231,7 +231,7 @@ void myexit(int a);
|
||||
int add_iptables_rule(char *);
|
||||
|
||||
int clear_iptables_rule();
|
||||
void get_true_random_chars(char * s,int len);
|
||||
void get_fake_random_chars(char * s,int len);
|
||||
int random_between(u32_t a,u32_t b);
|
||||
|
||||
int set_timer_ms(int epollfd,int &timer_fd,u32_t timer_interval);
|
||||
|
@ -74,10 +74,10 @@ void conv_manager_t::clear()
|
||||
}
|
||||
u32_t conv_manager_t::get_new_conv()
|
||||
{
|
||||
u32_t conv=get_true_random_number_nz();
|
||||
u32_t conv=get_fake_random_number_nz();
|
||||
while(conv_to_u64.find(conv)!=conv_to_u64.end())
|
||||
{
|
||||
conv=get_true_random_number_nz();
|
||||
conv=get_fake_random_number_nz();
|
||||
}
|
||||
return conv;
|
||||
}
|
||||
|
@ -179,7 +179,7 @@ public:
|
||||
loop=0;
|
||||
cb=0;
|
||||
}
|
||||
seq=(u32_t)get_true_random_number(); //TODO temp solution for a bug.
|
||||
seq=(u32_t)get_fake_random_number(); //TODO temp solution for a bug.
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
5
main.cpp
5
main.cpp
@ -92,8 +92,11 @@ void sigint_cb(struct ev_loop *l, ev_signal *w, int revents)
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
unit_test();
|
||||
|
||||
struct ev_loop* loop=ev_default_loop(0);
|
||||
ev_signal signal_watcher_sigpipe;
|
||||
ev_signal_init(&signal_watcher_sigpipe, sigpipe_cb, SIGPIPE);
|
||||
@ -142,7 +145,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
if(strlen(tun_dev)==0)
|
||||
{
|
||||
sprintf(tun_dev,"tun%u",get_true_random_number()%1000);
|
||||
sprintf(tun_dev,"tun%u",get_fake_random_number()%1000);
|
||||
}
|
||||
|
||||
if(client_or_server==client_mode)
|
||||
|
35
misc.cpp
35
misc.cpp
@ -242,7 +242,7 @@ int delay_send(my_time_t delay,const dest_t &dest,char *data,int len)
|
||||
//mylog(log_info,"rand = %d\n",rand);
|
||||
|
||||
if (dest.cook&&random_drop != 0) {
|
||||
if (get_true_random_number() % 10000 < (u32_t) random_drop) {
|
||||
if (get_fake_random_number() % 10000 < (u32_t) random_drop) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -330,6 +330,38 @@ int handle_command(char *s)
|
||||
|
||||
int unit_test()
|
||||
{
|
||||
|
||||
{
|
||||
union test_t
|
||||
{
|
||||
u64_t u64;
|
||||
char arry[8];
|
||||
}test111;
|
||||
|
||||
assert((void*)&test111.u64==(void*)&test111.arry[0]);
|
||||
//printf("%llx,%llx\n",&ttt.u64,&ttt.arry[0]);
|
||||
|
||||
printf("%llx\n",get_fake_random_number_64());
|
||||
printf("%llx\n",get_fake_random_number_64());
|
||||
printf("%llx\n",get_fake_random_number_64());
|
||||
|
||||
printf("%x\n",get_fake_random_number());
|
||||
printf("%x\n",get_fake_random_number());
|
||||
printf("%x\n",get_fake_random_number());
|
||||
|
||||
char buf[10];
|
||||
get_fake_random_chars(buf,10);
|
||||
for(int i=0;i<10;i++)
|
||||
printf("<%d>",(int)buf[i]);
|
||||
printf("\n");
|
||||
|
||||
get_fake_random_chars(buf,10);
|
||||
for(int i=0;i<10;i++)
|
||||
printf("<%d>",(int)buf[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
int i,j,k;
|
||||
void *code=fec_new(3,6);
|
||||
char arr[6][100]=
|
||||
@ -543,6 +575,7 @@ int unit_test()
|
||||
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,7 @@ int do_obscure_old(const char * input, int in_len,char *output,int &out_len)
|
||||
if (in_len > 65535||in_len<0)
|
||||
return -1;
|
||||
int iv_len=iv_min+rand()%(iv_max-iv_min);
|
||||
get_true_random_chars(output,iv_len);
|
||||
get_fake_random_chars(output,iv_len);
|
||||
memcpy(output+iv_len,input,in_len);
|
||||
|
||||
output[iv_len+in_len]=(uint8_t)iv_len;
|
||||
@ -88,7 +88,7 @@ int do_obscure(char * data,int &len)
|
||||
assert(len<buf_len);
|
||||
|
||||
int iv_len=random_between(iv_min,iv_max);
|
||||
get_true_random_chars(data+len,iv_len);
|
||||
get_fake_random_chars(data+len,iv_len);
|
||||
data[iv_len+len]=(uint8_t)iv_len;
|
||||
for(int i=0,j=0;i<len;i++,j++)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user