回答更新问题
我们可以用TcpStream::try_clone
:
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();
}
原来的答复
它通常是(让我们说的99.9%),一个坏主意,有任何全局可变状态,如果你能帮助它。只要按照你所说的去做:将套接字传递给需要它的函数。
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),
}
}
您也可以通过TcpStream
来管理它,一个结构,从而让你把类似的方法的地方。
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),
}
}
这些都不是Rust特有的,这些都是通用的编程实践。
谢谢。现在,如果我可以延长这个问题,如何将一个套接字传递给一个线程内的函数:) – user3746744 2015-02-01 00:51:50
@ user3746744我不确定你的意思,但我只是'把'整个套接字'移动到线程中线程创建时间。然后线程拥有套接字,类似于'GameService'结构在答案中拥有它的方式。如果没有清除它,你应该阅读[Rust编程语言中的线程章节](http://doc.rust-lang.org/book/threads.html),然后根据需要询问新的澄清问题。 – Shepmaster 2015-02-01 01:59:41
现在我真的在想它,我可能只是使用该结构从线程访问套接字。 – user3746744 2015-02-01 02:47:24