use std::net::{IpAddr, SocketAddr};
use quinn::{Connection, Endpoint};
use rand::Rng;
use tracing::warn;
use crate::{Result, config::Config};
pub(super) async fn try_port_hopping_connection(
endpoint: &Endpoint,
config: &Config,
server_addr: SocketAddr,
server_ip: IpAddr,
) -> Result<Connection> {
if let Some((start, end)) = config.port_hopping_range {
let port = rand::rng().random_range(start..=end);
let random_remote_addr = SocketAddr::new(server_ip, port);
match endpoint.connect(random_remote_addr, &config.server_name) {
Ok(connecting) => match connecting.await {
Ok(c) => return Ok(c),
Err(e) => {
warn!("connect {random_remote_addr} error {e}, fallback to default port");
}
},
Err(e) => {
warn!("connect {random_remote_addr} error {e}, fallback to default port");
}
}
}
Ok(endpoint.connect(server_addr, &config.server_name)?.await?)
}