2014-11-01 2 views
1

다음 코드는 TcpListener의 녹 문서에서와 거의 같습니다. 코드가 Ubuntu 14.04에서 실행되면 오류가 발생하지 않지만 동시에 작동하지 않습니다! (netstat -an | grep ':80' 또는 telnet이이 서버에 연결하지 않음).녹청 TcpListener가 실패했지만 오류가 표시되지 않았습니다.

포트를 변경하면 작동합니다. listen() 뒤에 unwrap()을 추가하면 코드에 "액세스 거부 오류"가 표시됩니다. 나는 listen()IOResult<T>을 반환한다고 읽었고 사용하지 않으면 오류가 발생하지 않습니다. 그러나 나는 이것을 acceptor.incoming()이라고 부르며이 호출에서 오류가 발생할 것으로 예상합니다. 왜 그런 일이 일어나지 않습니까?

녹 버전 : rustc 0.13.0 - 야간 (bd7138dd6 2014년 10월 27일 23시 2분 55초 0000)

우분투 14.04

fn main() { 
    let listener = TcpListener::bind("127.0.0.1", 80); 

    // bind the listener to the specified address 
    let mut acceptor = listener.listen(); //unwrap() here 

    fn handle_client(mut stream: TcpStream) { 
     println!("a"); 
    } 
    // accept connections and process them, spawning a new tasks for each one 
    for stream in acceptor.incoming() { 
     match stream { 
     Err(e) => { /* connection failed */ } 
     Ok(stream) => 
      spawn(proc() { 
       // connection succeeded 
       handle_client(stream) 
      }) 
     } 
    } 
    // close the socket server 
    drop(acceptor); 
} 
+0

특권 포트 (<1024)를 열기 위해서는 루트 여야합니다 – Arjan

+0

나는 그것이 저에게 문제가되지 않는다는 것을 이해했습니다. 문제는 프로그램이 오류를 입력하지 않았다는 것입니다. –

+1

@FedorovMikhail은'println! ("{}", e);'에 의해'/ * connection failed * /'를 대체하고 오류를 보게됩니다. – Levans

답변

2

유의 한 요인은 ListenerAcceptor가 있다는 것입니다 둘 다 IoResult<T>에 대해 구현되며 T이 적절한 특성을 구현합니다. 여기 src/libstd/io/result.rs의 단편이다 :

impl<T, A: Acceptor<T>, L: Listener<T, A>> Listener<T, A> for IoResult<L> { 
    fn listen(self) -> IoResult<A> { 
     match self { 
      Ok(listener) => listener.listen(), 
      Err(e) => Err(e), 
     } 
    } 
} 

impl<T, A: Acceptor<T>> Acceptor<T> for IoResult<A> { 
    fn accept(&mut self) -> IoResult<T> { 
     match *self { 
      Ok(ref mut acceptor) => acceptor.accept(), 
      Err(ref e) => Err(e.clone()), 
     } 
    } 
} 

따라서, TcpListener::bind 반환 즉시에 .listen()를 호출 할 수 있습니다 IoResult<TcpListener>; .listen()도 마찬가지로 IoResult<TcpAcceptor>을 반환하고 Acceptor이 구현되므로 .incoming()을 호출하면 실패 할 경우 항상 즉시 바인딩 또는 청취 오류를 발생시킵니다.

관련 문제