2011-02-08 11 views
6

मेरे पास एक सर्वर है जो क्लाइंट से एक संपीड़ित स्ट्रिंग (zlib के साथ संपीड़ित) प्राप्त करता है, और मैं इस स्ट्रिंग को प्राप्त करने के लिए boost::asio लाइब्रेरी से async_receive का उपयोग कर रहा था, हालांकि यह पता चला है कि इस बात की कोई गारंटी नहीं है कि सभी बाइट प्राप्त किए जाएंगे, इसलिए अब मुझे इसे async_read में बदलना होगा। मुझे जिस समस्या का सामना करना पड़ता है वह यह है कि प्राप्त बाइट्स का आकार परिवर्तनीय है, इसलिए मुझे यकीन नहीं है कि async_read का उपयोग बिना बाइट्स की संख्या को जानने के लिए कैसे किया जाए। async_receive के साथ मेरे पास सिर्फ boost::array<char, 1024> है, हालांकि यह एक बफर है जो पूरी तरह से भरा नहीं है।boost :: asio async_read गारंटी सभी बाइट्स पढ़े जाते हैं

मुझे आश्चर्य हुआ कि कोई भी समाधान का सुझाव दे सकता है जहां मैं async_read का उपयोग कर सकता हूं, भले ही मुझे पहले से प्राप्त बाइट्स की संख्या पता न हो?

void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler) 
{ 
    if (!_queue_handler.get()) 
     _queue_handler = queue_handler; 

    std::fill(buff.begin(), buff.end(), 0); 

    //socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error)); 
    boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error)); 
} 

buff एक boost::array<char, 1024>

उत्तर

19

आप किसी अन्य विधि का उपयोग करके ऐसा करने की उम्मीद कैसे कर रहे थे? जिसका अर्थ है आप एक हैडर कि एक शरीर जिसमें जिसके बाद उम्मीद संदेश की लंबाई को परिभाषित करता है कि -

  1. संदेश द्वारा:

    एक async मनोर में चर आकार के डेटा भेजने के लिए कुछ सामान्य तरीके हैं निर्दिष्ट लंबाई का डेटा।

  2. स्ट्रीम द्वारा - जिसका अर्थ है कि आपके पास एक पूर्ण पैकेट प्राप्त करने के बारे में जानने के लिए कुछ मार्कर है (और यह बहुत व्यापक है)।
  3. कनेक्शन द्वारा - डेटा के प्रत्येक पूर्ण पैकेट को एक कनेक्शन में भेजा जाता है जो डेटा पूर्ण होने के बाद बंद हो जाता है।

तो अपने डेटा पार्स किया जा सकता है, या लंबाई आदि भेजा ...

+4

+1 कुछ संभावित समाधानों का अच्छा सारांश –

2

उपयोग async_read_until है और अपने खुद के match condition बनाने के लिए, या संकुचित स्ट्रिंग में उम्मीद करने के बाइट्स की संख्या सहित एक हैडर भेजने के लिए अपने प्रोटोकॉल बदल जाते हैं।

0

एक एकल IP पैकेट ~ 1500 बाइट्स की एक MTU आकार तक सीमित है, और अभी तक अभी भी आप गीगाबाइट-बड़ी फ़ाइलों को डाउनलोड कर सकते हैं अपनी पसंदीदा वेबसाइट से, और यूट्यूब पर मेगाबाइट आकार के वीडियो देखें।

आपको कच्चे डेटा के वास्तविक आकार को इंगित करने वाला एक हेडर भेजने की आवश्यकता है, और तब तक सभी बाइट प्राप्त करने तक छोटे टुकड़ों पर डेटा प्राप्त करें।

उदाहरण के लिए, जब आप HTTP पर एक बड़ी फ़ाइल डाउनलोड करते हैं, तो फ़ाइल के आकार को इंगित करने वाले शीर्षलेख पर एक फ़ील्ड होता है: Content-Length:

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