2013-06-28 16 views
7

Voglio fare quanto segue con Boost Asio. Ho un socket e voglio registrare un callback da chiamare quando i dati sono disponibili per la lettura/scrittura sul socket, ma non voglio che faccia effettivamente la lettura/scrittura. Fondamentalmente, ciò di cui ho bisogno è simile a async_read_some/async_write_some, tranne per il fatto che la lettura e la scrittura non vengono eseguite.Asincronicamente in attesa fino a quando un socket è disponibile per la lettura/scrittura in Asio

Ho bisogno di questo perché sto usando una libreria esterna con la sua funzione di lettura e scrittura che richiede un descrittore di socket come parametro di input e voglio usare questa libreria in modo asincrono.

+0

Vuoi il codice che utilizza async_connect, async_write, async_read? – mattn

+0

Solo async_read e async_write. Posso connettermi da solo perché la libreria usa socket da connessioni già stabilite, quindi posso usare async_connect da solo. – petersohn

risposta

8

Siete alla ricerca di operazioni in stile reattore. Questi possono essere ottenuti fornendo boost::asio::null_buffers alle operazioni asincrone. operazioni Reactor stile possono essere utili per l'integrazione con librerie di terze parti, utilizzando pool di memoria condivisa, ecc Boost.Asio documentation fornisce alcune informazioni e il seguente codice di esempio:

ip::tcp::socket socket(my_io_service); 
... 
socket.non_blocking(true); 
... 
socket.async_read_some(null_buffers(), read_handler); 
... 
void read_handler(boost::system::error_code ec) 
{ 
    if (!ec) 
    { 
    std::vector<char> buf(socket.available()); 
    socket.read_some(buffer(buf)); 
    } 
} 

Boost.Asio fornisce anche un funzionario nonblocking example , che illustra come integrarsi con le librerie che vogliono eseguire le operazioni di lettura e scrittura direttamente su un socket.

+0

'null_buffers' è stato deprecato da Boost 1.66.0: [_" (Obsoleto: utilizza le funzioni membro socket/descriptor wait() e async \ _wait().) "_] (Http://www.boost.org) /doc/libs/1_66_0/doc/html/boost_asio/reference/null_buffers.html) – sehe

Problemi correlati