2012-02-10 10 views
17

तो अपने मुख्य यहां सवाल यह है कि asio टीसीपी के शीर्ष पर एक संरचना लागू करने के लिए :: सॉकेट या टीसीपी :: iostream है कि बफर 1kb कहने के लिए ऊपर के साथ some kind of input-seekable filter enter image description hereबूस्ट iostreams: कैसे टीएफसी स्ट्रीम buffered (पढ़ने के लिए) बनाने के लिए?

लागू होता है?

+6

एक समस्या यह है कि एसिंक्रोनस सॉकेट पर धाराओं का उपयोग करना मुश्किल है। उदाहरण के लिए, जब तक बफर में और नहीं होता तब तक आप धारा से एक स्ट्रिंग पढ़ते हैं। लेकिन आप (या धारा) कैसे जानते हैं कि यह वास्तव में स्ट्रिंग का अंत है? बाकी एक और पैकेट में आ सकते हैं, और यह जानने का कोई तरीका नहीं है कि कब, या वास्तव में, इसे वितरित किया जाएगा। –

+0

जिज्ञासा से आपने इसे देखा है? http://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream – NothingMore

+0

@ जोचिमपिलबोर्ग: यह जानना बेहद आसान है - जब तक आप सॉकेट पर स्ट्रीम या त्रुटि के अंत तक नहीं पहुंच जाते। बाकी व्यवसाय तर्क है जो उपयोग में उच्च स्तरीय प्रोटोकॉल पर निर्भर करता है। ऐसा कहा जा रहा है कि, बफरिंग की आवश्यकता है, लेकिन इसके लिए सी ++ iostream होना braindead है। लिबेवेंट उस कारण से अच्छा सामान्य उद्देश्य बफर एपीआई प्रदान करता है। –

उत्तर

0

मैं इस विशेष बूस्ट मॉड्यूल से परिचित नहीं हूं। लेकिन, यदि आप एक बफर बनाने के लिए एक रास्ता तलाश रहे हैं जो कि एक प्रकार की भंडार की तरह कार्य करता है, तो मैं इसे प्रबंधित करने के लिए एक और धागा बनाउंगा। थ्रेड आने वाली स्ट्रीम को LIFO कर सकता है, फ़िल्टर अनुरोधों और बफर प्रबंधन को संभालने में सक्षम है। इसे एक अलग धागे पर रखने का मतलब यह होगा कि सिस्टम बफर खत्म होने से पहले आने वाले पैकेट पर ध्यान दिया जाएगा, इसलिए आपको कुछ भी याद करने की चिंता करने की आवश्यकता नहीं है। धागे के बीच मध्यस्थता के लिए एक संदेश कतार बनाया जा सकता है।

यह कहा जाता है कि अंत में इसे संभालने के लिए पूर्व निर्धारित लिबरी को देखने और अपने आप को थोड़ा समय बचाने के लिए शायद सबसे आसान होगा। this post देखें।

1

मुझे लगता है कि "स्ट्रीम के अंत में जाना" जैसे कुछ टीसीपी कनेक्शन के लिए संभव नहीं होगा। इस तरह की कॉल (निम्नलिखित कोड देखें) कनेक्शन बंद करने के लिए प्रतीक्षा करें (ब्लॉक)? और बफर आकार तक पहुंचने पर प्रतिक्रिया को कैसे स्टोर करना चाहिए (उदाहरण के लिए 1 केबी)?

s.seekg (0, ios::end); 

तो सामान्य रूप से एक तलाश योग्य टीसीपी धारा को लागू करने के लिए यह कठिन (/ असंभव?) होगा। यहां तक ​​कि यदि आपके पास असीमित बफर है (न केवल 1 केबी)।

सामग्री-लंबाई शीर्षलेख सेट होने पर HTTP (एस) जैसे विशिष्ट प्रोटोकॉल के लिए इनपुट-खोज योग्य जैसे कुछ लागू करना संभव होना चाहिए। लेकिन इस परिदृश्य में 1Kb का एक निश्चित आकार बफर तब तक काम नहीं करेगा जब तक कि आप HTTP/1.1 रेंज हेडर का उपयोग न करें।

शायद यह मदद करता है: क्रिस्टोफर एम Kohlhoff (बूस्ट के लेखक asio) लागू किया Urdl जहां वह एक IStream के रूप में HTTP कनेक्शन मॉडलिंग (SourceForge पर 'Prealpha' के रूप में चिह्नित)। मुझे लगता है कि विधि read_some आपके लिए दिलचस्प हो सकती है: https://github.com/jnorthrup/urdl/blob/master/include/urdl/detail/http_read_stream.hpp#L426

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

  • कोई संबंधित समस्या नहीं^_^