Rust 如何将套接字作为参数传递给线程中正在调用的函数?
我将有多个功能,都需要访问一个主插座 是否最好:Rust 如何将套接字作为参数传递给线程中正在调用的函数?,rust,Rust,我将有多个功能,都需要访问一个主插座 是否最好: 将此套接字传递给需要访问它的每个函数 具有全局可访问的套接字 有人能举例说明最好的方法吗 我来自Python/Nim的背景,这样的事情很容易完成 编辑: 如何将套接字作为参数传递给线程中正在调用的函数。 前 更新问题的答案 我们可以使用: 原始答案 如果你能帮助的话,通常(比如说99.9%的时候)拥有任何全局可变状态都是个坏主意。照你说的做:将套接字传递给需要它的函数 use std::io::{self, Write}; use std::ne
use std::io::{self, Write};
use std::net::TcpStream;
fn send_name(stream: &mut TcpStream) -> io::Result<()> {
stream.write(&[42])?;
Ok(())
}
fn send_number(stream: &mut TcpStream) -> io::Result<()> {
stream.write(&[1, 2, 3])?;
Ok(())
}
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:31337").unwrap();
let r = send_name(&mut stream).and_then(|_| send_number(&mut stream));
match r {
Ok(..) => println!("Yay, sent!"),
Err(e) => println!("Boom! {}", e),
}
}
这些都不是真正特定于锈菌的,它们是普遍适用的编程实践 多谢各位。现在,如果我可以进一步讨论这个问题,如何将套接字传递给线程中的函数:)@user3746744我不确定您的确切意思,但我只想在线程创建时将整个套接字移动到线程中。然后线程拥有套接字,类似于
GameService
struct在答案中拥有套接字的方式。如果这还不清楚,您应该阅读,然后根据需要提出新的澄清问题。现在我真的考虑过了,我可能可以使用该结构从线程访问套接字。
use std::io::Read;
use std::net::{TcpStream, Shutdown};
use std::thread;
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:34254").unwrap();
let stream2 = stream.try_clone().unwrap();
let _t = thread::spawn(move || {
// close this stream after one second
thread::sleep_ms(1000);
stream2.shutdown(Shutdown::Read).unwrap();
});
// wait for some data, will get canceled after one second
let mut buf = [0];
stream.read(&mut buf).unwrap();
}
use std::io::{self, Write};
use std::net::TcpStream;
fn send_name(stream: &mut TcpStream) -> io::Result<()> {
stream.write(&[42])?;
Ok(())
}
fn send_number(stream: &mut TcpStream) -> io::Result<()> {
stream.write(&[1, 2, 3])?;
Ok(())
}
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:31337").unwrap();
let r = send_name(&mut stream).and_then(|_| send_number(&mut stream));
match r {
Ok(..) => println!("Yay, sent!"),
Err(e) => println!("Boom! {}", e),
}
}
use std::io::{self, Write};
use std::net::TcpStream;
struct GameService {
stream: TcpStream,
}
impl GameService {
fn send_name(&mut self) -> io::Result<()> {
self.stream.write(&[42])?;
Ok(())
}
fn send_number(&mut self) -> io::Result<()> {
self.stream.write(&[1, 2, 3])?;
Ok(())
}
}
fn main() {
let stream = TcpStream::connect("127.0.0.1:31337").unwrap();
let mut service = GameService { stream: stream };
let r = service.send_name().and_then(|_| service.send_number());
match r {
Ok(..) => println!("Yay, sent!"),
Err(e) => println!("Boom! {}", e),
}
}