tcp.rs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use tokio::net::{TcpSocket, TcpStream};
  2. use tokio_socks::tcp::Socks5Stream;
  3. use crate::messenger::error::MessengerError;
  4. /// Parameters used in establishing a connection, optionally through a socks proxy.
  5. /// (Members may be useful elsewhere as well, but that's the primary purpose.)
  6. #[derive(Clone)]
  7. pub struct SocksParams {
  8. /// Optional socks proxy address.
  9. pub socks: Option<String>,
  10. /// The target server or peer.
  11. pub target: String,
  12. /// The user who owns this connection.
  13. pub user: String,
  14. /// The recipient of messages sent on this connection.
  15. /// Group for client-server, user for p2p.
  16. pub recipient: String,
  17. }
  18. pub async fn connect(str_params: &SocksParams) -> Result<TcpStream, MessengerError> {
  19. match &str_params.socks {
  20. Some(socks) => {
  21. let socks_addr = &socks.as_str().parse().unwrap();
  22. let socks_socket = TcpSocket::new_v4()?;
  23. socks_socket.set_nodelay(true)?;
  24. let socks_connection = socks_socket.connect(*socks_addr).await?;
  25. let target_connection = Socks5Stream::connect_with_password_and_socket(
  26. socks_connection,
  27. str_params.target.as_str(),
  28. &str_params.user,
  29. &str_params.recipient,
  30. )
  31. .await;
  32. match target_connection {
  33. Ok(stream) => Ok(stream.into_inner()),
  34. Err(e) => Err(e.into()),
  35. }
  36. }
  37. None => {
  38. let addr = &str_params.target.parse().unwrap();
  39. let socket = TcpSocket::new_v4()?;
  40. socket.set_nodelay(true)?;
  41. socket.connect(*addr).await.map_err(|e| e.into())
  42. }
  43. }
  44. }