मैं एक ही सवाल था, और कुछ शोध के बाद, सरल, साफ समाधान मैं के साथ आ सकता है अंतर्निहित मिल गया था मूल सॉकेट, और तब तक चयन करें जब तक डेटा पढ़ने के लिए न हो। चयन एक टाइमआउट पैरामीटर ले जाएगा। बेशक, देशी सॉकेट के साथ काम करना पहले स्थान पर एएसओ का उपयोग करने के बिंदु के खिलाफ जाना शुरू होता है, लेकिन फिर से, यह सबसे साफ तरीका प्रतीत होता है। जहां तक मैं कह सकता हूं, एएसओ सिंक्रोनस उपयोग के लिए इसे करने का एक तरीका प्रदान नहीं करता है। कोड:
// 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);
...
शायद यह आपकी स्थिति के लिए उपयोगी होगा।
स्रोत
2011-04-20 18:43:43
यह एक अच्छा समाधान होगा, लेकिन उनके पास ऐसे सॉकेट विकल्प नहीं हैं। सॉकेट विकल्प यहां देखें: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference.html –
बूस्ट अच्छा है लेकिन सही नहीं है :-) –
लेकिन मैं जो कह सकता हूं उससे, asio's read_some() अभी भी आंतरिक रूप से लूप को हमेशा के लिए जारी रखेगा यदि यह कुछ भी नहीं पढ़ता है, इस प्रकार SO_RCVTIMEO के प्रभाव को रद्द करना आप मूल सॉकेट पर सेट हो सकते हैं। ऐसा लगता है कि socket.native() के साथ चयन() का उपयोग करना अभी भी टाइमआउट करने का सबसे स्पष्ट तरीका होगा। –