que tenía la misma pregunta, y después de algunas investigaciones, la solución más limpia más simple que pudiera venir fue para obtener el subyacente socket nativo, y hacer una selección hasta que haya datos para leer. Seleccionar tomará un parámetro de tiempo de espera. Por supuesto, trabajar con el socket nativo comienza a ir en contra del uso de asio en primer lugar, pero de nuevo, esta parece ser la forma más limpia. Por lo que pude ver, asio no proporciona una forma de hacer esto para el uso sincrónico fácilmente. Código:
// socket here is: boost::shared_ptr<boost::asio::ip::tcp::socket> a_socket_ptr
// Set up a timed select call, so we can handle timeout cases.
fd_set fileDescriptorSet;
struct timeval timeStruct;
// set the timeout to 30 seconds
timeStruct.tv_sec = 30;
timeStruct.tv_usec = 0;
FD_ZERO(&fileDescriptorSet);
// We'll need to get the underlying native socket for this select call, in order
// to add a simple timeout on the read:
int nativeSocket = a_socket_ptr->native();
FD_SET(nativeSocket,&fileDescriptorSet);
select(nativeSocket+1,&fileDescriptorSet,NULL,NULL,&timeStruct);
if(!FD_ISSET(nativeSocket,&fileDescriptorSet)){ // timeout
std::string sMsg("TIMEOUT on read client data. Client IP: ");
sMsg.append(a_socket_ptr->remote_endpoint().address().to_string());
throw MyException(sMsg);
}
// now we know there's something to read, so read
boost::system::error_code error;
size_t iBytesRead = a_socket_ptr->read_some(boost::asio::buffer(myVector), error);
...
Quizás esto le sea útil para su situación.
Esta sería una gran solución, pero no tienen tales opciones de socket. Vea las opciones de socket aquí: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference.html –
Boost son buenos pero no perfectos :-) –
Pero por lo que puedo decir, asio's read_some() aún continuará internamente en bucle siempre si no lee nada, por lo que cancela el efecto de SO_RCVTIMEO que puede haber configurado en el socket nativo. Parece que usar select() con socket.native() seguirá siendo la forma más obvia de tener un tiempo de espera excedido. –