connector.rs 914 B

12345678910111213141516171819202122232425262728293031
  1. use futures::FutureExt;
  2. use log::*;
  3. use smol::{Async, Executor};
  4. use std::net::{SocketAddr, TcpStream};
  5. use std::sync::Arc;
  6. use crate::error::{Error, Result};
  7. use crate::net::utility::sleep;
  8. use crate::net::{Channel, ChannelPtr, SettingsPtr};
  9. pub struct Connector {
  10. settings: SettingsPtr,
  11. }
  12. impl Connector {
  13. pub fn new(settings: SettingsPtr) -> Self {
  14. Self { settings }
  15. }
  16. pub async fn connect(&self, hostaddr: SocketAddr) -> Result<ChannelPtr> {
  17. futures::select! {
  18. stream_result = Async::<TcpStream>::connect(hostaddr).fuse() => {
  19. match stream_result {
  20. Ok(stream) => Ok(Channel::new(stream, hostaddr, self.settings.clone())),
  21. Err(_) => Err(Error::ConnectFailed)
  22. }
  23. }
  24. _ = sleep(self.settings.connect_timeout_seconds).fuse() => Err(Error::ConnectTimeout)
  25. }
  26. }
  27. }