我如何"分享"线程和函数之间的套接字?

时间:2015-02-03 13:59:00

标签: rust

我试图在从套接字接收数据时从stdin获取用户输入。然后我想将用户输入发送到套接字。如何将套接字传递给能够发送和读取的线程,同时从stdin读取主函数并将其发送到套接字。此功能不需要能够从套接字读取。 我希望能够使用BufferedStream作为我的套接字读取器。
线程接收和发送 - (while) - 函数从stdin获取输入并发送到套接字。

1 个答案:

答案 0 :(得分:2)

这取决于你实际使用套接字和标准输入以及如何交错它们。

最干净的方法是使用通道在线程之间传递数据:

use std::old_io as io;
use std::old_io::net::tcp::TcpStream;
use std::sync::mpsc::channel;
use std::thread::Thread;

fn main() {
    let (tx, rx) = channel::<Vec<u8>>();
    let g = Thread::scoped(move || {
        let mut s = TcpStream::connect("example.com:80").unwrap();
        println!("> Opened connection, waiting for input");
        let query = rx.recv().unwrap();
        s.write(&query).unwrap();
        s.close_write();

        let r = String::from_utf8(s.read_to_end().unwrap()).unwrap();
        println!("Response:\n{}", r);
    });

    let mut data = Vec::new();
    for line in io::stdin().lock().lines() {
        let line = line.unwrap();
        if line.trim().is_empty() { break; }
        data.push_all(line.trim().as_bytes());
        data.push_all(b"\r\n");
    }
    data.push_all(b"\r\n");
    tx.send(data).unwrap();

    println!("Waiting for response...");
}

TcpStream上有一个clone()方法&#34;分割&#34;套接字分成两部分。您可以将它们传递给不同的线程。但是,请考虑先使用频道。