ich die gleiche Frage hatte, und nach einigen Recherchen, die einfachste und sauberste Lösung, die ich tun konnte, war das darunter liegende zu bekommen nativen Socket, und führen Sie eine Auswahl durch, bis Daten zu lesen waren. Wählen Sie einen Timeout-Parameter. Natürlich beginnt die Arbeit mit dem nativen Socket gegen den Punkt der Verwendung von Asio an erster Stelle, aber wieder scheint dies der sauberste Weg zu sein. Soweit ich das beurteilen konnte, bietet asio keine Möglichkeit, dies für die synchrone Nutzung leicht zu tun. Code:
// 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);
...
Vielleicht wird dies für Ihre Situation nützlich sein.
Dies wäre eine großartige Lösung, aber sie haben keine solchen Socket-Optionen. Siehe Socket-Optionen hier: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference.html –
Boost sind gut, aber nicht perfekt :-) –
Aber was ich sagen kann, asios read_some() wird weiterhin intern für immer fortgesetzt, wenn es nichts liest, wodurch der Effekt von SO_RCVTIMEO aufgehoben wird, den Sie möglicherweise für den systemeigenen Socket gesetzt haben. Sieht so aus, als würde select() mit socket.native() immer noch der naheliegendste Weg sein, ein Timeout zu haben. –