2011-05-18 9 views
6

Possible Duplicate:
How to set a timeout on blocking sockets in boost asio?impulso asio del tiempo de espera

He leído algunas de las entradas antes sobre el tiempo de espera, pero no lo entiendo.

Quiero un tiempo de espera definido para la conexión. el código de conexión se ve así:

try{ 
    boost::asio::ip::tcp::resolver    resolver(m_ioService); 
    boost::asio::ip::tcp::resolver::query  query(link.get_host(), link.get_scheme()); 
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
    boost::asio::ip::tcp::resolver::iterator end; 
    boost::system::error_code     error = boost::asio::error::host_not_found; 

    while (error && endpoint_iterator != end) 
    { 
    m_socket.close(); 
    m_socket.connect(*endpoint_iterator++, error); 
    } 
} 

También quiero un tiempo de espera de lectura.

Uso boost::asio::read_until(m_socket, response, "\r\n"); para leer el encabezado.

¿es posible establecer SIMPLE un tiempo de espera?

+0

Lea [cómo establecer un tiempo de espera en el socket de bloqueo] (http://stackoverflow.com/questions/291871/how-to-set-a-timeout-on-blocking-sockets-in-boost-asio) parece que no hay una manera fácil. –

Respuesta

12

En primer lugar, creo que SIEMPRE debe utilizar los métodos asíncronos, ya que son mejores y su diseño solo se beneficiará de un enfoque de patrón de reactor. En el mal caso de que tengas prisa y estés realizando prototipos, los métodos de sincronización pueden ser útiles. En este caso, estoy de acuerdo con usted en que, sin ningún soporte de tiempo de espera, no pueden usarse en el mundo real.

Lo que hice fue muy simple:

void HttpClientImpl::configureSocketTimeouts(boost::asio::ip::tcp::socket& socket) 
{ 
#if defined OS_WINDOWS 
    int32_t timeout = 15000; 
    setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); 
    setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout)); 
#else 
    struct timeval tv; 
    tv.tv_sec = 15; 
    tv.tv_usec = 0;   
    setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 
    setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); 
#endif 
} 

El código anterior funciona tanto en Windows como en Linux y en Mac OS, de acuerdo con la macro OS_WINDOWS.

+1

¿No hay alguna biblioteca que debo incluir para que esto funcione? –

+0

da error: 'HttpClientImpl' no ha sido declarado –

+0

¿Puede por favor ayudarme a encontrar por qué su respuesta [no funciona] (http://stackoverflow.com/questions/33668717/boost-asio-blocking-mode-timeout- on-native-socket-handle-is-not-working) para mí? –

3

El uso de boost :: asio y las llamadas sychronous como read_until no permiten configurar fácilmente un tiempo de espera.

Sugiero pasar a las llamadas asincrónicas (como async_read), y combinar eso con un deadline_timer para lograr este objetivo.

+0

+1 para recomendar llamadas asincrónicas. –

+1

Buena suerte con asio asio. Tuve bloqueos misteriosos usándolos, no a menudo, pero lo suficiente como para dudar de la estabilidad de la aplicación. Todos se fueron cuando cambié a varios hilos cada uno con asio síncrono. – wallyk

+5

Lamentamos que hayas tenido problemas con boost :: asio. Si bien es definitivamente una curva de aprendizaje y hay muchas cosas que deben hacerse "exactamente", he encontrado que para el desarrollo multiplataforma de aplicaciones bajo una gran carga de red (al punto que las llamadas sincrónicas como select() , estaban causando los principales cuellos de botella), boost :: asio ha funcionado muy bien y se le han otorgado beneficios definitivos. – Chad

Cuestiones relacionadas