socket_client.rs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use crate::{
  2. config::{Config, NetworkType},
  3. tcp::FramedStream,
  4. udp::FramedSocket,
  5. ResultType,
  6. };
  7. use anyhow::Context;
  8. use std::net::SocketAddr;
  9. use tokio::net::ToSocketAddrs;
  10. use tokio_socks::{IntoTargetAddr, TargetAddr};
  11. fn to_socket_addr(host: &str) -> ResultType<SocketAddr> {
  12. use std::net::ToSocketAddrs;
  13. host.to_socket_addrs()?.next().context("Failed to solve")
  14. }
  15. pub fn get_target_addr(host: &str) -> ResultType<TargetAddr<'static>> {
  16. let addr = match Config::get_network_type() {
  17. NetworkType::Direct => to_socket_addr(&host)?.into_target_addr()?,
  18. NetworkType::ProxySocks => host.into_target_addr()?,
  19. }
  20. .to_owned();
  21. Ok(addr)
  22. }
  23. pub fn test_if_valid_server(host: &str) -> String {
  24. let mut host = host.to_owned();
  25. if !host.contains(":") {
  26. host = format!("{}:{}", host, 0);
  27. }
  28. match Config::get_network_type() {
  29. NetworkType::Direct => match to_socket_addr(&host) {
  30. Err(err) => err.to_string(),
  31. Ok(_) => "".to_owned(),
  32. },
  33. NetworkType::ProxySocks => match &host.into_target_addr() {
  34. Err(err) => err.to_string(),
  35. Ok(_) => "".to_owned(),
  36. },
  37. }
  38. }
  39. pub async fn connect_tcp<'t, T: IntoTargetAddr<'t>>(
  40. target: T,
  41. local: SocketAddr,
  42. ms_timeout: u64,
  43. ) -> ResultType<FramedStream> {
  44. let target_addr = target.into_target_addr()?;
  45. if let Some(conf) = Config::get_socks() {
  46. FramedStream::connect(
  47. conf.proxy.as_str(),
  48. target_addr,
  49. local,
  50. conf.username.as_str(),
  51. conf.password.as_str(),
  52. ms_timeout,
  53. )
  54. .await
  55. } else {
  56. let addr = std::net::ToSocketAddrs::to_socket_addrs(&target_addr)?
  57. .next()
  58. .context("Invalid target addr")?;
  59. Ok(FramedStream::new(addr, local, ms_timeout).await?)
  60. }
  61. }
  62. pub async fn new_udp<T: ToSocketAddrs>(local: T, ms_timeout: u64) -> ResultType<FramedSocket> {
  63. match Config::get_socks() {
  64. None => Ok(FramedSocket::new(local).await?),
  65. Some(conf) => {
  66. let socket = FramedSocket::new_proxy(
  67. conf.proxy.as_str(),
  68. local,
  69. conf.username.as_str(),
  70. conf.password.as_str(),
  71. ms_timeout,
  72. )
  73. .await?;
  74. Ok(socket)
  75. }
  76. }
  77. }
  78. pub async fn rebind_udp<T: ToSocketAddrs>(local: T) -> ResultType<Option<FramedSocket>> {
  79. match Config::get_network_type() {
  80. NetworkType::Direct => Ok(Some(FramedSocket::new(local).await?)),
  81. _ => Ok(None),
  82. }
  83. }