feat: v0.3.0 use quinn, now works

This commit is contained in:
2022-08-25 23:05:00 +08:00
parent bec4467b54
commit 04ad8ab668
5 changed files with 176 additions and 112 deletions

View File

@@ -2,6 +2,7 @@ use std::io::{Error, ErrorKind};
use std::time::Duration;
use futures::future::try_join;
use quinn::{RecvStream, SendStream};
use rust_util::util_msg;
use rust_util::util_msg::MessageType;
use tokio::{select, time};
@@ -14,33 +15,33 @@ enum StreamDirection {
Down,
}
// pub async fn transfer_for_server_to_remote(inbound: BidirectionalStream, proxy_addr: String, conn_count: String) -> Result<(), String> {
// let mut outbound = match TcpStream::connect(&proxy_addr).await {
// Ok(outbound) => outbound,
// Err(e) => {
// return Err(format!("[conn {}] Failed to connect to: {}, err: {}", &conn_count, &proxy_addr, e));
// }
// };
// if let (Ok(ref in_peer_addr), Ok(ref in_local_addr), Ok(ref out_local_addr), Ok(ref out_peer_addr))
// = (inbound.connection().remote_addr(), inbound.connection().local_addr(), outbound.local_addr(), outbound.peer_addr()) {
// let peer = format!("{} -> [{} * {}] -> {}", in_peer_addr, in_local_addr, out_local_addr, out_peer_addr);
// information!("[conn {}] New server-remote tcp connection: {}", &conn_count, peer);
// }
// let (mut ri, mut wi) = inbound.split();
// let (mut ro, mut wo) = outbound.split();
// inner_transfer(&mut ri, &mut wi, &mut ro, &mut wo, conn_count).await
// }
//
// pub async fn transfer_for_client_to_server(mut inbound: TcpStream, outbound: BidirectionalStream, conn_count: String) -> Result<(), String> {
// if let (Ok(ref in_peer_addr), Ok(ref in_local_addr), Ok(ref out_local_addr), Ok(ref out_peer_addr))
// = (inbound.peer_addr(), inbound.local_addr(), outbound.connection().local_addr(), outbound.connection().remote_addr()) {
// let peer = format!("{} -> [{} * {}] -> {}", in_peer_addr, in_local_addr, out_local_addr, out_peer_addr);
// information!("[conn {}] New client-server tcp connection: {}", &conn_count, peer);
// }
// let (mut ri, mut wi) = inbound.split();
// let (mut ro, mut wo) = outbound.split();
// inner_transfer(&mut ri, &mut wi, &mut ro, &mut wo, conn_count).await
// }
pub async fn transfer_for_server_to_remote(recv: RecvStream, send: SendStream, remote_addr: &str, local_addr: &str, proxy_addr: String, conn_count: String) -> Result<(), String> {
let mut outbound = match TcpStream::connect(&proxy_addr).await {
Ok(outbound) => outbound,
Err(e) => {
return Err(format!("[conn {}] Failed to connect to: {}, err: {}", &conn_count, &proxy_addr, e));
}
};
if let (in_peer_addr, in_local_addr, Ok(ref out_local_addr), Ok(ref out_peer_addr))
= (remote_addr, local_addr, outbound.local_addr(), outbound.peer_addr()) {
let peer = format!("{} -> [{} * {}] -> {}", in_peer_addr, in_local_addr, out_local_addr, out_peer_addr);
information!("[conn {}] New server-remote tcp connection: {}", &conn_count, peer);
}
let (mut ri, mut wi) = (recv, send);
let (mut ro, mut wo) = outbound.split();
inner_transfer(&mut ri, &mut wi, &mut ro, &mut wo, conn_count).await
}
pub async fn transfer_for_client_to_server(mut inbound: TcpStream, recv: RecvStream, send: SendStream, remote_addr: &str, local_addr: &str, conn_count: String) -> Result<(), String> {
if let (Ok(ref in_peer_addr), Ok(ref in_local_addr), out_local_addr, out_peer_addr)
= (inbound.peer_addr(), inbound.local_addr(), local_addr, remote_addr) {
let peer = format!("{} -> [{} * {}] -> {}", in_peer_addr, in_local_addr, out_local_addr, out_peer_addr);
information!("[conn {}] New client-server tcp connection: {}", &conn_count, peer);
}
let (mut ri, mut wi) = inbound.split();
let (mut ro, mut wo) = (recv, send);
inner_transfer(&mut ri, &mut wi, &mut ro, &mut wo, conn_count).await
}
async fn inner_transfer<'a, R1, W1, R2, W2>(mut ri: &'a mut R1, mut wi: &'a mut W1, mut ro: &'a mut R2, mut wo: &'a mut W2, conn_count: String) -> Result<(), String>
where R1: AsyncRead + Unpin + ?Sized, W1: AsyncWrite + Unpin + ?Sized,