2015-11-06 74 views
0
let listener = TcpListener::bind("localhost:1234").unwrap(); 
for stream in listener.incoming() { 
    let s = stream.unwrap(); 
    handle_stream(s); 
} 

fn handle_stream(mut stream: TcpStream) ->() { 
    let mut buf = [0]; 
    loop { 
     let _ = match stream.read(&mut buf) { 
      Err(e) => panic!("Got an error: {}", e), 
      Ok(m) => { 
       println!("Received {:?}, {:?}", m, buf); 
       if m == 0 { 
        // doesn't reach here. 
        break; 
       } 
       m 
      }, 
     }; 
    } 
} 

然後我通過運行curl http://localhost:1234連接到服務器。如何防止讀取時阻塞TcpStream?

我預計Ok(0)將被返回,但它沒有達到該聲明,而是掛起。如果這是一個EOF,在這種情況下我該如何處理?

回答

2

你想用TcpStream::set_read_timeout,然後檢查是否有特定類型的錯誤:

use std::io::{self, Read}; 
use std::net::{TcpListener, TcpStream}; 
use std::time::Duration; 

fn main() { 
    let listener = TcpListener::bind("localhost:1234").unwrap(); 
    for stream in listener.incoming() { 
     let s = stream.unwrap(); 
     handle_stream(s); 
    } 

    fn handle_stream(mut stream: TcpStream) ->() { 
     let mut buf = [0]; 
     stream.set_read_timeout(Some(Duration::from_millis(100))).unwrap(); 
     loop { 
      let _ = match stream.read(&mut buf) { 
       Err(e) => { 
        match e.kind() { 
         io::ErrorKind::WouldBlock => { 
          println!("would have blocked"); 
          break; 
         }, 
         _ => panic!("Got an error: {}", e), 
        } 
       }, 
       Ok(m) => { 
        println!("Received {:?}, {:?}", m, buf); 
        if m == 0 { 
         // doesn't reach here. 
         break; 
        } 
        m 
       }, 
      }; 
     } 
    } 
}