在多个函数中使用TcpStream的结构中的Rust变量

vfh0ocws  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(148)

我试图创建一个使用std::net::TcpStream读/写套接字的结构。我得到了一个函数中的测试代码,但当试图将代码拆分为多个函数时,(read()write(),等)我想共享TcpStream对象。在其他语言中,我会创建一个类TcpStream变量(初始化为null),然后让一个connect()函数使用TcpStream::connect()将变量设置为一个对象。然后我可以在其他类函数中使用类变量。但我没有在Rust中使用它。我已经研究了once_celllazy_static,但没有任何进展。
我想做的是:

pub struct Connection<'a> {
  url:&'a str,
  conn: &TcpStream
}

impl Connection<'_> {

  pub fn new(url: &str) -> Connection {
    return Connection {
      url: url
    }
  }

  pub fn connect(&self) -> bool {
    self.conn = TcpStream::connect();
    return true;
  }

  pub fn write(&self, cmd : &str ) -> bool {
    self.conn.write(cmd);
    return true;
  }

  pub fn read() -> String {
    return self.conn.read();
  }
}

let my_connection = Connection::new("localhost:23");

字符串

sqougxex

sqougxex1#

一种解决方案是将TcpStream转换为Singleton,最好的方法是使用thread_local宏。
以下内容仅供参考,不包含任何错误处理:

pub struct Connection {
    url: String,
}

impl Connection {
    thread_local! {
         static MY_CONNECTION: RefCell<TcpStream> = RefCell::new(TcpStream::connect("localhost:23").expect("STREAM"));
    }

    pub fn new(url: &str) -> Connection {
        Self::MY_CONNECTION.with(|conn| {
            *conn.borrow_mut() = TcpStream::connect(url).expect("STREAM");
        });
        Connection {
            url: url.to_string(),
        }
    }

    pub fn connect(&self, to: &str) -> bool {
        Self::MY_CONNECTION
            .with(|conn| *conn.borrow_mut() = TcpStream::connect(to).expect("STREAM"));
        true
    }

    pub fn write(&self, cmd: &[u8]) -> bool {
        Self::MY_CONNECTION
            .with(|conn| conn.borrow_mut().write(cmd))
            .is_ok()
    }

    pub fn read(&self, buf: &mut [u8]) -> Option<usize> {
        Self::MY_CONNECTION
            .with(|conn| {
                let mut c = conn.borrow_mut();
                c.read(buf)
            })
            .ok()
    }
}

字符串
Playground

相关问题