2015-01-31 14 views
-1

我将有多个功能,都需要访问一个主要的套接字。如何将套接字作为参数传递给在线程中调用的函数?

会是更好的:

  1. 通过这个插槽给需要访问它的每个功能
  2. 有一个全局可访问的插座

有人能提供的最好的方法的例子做这个?

我来自Python/Nim背景,这样的事情很容易完成。

编辑: 如何将套接字作为参数传递给线程中调用的函数。例如,

fn main() { 
    let mut s = BufferedStream::new((TcpStream::connect(server).unwrap())); 
    let thread = Thread::spawn(move || { 
     func1(s, arg1, arg2); 
    }); 

    while true { 
     func2(s, arg1); 
    } 
} 

回答

1

回答更新问题

我们可以用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特有的,这些都是通用的编程实践。

+0

谢谢。现在,如果我可以延长这个问题,如何将一个套接字传递给一个线程内的函数:) – user3746744 2015-02-01 00:51:50

+0

@ user3746744我不确定你的意思,但我只是'把'整个套接字'移动到线程中线程创建时间。然后线程拥有套接字,类似于'GameService'结构在答案中拥有它的方式。如果没有清除它,你应该阅读[Rust编程语言中的线程章节](http://doc.rust-lang.org/book/threads.html),然后根据需要询问新的澄清问题。 – Shepmaster 2015-02-01 01:59:41

+0

现在我真的在想它,我可能只是使用该结构从线程访问套接字。 – user3746744 2015-02-01 02:47:24

相关问题