2015-04-09 9 views
6

Sto eseguendo il accept function of a TCP listener in un ciclo in un thread separato. Vorrei chiudere questo thread con garbo, ma non riesco a vedere alcun tipo di meccanismo shutdown che potrei usare per interrompere l'accettazione.Come interrompere il blocco TcpListener :: accetta la chiamata?

mio attuale approccio simile a questa:

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()); 
} 

Ma questo non fa il trucco (probabilmente perché mi cade solo la copia clonata?). Qualche idea su come spegnere correttamente tale thread?

(per riferimento, I asked this question on rust user forum as well)

risposta

5

La questione è fondamentale, come nel fine chiamata accept() traduce fino ad una libc::accept() (vedi here e here).

La soluzione sarebbe quella di utilizzare nonblocking-io, ad esempio mio.


Edi: Dopo alcune considerazioni ho studiato la possibilità di interrompere il accept() utilizzando close(). Sembra inaffidabile. Ma this alzato: usando shutdown(). TcpStream espone questa funzione, ma sembra essere l'unico caso. Potrebbe essere una mancanza dell'API?

+0

Grazie, probabilmente hai ragione che manca la funzionalità nell'API. Ti ho dato +1, ma mi piacerebbe aspettare ancora un po ', forse qualcuno ha una spiegazione diversa. –

Problemi correlati