Miałem to samo pytanie, a po niektórych badań, najprostszy, najczystszym rozwiązanie mogłem wymyślić było dostać instrumentu bazowego natywnego gniazda i dokonaj wyboru, dopóki nie będzie danych do odczytania. Opcja Wybierz będzie mieć parametr limitu czasu. Oczywiście, praca z natywnym gniazdem zaczyna się w pierwszym rzędzie sprzeczna z używaniem asio, ale znowu wydaje się być najczystszym sposobem. O ile mogłem powiedzieć, asio nie zapewnia tego w łatwy sposób do synchronicznego użycia. Kod:
// 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);
...
Być może będzie to przydatne w twojej sytuacji.
To byłoby świetne rozwiązanie, ale nie ma takich opcji gniazd. Zobacz opcje gniazd tutaj: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference.html –
Zwiększenie jest dobre, ale nie doskonałe :-) –
Ale z tego, co mogę powiedzieć, asio's read_some() będzie wewnętrznie kontynuował pętlę na zawsze, jeśli nic nie przeczyta, tym samym anulując działanie SO_RCVTIMEO, które mógłbyś ustawić na macierzystym gnieździe. Wygląda to jak użycie select() z socket.native() nadal będzie najbardziej oczywistym sposobem na przekroczenie limitu czasu. –