2012-06-08 18 views
5

का उपयोग कर प्रोटोबफ ऑब्जेक्ट्स पढ़ना मैं बूस्ट एएसओ का उपयोग कर एक एप्लीकेशन लिख रहा हूं जिसमें क्लाइंट और सर्वर संदेश जो Google प्रोटो-बफर का उपयोग करके क्रमबद्ध हैं। मुझे नहीं पता कि नेटवर्क पर क्रमबद्ध संदेश का आकार क्या है। ऐसा लगता है कि प्रोटो-बफ ऑब्जेक्ट्स में कोई डिलीमीटर नहीं है।बूस्ट :: asio :: read_async

यहां .proto फ़ाइल की सामग्री दी गई है।

package tutorial; 

message Person { 
     required string name = 1; 
     required int32 id = 2; 
     optional string email = 3; 
} 

यहाँ है मैं कैसे सर्वर

 tutorial::Person p; 
     p.set_name("abcd pqrs"); 
     p.set_id(123456); 
     p.set_email("[email protected]"); 
     write(p); 

     boost::asio::streambuf b; 
     std::ostream os(&b); 
     p.SerializeToOstream(&os); 
     boost::asio::async_write(socket_, b, 
         boost::bind(&Server::handle_write, this, 
           boost::asio::placeholders::error)); 

से लिख रहा हूँ ग्राहक मैं संदेश को बढ़ावा देने :: asio :: async_read का उपयोग करके उपरोक्त भेजा पढ़ रहा हूँ में। arg के मान को नीचे दिए गए कोड में boost::asio::transfer_at_least पर तर्क के रूप में सेट करने के तरीके को कैसे पता चलेगा?

boost::asio::async_read(socket_, response_, 
          boost::asio::transfer_at_least(arg), 
          boost::bind(&Client::handle_read_header, this, 
            boost::asio::placeholders::error)); 

अन्यथा मैं कैसे सुनिश्चित करूं कि बूस्ट :: async_read पूरे ऑब्जेक्ट को पढ़ने के बाद वापस आती है?

+0

मुझे जवाब नहीं पता, लेकिन मुझे भी रूचि है, इसलिए +1। –

+0

क्या आपने अपनी समस्या का समाधान किया है? मुझे बहुत दिलचस्पी है, और स्टील को प्रोटोबफ + बूस्ट डालने के बारे में कोई स्पष्ट निराशा नहीं है :: एएसओ एक साथ –

उत्तर

5

सही, protobufs सीमित नहीं हैं। वहां कोई जानकारी नहीं है कि एक संदेश केवल एक बाइटस्ट्रीम से समाप्त होता है - भले ही आपने उन सभी क्षेत्रों को देखा हो जिन्हें आप जानते हैं, हो सकता है कि अधिक बार दोहराए गए तत्व हों या किसी ने प्रोटोटा को उस क्षेत्र के साथ बढ़ाया हो जिसे आप नहीं जानते हैं।

एक सामान्य समाधान फ्रेम के साथ फ्रेम को उपसर्ग करना है (आमतौर पर VarInt एस के रूप में एन्कोड किया गया है)। उदाहरण के लिए LevelDB और Szl दोनों इस दृष्टिकोण का उपयोग करते हैं। VarInt बाइट द्वारा अनजाने में डीकोडेड बाइट हो सकता है, और फिर आप अपने पूरे संदेश को पार्स करने से पहले कितने बाइट पढ़ने के लिए जानते हैं।

+2

यह भी देखें http://stackoverflow.com/questions/2340730/are-there-c-equivalents-for-the-protocol -बफर्स-डिलीमिटेड-आईओ-फ़ंक्शंस-इन-जे कुछ एपीआई में सीमित लेखन/पढ़ने की सुविधा होती है जिसे आप जवाब में उल्लिखित अनुसार स्वयं के लिए आसानी से कार्यान्वित कर सकते हैं। – Andreas

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