mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 14:29:34 +08:00
it works well,though the upd close bug is still there
This commit is contained in:
parent
fa00adcf37
commit
a25b9db3e8
50
main.cpp
50
main.cpp
@ -822,7 +822,7 @@ int server_raw_recv(iphdr * iph,tcphdr *tcph,char * data,int data_len)
|
|||||||
ev.events = EPOLLIN;
|
ev.events = EPOLLIN;
|
||||||
ev.data.fd = udp_fd;
|
ev.data.fd = udp_fd;
|
||||||
int ret = epoll_ctl(epollfd, EPOLL_CTL_DEL, udp_fd, &ev);
|
int ret = epoll_ctl(epollfd, EPOLL_CTL_DEL, udp_fd, &ev);
|
||||||
close(udp_fd);
|
//close(udp_fd);
|
||||||
udp_fd=-1;
|
udp_fd=-1;
|
||||||
}
|
}
|
||||||
received_session_id=session_id;
|
received_session_id=session_id;
|
||||||
@ -916,7 +916,7 @@ int server_raw_recv(iphdr * iph,tcphdr *tcph,char * data,int data_len)
|
|||||||
ev.events = EPOLLIN;
|
ev.events = EPOLLIN;
|
||||||
ev.data.fd = old_fd;
|
ev.data.fd = old_fd;
|
||||||
ret = epoll_ctl(epollfd, EPOLL_CTL_DEL, old_fd, &ev);
|
ret = epoll_ctl(epollfd, EPOLL_CTL_DEL, old_fd, &ev);
|
||||||
close(old_fd);
|
//close(old_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -926,14 +926,14 @@ int server_raw_recv(iphdr * iph,tcphdr *tcph,char * data,int data_len)
|
|||||||
received_session_id=tmp_received_session_id;
|
received_session_id=tmp_received_session_id;
|
||||||
printf("created new udp_fd");
|
printf("created new udp_fd");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("received a data from fake tcp,len:%d\n",data_len);
|
printf("received a data from fake tcp,len:%d\n",data_len);
|
||||||
int ret=send(udp_fd,data+1+sizeof(session_id)*2,data_len -(1+sizeof(session_id)*2),0);
|
int ret=send(udp_fd,data+1+sizeof(session_id)*2,data_len -(1+sizeof(session_id)*2),0);
|
||||||
printf("%d byte sent\n",ret);
|
printf("%d byte sent\n",ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
char raw_recv_buf[buf_len];
|
||||||
|
char raw_recv_buf2[buf_len];
|
||||||
|
|
||||||
int on_raw_recv()
|
int on_raw_recv()
|
||||||
{
|
{
|
||||||
@ -981,6 +981,47 @@ int on_raw_recv()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////ip
|
||||||
|
uint32_t ip_chk=csum ((unsigned short *) ip_data, iphdrlen);
|
||||||
|
|
||||||
|
int psize = sizeof(struct pseudo_header) + ip_len-iphdrlen;
|
||||||
|
/////ip end
|
||||||
|
|
||||||
|
|
||||||
|
///tcp
|
||||||
|
struct pseudo_header psh;
|
||||||
|
|
||||||
|
psh.source_address = iph->saddr;
|
||||||
|
psh.dest_address = iph->daddr;
|
||||||
|
psh.placeholder = 0;
|
||||||
|
psh.protocol = IPPROTO_TCP;
|
||||||
|
psh.tcp_length = htons(ip_len-iphdrlen);
|
||||||
|
|
||||||
|
memcpy(raw_recv_buf2 , (char*) &psh , sizeof (struct pseudo_header));
|
||||||
|
memcpy(raw_recv_buf2 + sizeof(struct pseudo_header) , ip_data+ iphdrlen , ip_len-iphdrlen);
|
||||||
|
|
||||||
|
uint16_t tcp_chk = csum( (unsigned short*) raw_recv_buf2, psize);
|
||||||
|
|
||||||
|
|
||||||
|
if(ip_chk!=0)
|
||||||
|
{
|
||||||
|
printf("ip header error %d\n",ip_chk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(tcp_chk!=0)
|
||||||
|
{
|
||||||
|
printf("tcp_chk:%x\n",tcp_chk);
|
||||||
|
printf("tcp header error\n");
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
////tcp end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// char pseudo_tcp_buffer[MTU];
|
||||||
|
|
||||||
int data_len = ip_len-tcphdrlen-iphdrlen;
|
int data_len = ip_len-tcphdrlen-iphdrlen;
|
||||||
|
|
||||||
@ -1237,7 +1278,6 @@ int server()
|
|||||||
{
|
{
|
||||||
if (events[n].data.fd == udp_fd)
|
if (events[n].data.fd == udp_fd)
|
||||||
{
|
{
|
||||||
|
|
||||||
int recv_len=recv(udp_fd,buf,buf_len,0);
|
int recv_len=recv(udp_fd,buf,buf_len,0);
|
||||||
printf("received a packet from udp_fd,len:%d\n",recv_len);
|
printf("received a packet from udp_fd,len:%d\n",recv_len);
|
||||||
perror("wtf?");
|
perror("wtf?");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user