Una solución fácil a este problema sería utilizar las funciones nativas de lectura y escritura.
para escribir con tiempo de espera de 1 segundo:
struct timeval tv = { 1, 0 };
setsockopt(socket.native_handle(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
ssize_t nsent = ::write(socket->native_handle(), buff, size);
if (nsent > 0) {
BOOST_LOG_TRIVIAL(debug) << "Sent " << nsent << " bytes to remote client " << ep;
} else if (nsent == 0) {
BOOST_LOG_TRIVIAL(info) << "Client " << ep << " closed connection";
} else if (errno != EAGAIN) {
BOOST_LOG_TRIVIAL(info) << "Client " << ep << " error: " << strerror(errno);
}
para leer con tiempo de espera de 1 segundo:
struct timeval tv = { 1, 0 };
setsockopt(socket.native_handle(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
ssize_t nread = ::read(socket.native_handle(), buff, audio_buff_size);
if (nread > 0) {
} else if (nread == 0) {
BOOST_LOG_TRIVIAL(info) << "Source " << source << " server " << host << " closed connection";
break;
} else if (errno != EAGAIN) {
BOOST_LOG_TRIVIAL(info) << "Source " << source << " server " << host << " error: " << strerror(errno);
break;
}
Esto funcionó bien para mí.
todas menos las funciones de enviar/recv de nivel más bajo tienen bucles (;;) alrededor de las llamadas que atrapan explícitamente EAGAIN. Esto hace que las opciones SO_ {SND, RCV} TIMEO sean inútiles a menos que deseche el 95% de las funciones de envío/recepción en Boost. Por lo tanto, es discutible que le permitan establecer las opciones, porque la única forma de aprovecharlo es no usar el resto de la biblioteca ... – Tom
Excelente punto. Acabo de golpear esto ahora. Sucks. –