2015-04-09 11 views
6

Tôi đang chạy accept function of a TCP listener trong một vòng lặp trong một chuỗi riêng biệt. Tôi muốn tắt chủ đề này một cách duyên dáng, nhưng tôi không thể thấy bất kỳ loại cơ chế shutdown nào mà tôi có thể sử dụng để thoát khỏi việc chấp nhận.Cách thoát khỏi chặn TcpListener :: chấp nhận cuộc gọi?

cách tiếp cận hiện tại của tôi trông giống như sau:

use std::net::TcpListener; 
use std::thread::spawn; 

fn main() { 
    let tcp_listener = TcpListener::bind((("0.0.0.0"), 0)).unwrap(); 
    let tcp_listener2 = tcp_listener.try_clone().unwrap(); 

    let t = spawn(move || { 
     loop { 
      match tcp_listener2.accept() { 
       Ok(_) => { } 
       Err(_) => { break; } 
      } 
     } 
    }); 

    drop(tcp_listener); 
    assert!(t.join().is_ok()); 
} 

Nhưng điều đó không làm các trick (có lẽ vì tôi thả chỉ có bản sao nhân bản?). Bất kỳ suy nghĩ về cách tắt đúng thread như vậy?

(để tham khảo, I asked this question on rust user forum as well)

Trả lời

5

Câu hỏi đặt ra là một trong những nền tảng, như cuối cùng thì cuộc gọi accept() dịch xuống một libc::accept() (xem herehere).

Giải pháp sẽ là sử dụng nonblocking-io, xem ví dụ mio.


Edi: Sau một số cân nhắc tôi nghiên cứu khả năng làm gián đoạn accept() sử dụng close(). Nó có vẻ không đáng tin cậy. Nhưng this được bật lên: Sử dụng shutdown(). TcpStream cho thấy chức năng này, nhưng nó có vẻ là trường hợp duy nhất. Có thể là một thiếu sót của API?

+0

Cảm ơn bạn, có thể bạn đang thiếu chức năng trong API. Tôi đã cho bạn +1, nhưng tôi muốn chờ lâu hơn một chút, có thể ai đó có một lời giải thích khác. –

Các vấn đề liên quan