try to optimice with splice
This commit is contained in:
parent
a698bbb14f
commit
293c94e9a2
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -2,6 +2,12 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.133"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linked-hash-map"
|
name = "linked-hash-map"
|
||||||
version = "0.5.6"
|
version = "0.5.6"
|
||||||
@ -12,7 +18,7 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
|
|||||||
name = "minecraft_proxy"
|
name = "minecraft_proxy"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"linked-hash-map",
|
"libc",
|
||||||
"yaml-rust",
|
"yaml-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -5,4 +5,4 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
yaml-rust = "*"
|
yaml-rust = "*"
|
||||||
linked-hash-map = "*"
|
libc = "*"
|
@ -19,6 +19,10 @@ impl Guard {
|
|||||||
*self.cont.read().unwrap() < MAX_THREADS
|
*self.cont.read().unwrap() < MAX_THREADS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_connections(&self)->usize{
|
||||||
|
*self.cont.read().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_thread(&mut self,
|
pub fn add_thread(&mut self,
|
||||||
threads: (thread::JoinHandle<()>, thread::JoinHandle<()>))-> bool {
|
threads: (thread::JoinHandle<()>, thread::JoinHandle<()>))-> bool {
|
||||||
if self.can_add() {
|
if self.can_add() {
|
||||||
|
@ -2,6 +2,12 @@ use std::net::TcpStream;
|
|||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
|
use libc::splice;
|
||||||
|
use libc::pipe;
|
||||||
|
use libc::{SPLICE_F_MORE,SPLICE_F_MOVE};
|
||||||
|
use std::os::unix::io::AsRawFd;
|
||||||
|
use std::ptr;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use crate::protocol;
|
use crate::protocol;
|
||||||
pub mod guard;
|
pub mod guard;
|
||||||
@ -31,9 +37,19 @@ impl<'a> Client<'a> {
|
|||||||
fn join_conexions_mutex(c1: Arc<Mutex<TcpStream>>,
|
fn join_conexions_mutex(c1: Arc<Mutex<TcpStream>>,
|
||||||
c2: Arc<Mutex<TcpStream>>,
|
c2: Arc<Mutex<TcpStream>>,
|
||||||
run: Arc<RwLock<bool>>){
|
run: Arc<RwLock<bool>>){
|
||||||
let mut buf: [u8; 100000] = [0; 100000];
|
let mut buf: [u8; 200] = [0; 200];
|
||||||
let mut client = c1.lock().unwrap().try_clone().unwrap();
|
let mut client = c1.lock().unwrap().try_clone().unwrap();
|
||||||
|
let mut len2;
|
||||||
|
let mut p: [i32;2] = [0,0];
|
||||||
|
let tam = 200;
|
||||||
|
let mut max = 0;
|
||||||
|
let mut time;
|
||||||
|
let mut time2;
|
||||||
|
let mut fin = 0;
|
||||||
|
let mut fin2 = 0;
|
||||||
|
unsafe{len2 = pipe(p.as_ptr() as *mut i32);}
|
||||||
while *run.read().unwrap() {
|
while *run.read().unwrap() {
|
||||||
|
time = SystemTime::now();
|
||||||
let res=client.read(&mut buf);
|
let res=client.read(&mut buf);
|
||||||
match res {
|
match res {
|
||||||
Ok(leng) => {
|
Ok(leng) => {
|
||||||
@ -41,15 +57,59 @@ impl<'a> Client<'a> {
|
|||||||
*run.write().unwrap()=false;
|
*run.write().unwrap()=false;
|
||||||
}
|
}
|
||||||
match c2.lock().unwrap().write(&buf [.. leng]) {
|
match c2.lock().unwrap().write(&buf [.. leng]) {
|
||||||
Ok(_l) => {},
|
Ok(_l) => {
|
||||||
|
time2 = SystemTime::now();
|
||||||
|
fin2 = time2.duration_since(time).unwrap_or_default().as_micros();
|
||||||
|
if fin2 > fin {
|
||||||
|
fin = fin2;
|
||||||
|
}
|
||||||
|
},
|
||||||
Err(_e) => *run.write().unwrap()=false,
|
Err(_e) => *run.write().unwrap()=false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Err(_e) => *run.write().unwrap()=false,
|
Err(_e) => *run.write().unwrap()=false,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
println!("time {}", fin);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn join_conexions_kernel(c1: Arc<Mutex<TcpStream>>,
|
||||||
|
c2: Arc<Mutex<TcpStream>>,
|
||||||
|
run: Arc<RwLock<bool>>){
|
||||||
|
let mut client = c1.lock().unwrap().try_clone().unwrap();
|
||||||
|
let mut len2;
|
||||||
|
let mut p: [i32;2] = [0,0];
|
||||||
|
let tam = 20000;
|
||||||
|
let mut len;
|
||||||
|
let mut time;
|
||||||
|
let mut time2;
|
||||||
|
let mut fin = 0;
|
||||||
|
let mut fin2 = 0;
|
||||||
|
unsafe{len2 = pipe(p.as_ptr() as *mut i32);}
|
||||||
|
while *run.read().unwrap() {
|
||||||
|
time = SystemTime::now();
|
||||||
|
unsafe {
|
||||||
|
len = splice(client.as_raw_fd(), ptr::null_mut(),
|
||||||
|
p[1], ptr::null_mut(), tam, SPLICE_F_MOVE);
|
||||||
|
|
||||||
|
if len <= 0 {
|
||||||
|
*run.write().unwrap()=false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
splice(p[0], ptr::null_mut(),
|
||||||
|
c2.lock().unwrap().as_raw_fd(), ptr::null_mut(),
|
||||||
|
len as usize, SPLICE_F_MOVE | SPLICE_F_MORE);
|
||||||
|
time2 = SystemTime::now();
|
||||||
|
fin2 = time2.duration_since(time).unwrap_or_default().as_micros();
|
||||||
|
if fin2 > fin {
|
||||||
|
fin = fin2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
println!("time {}",fin);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_proxy(&self) -> (thread::JoinHandle<()>, thread::JoinHandle<()>) {
|
pub fn start_proxy(&self) -> (thread::JoinHandle<()>, thread::JoinHandle<()>) {
|
||||||
|
@ -16,6 +16,7 @@ fn main() {
|
|||||||
let guard = Arc::new(RwLock::new(guard::Guard::new()));
|
let guard = Arc::new(RwLock::new(guard::Guard::new()));
|
||||||
for stream in listener.incoming() {
|
for stream in listener.incoming() {
|
||||||
if guard.read().unwrap().can_add(){
|
if guard.read().unwrap().can_add(){
|
||||||
|
println!("g {}",guard.read().unwrap().get_connections());
|
||||||
match stream {
|
match stream {
|
||||||
Ok(stream) => {
|
Ok(stream) => {
|
||||||
let g = guard.clone();
|
let g = guard.clone();
|
||||||
|
Loading…
Reference in New Issue
Block a user