mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 14:29:34 +08:00
fix bug of conv cleaning
This commit is contained in:
parent
8ecb55d845
commit
340a8b09bc
81
main.cpp
81
main.cpp
@ -53,6 +53,7 @@ const int mode_icmp=2;
|
||||
int raw_mode=mode_udp;
|
||||
|
||||
char local_address[100], remote_address[100],source_address[100];
|
||||
uint32_t local_address_uint32,remote_address_uint32,source_address_uint32;
|
||||
int local_port = -1, remote_port = -1;
|
||||
int epollfd ;
|
||||
|
||||
@ -300,7 +301,8 @@ struct conv_manager_t
|
||||
map<uint32_t,uint64_t>::iterator it;
|
||||
for(it=conv_last_active_time.begin();it!=conv_last_active_time.end();it++)
|
||||
{
|
||||
clear_function(it->second);
|
||||
int fd=int((it->second<<32u)>>32u);
|
||||
clear_function(fd);
|
||||
}
|
||||
}
|
||||
u64_to_conv.clear();
|
||||
@ -932,6 +934,7 @@ int recv_raw_ip(packet_info_t &info,char * &payload,int &payloadlen)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
char *ip_begin=recv_raw_ip_buf+link_level_header_len; //14 is eth net header
|
||||
|
||||
iph = (struct iphdr *) (ip_begin);
|
||||
@ -940,6 +943,12 @@ int recv_raw_ip(packet_info_t &info,char * &payload,int &payloadlen)
|
||||
info.dst_ip=iph->daddr;
|
||||
info.protocol=iph->protocol;
|
||||
|
||||
if(local_address_uint32!=0 &&info.dst_ip!=local_address_uint32)
|
||||
{
|
||||
printf(" bind adress doenst match, dropped\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (!(iph->ihl > 0 && iph->ihl <=60)) {
|
||||
if(debug_mode) printf("iph ihl error");
|
||||
@ -2054,7 +2063,7 @@ int try_to_list_and_bind(int port)
|
||||
|
||||
temp_bind_addr.sin_family = AF_INET;
|
||||
temp_bind_addr.sin_port = htons(port);
|
||||
temp_bind_addr.sin_addr.s_addr = inet_addr(local_address);
|
||||
temp_bind_addr.sin_addr.s_addr = local_address_uint32;
|
||||
|
||||
if (bind(bind_fd, (struct sockaddr*)&temp_bind_addr, sizeof(temp_bind_addr)) !=0)
|
||||
{
|
||||
@ -2105,7 +2114,7 @@ int keep_connection_client() //for client
|
||||
}
|
||||
printf("using port %d\n", g_packet_info_send.src_port);
|
||||
|
||||
g_packet_info_send.src_ip = inet_addr(source_address);
|
||||
|
||||
|
||||
|
||||
init_filter(g_packet_info_send.src_port);
|
||||
@ -2536,6 +2545,9 @@ int server_on_raw_recv(packet_info_t &info)
|
||||
g_packet_info_send.src_port = info.src_port;;
|
||||
}
|
||||
|
||||
g_packet_info_send.src_ip=info.dst_ip;
|
||||
g_packet_info_send.src_port=info.dst_port;
|
||||
|
||||
g_packet_info_send.dst_port = info.src_port;
|
||||
g_packet_info_send.dst_ip = info.src_ip;
|
||||
|
||||
@ -2707,7 +2719,7 @@ int server_on_raw_recv(packet_info_t &info)
|
||||
memset(&remote_addr_in, 0, sizeof(remote_addr_in));
|
||||
remote_addr_in.sin_family = AF_INET;
|
||||
remote_addr_in.sin_port = htons(remote_port);
|
||||
remote_addr_in.sin_addr.s_addr = inet_addr(remote_address);
|
||||
remote_addr_in.sin_addr.s_addr = remote_address_uint32;
|
||||
|
||||
int new_udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if(new_udp_fd<0)
|
||||
@ -2846,6 +2858,7 @@ int client_event_loop()
|
||||
{
|
||||
char buf[buf_len];
|
||||
|
||||
g_packet_info_send.src_ip = inet_addr(source_address);
|
||||
|
||||
int i, j, k;int ret;
|
||||
init_raw_socket();
|
||||
@ -2853,10 +2866,10 @@ int client_event_loop()
|
||||
conv_num=get_true_random_number_nz();
|
||||
|
||||
//init_filter(source_port);
|
||||
g_packet_info_send.dst_ip=inet_addr(remote_address);
|
||||
g_packet_info_send.dst_ip=remote_address_uint32;
|
||||
g_packet_info_send.dst_port=remote_port;
|
||||
|
||||
//g_packet_info.src_ip=inet_addr(source_address);
|
||||
//g_packet_info.src_ip=source_address_uint32;
|
||||
//g_packet_info.src_port=source_port;
|
||||
|
||||
udp_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
@ -2871,7 +2884,7 @@ int client_event_loop()
|
||||
memset(&local_me, 0, sizeof(local_me));
|
||||
local_me.sin_family = AF_INET;
|
||||
local_me.sin_port = htons(local_port);
|
||||
local_me.sin_addr.s_addr = inet_addr(local_address);
|
||||
local_me.sin_addr.s_addr = local_address_uint32;
|
||||
|
||||
|
||||
if (bind(udp_fd, (struct sockaddr*) &local_me, slen) == -1) {
|
||||
@ -3004,8 +3017,8 @@ int server_event_loop()
|
||||
conv_manager.set_clear_function(server_clear);
|
||||
int i, j, k;int ret;
|
||||
|
||||
g_packet_info_send.src_ip=inet_addr(local_address);
|
||||
g_packet_info_send.src_port=local_port;
|
||||
//g_packet_info_send.src_ip=inet_addr(local_address);
|
||||
//g_packet_info_send.src_port=local_port;
|
||||
|
||||
if(raw_mode==mode_tcp)
|
||||
{
|
||||
@ -3021,7 +3034,7 @@ int server_event_loop()
|
||||
|
||||
temp_bind_addr.sin_family = AF_INET;
|
||||
temp_bind_addr.sin_port = htons(local_port);
|
||||
temp_bind_addr.sin_addr.s_addr = inet_addr(local_address);
|
||||
temp_bind_addr.sin_addr.s_addr = local_address_uint32;
|
||||
|
||||
if (bind(bind_fd, (struct sockaddr*)&temp_bind_addr, sizeof(temp_bind_addr)) !=0)
|
||||
{
|
||||
@ -3077,13 +3090,16 @@ int server_event_loop()
|
||||
{
|
||||
uint32_t conv_id=events[n].data.u64>>32u;
|
||||
|
||||
int fd=int((events[n].data.u64<<32u)>>32u);
|
||||
|
||||
if(!conv_manager.is_u64_used(events[n].data.u64))
|
||||
{
|
||||
printf("conv no longer exists");
|
||||
printf("conv no longer exists\n");
|
||||
//int recv_len=recv(fd,buf,buf_len,0); ///////////TODO ,delete this
|
||||
continue;
|
||||
}
|
||||
|
||||
int fd=int((events[n].data.u64<<32u)>>32u);
|
||||
|
||||
|
||||
int recv_len=recv(fd,buf,buf_len,0);
|
||||
|
||||
@ -3123,13 +3139,47 @@ int server_event_loop()
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h> /* For strncpy */
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <netinet/in.h>
|
||||
#include <net/if.h>
|
||||
#include <arpa/inet.h>
|
||||
int get_ip()
|
||||
{
|
||||
int fd;
|
||||
struct ifreq ifr;
|
||||
|
||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
|
||||
|
||||
/* I want to get an IPv4 IP address */
|
||||
ifr.ifr_addr.sa_family = AF_INET;
|
||||
|
||||
/* I want an IP address attached to "eth0" */
|
||||
strncpy(ifr.ifr_name, "eth1", IFNAMSIZ-1);
|
||||
|
||||
ioctl(fd, SIOCGIFADDR, &ifr);
|
||||
|
||||
close(fd);
|
||||
|
||||
/* Display result */
|
||||
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
get_ip();
|
||||
srand(time(0));
|
||||
|
||||
|
||||
|
||||
if(raw_mode==mode_tcp)
|
||||
{
|
||||
g_packet_info_send.protocol=IPPROTO_TCP;
|
||||
@ -3157,6 +3207,13 @@ int main(int argc, char *argv[])
|
||||
signal(SIGCHLD, handler);
|
||||
process_arg(argc,argv);
|
||||
|
||||
local_address_uint32=inet_addr(local_address);
|
||||
remote_address_uint32=inet_addr(remote_address);
|
||||
source_address_uint32=inet_addr(source_address);
|
||||
|
||||
|
||||
|
||||
|
||||
for(int i=0;i<16;i++)
|
||||
{
|
||||
key2[i]=key[i]+1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user