2011-01-13 13 views
23

का उपयोग कर फ़ाइल डिस्क्रिप्टर पर प्रतीक्षा करें, मैं अपने boost::asio एप्लिकेशन के साथ डी-बस को एकीकृत करने की कोशिश कर रहा हूं।Async Boost Asio

डी-बस में एक एपीआई है जो यूनिक्स फ़ाइल डिस्क्रिप्टर (मुख्य रूप से सॉकेट लेकिन एफआईएफओ भी हो सकता है) के सेट को गिनती है। जब उन वर्णनकर्ताओं को कुछ पढ़ना पड़ता है तो मुझे डी-बस एपीआई को सूचित करना चाहिए ताकि यह उन्हें पढ़ सके और यह बात कर सके।

वर्तमान में मैं यह कर रहा हूँ:

using boost::asio::posix::stream_descriptor; 
void read_handle(stream_descriptor* desc, const boost::system::error_code& ec, 
       std::size_t bytes_read) 
{ 
    if (!ec) { 
     stream_descriptor::bytes_readable command(true); 
     descriptor->io_control(command); 
     std::size_t bytes_readable = command.get(); 
     std::cout << "It thinks I should read" << bytes_readable 
      << " bytes" << std::endl; 
    } else { 
     std::cout << "There was an error" << std::endl; 
    } 
} 

void watch_descriptor(boost::asio::io_service& ios, int file_descriptor) 
{ 
    // Create the asio representation of the descriptor 
    stream_descriptor* desc = new stream_descriptor(ios); 
    desc->assign(file_descriptor); 

    // Try to read 0 bytes just to be informed that there is something to be read 
    std::vector<char> buffer(0); 
    desc->async_read_some(boost::asio::buffer(buffer, 0), 
     boost::bind(read_handle, desc, _1, _2)); 
} 

लेकिन हैंडलर तुरंत कहा कि यह पढ़ने के लिए 0 बाइट्स है कि कहा जाता है। मैं इसे केवल तभी बुलाया जाना चाहूंगा जब कुछ पढ़ा जाए, लेकिन boost :: asio इसे पढ़ नहीं सकता है। इसे एक गौरवशाली select() के रूप में कार्य करना चाहिए। क्या ऐसा करने का कोई आसान तरीका है?

पीएस: मैं अपने सॉफ्टवेयर में boost::asio का उपयोग कर बड़े पैमाने पर उपयोग कर रहा हूं, यह इसका एक छोटा सा हिस्सा है, इसलिए मैं glib या अन्य मेनलोप्स पर निर्भर नहीं होना चाहता हूं।

+0

डी-बस एपीआई क्या है जिसका आप उपयोग कर रहे हैं? क्या यह निम्न-स्तर सी एपीआई है? –

उत्तर

26

यह समस्या ठीक है null_buffersdesigned था।

कभी कभी एक प्रोग्राम है जो चाहता है मैं/हे आपरेशन ही प्रदर्शन करने के लिए एक तीसरी पार्टी पुस्तकालय के साथ एकीकृत किया जाना चाहिए। इसे सुविधाजनक बनाने के लिए, Boost.Asio में एक null_buffers प्रकार शामिल है जो दोनों संचालन को पढ़ने और लिखने के साथ उपयोग किया जा सकता है। एक null_buffers ऑपरेशन ऑपरेशन करने के लिए I/O ऑब्जेक्ट "तैयार" होने तक वापस नहीं आता है।

ip::tcp::socket socket(my_io_service); 
... 
ip::tcp::socket::non_blocking nb(true); 
socket.io_control(nb); 
... 
socket.async_read_some(null_buffers(), read_handler); 
... 
void read_handler(boost::system::error_code ec) 
{ 
    if (!ec) 
    { 
    std::vector<char> buf(socket.available()); 
    socket.read_some(buffer(buf)); 
    } 
} 

वहाँ भी है एक excellent example दस्तावेज में शामिल हैं:

उदाहरण के लिए, एक गैर अवरुद्ध प्रदर्शन करने के लिए निम्नलिखित इस्तेमाल किया जा सकता की तरह कुछ पढ़ा है।

+0

यह वही था जो मैं ढूंढ रहा था। यह पूरी तरह से एकीकृत है। आपका बहुत बहुत धन्यवाद! –

+1

हाय सैम, क्या आप उल्लेख किए गए दस्तावेज में शामिल उत्कृष्ट उदाहरण के बारे में अधिक समझा सकते हैं? मैं 'third_party_lib.session' को पढ़ने/AsyncRead/लिखें/Async लिखने के लिए कुछ उपयोग करना चाहता हूं, मैं इसे कैसे कर सकता हूं? मैं अभी भी इतना स्पष्ट नहीं हूँ। तीसरे_party_lib अनुकरण करने वाला उदाहरण वास्तव में मुझे उलझन में डाल दिया। धन्यवाद। –

+0

@ पीटर कृपया एक नया प्रश्न पूछें, उदाहरण के किस हिस्से को भ्रमित करते हुए शामिल करें। –

संबंधित मुद्दे