2010-11-01 18 views
11

मैं जब मैं बढ़ावा :: asio :: बफर के साथ std :: स्ट्रिंग का उपयोग करने की कोशिश कर रहा हूँ निम्न त्रुटि संदेश मिलता है:कैसे asio साथ std :: स्ट्रिंग का उपयोग करना :: बफर()

बढ़ावा /asio/detail/consuming_buffers.hpp: निर्माता में 'को बढ़ावा देने :: asio :: विस्तार :: consuming_buffers < बढ़ावा :: asio :: mutable_buffer, को बढ़ावा देने :: asio :: const_buffers_1

:: consuming_buffers (स्थिरांक बढ़ावा :: asio :: const_buffers_1 &) ': बढ़ावा/asio/impl/पुनः ad.hpp: 140: 25:
'को बढ़ावा देने से instantiated :: asio :: विस्तार :: read_op < बढ़ावा :: asio :: basic_stream_socket, बढ़ावा :: asio :: const_buffers_1 , को बढ़ावा देने :: asio :: विस्तार :: transfer_all_t , को बढ़ावा देने :: _ द्वि :: bind_t < शून्य, को बढ़ावा देने :: _ एमएफआई :: MF1 , को बढ़ावा देने :: _ द्वि :: List2, को बढ़ावा देने :: ARG < 1> (*)()>

:: read_op ( बढ़ावा :: asio :: basic_stream_socket &, स्थिरांक बढ़ावा :: asio :: const_buffers_1 & , को बढ़ावा देने :: asio :: विस्तार :: transfer_all_t , को बढ़ावा देने :: _ द्वि :: bind_t < शून्य, को बढ़ावा देने :: _ एमएफआई :: MF1 , को बढ़ावा देने :: _ द्वि :: List2, को बढ़ावा देने :: ARG < 1> (*)()>

)' 
.... 
....... 

पूर्ण स्रोत कोड: http://liveworkspace.org/code/eca749f6f2714b7c3c4df9f26a404d86

+0

देखो अगर 2 आप के बाद के वर्षों अभी भी उत्सुक हैं:

std :: वेक्टर एक बेहतर विकल्प होना चाहिए http ://स्टैक ओवरफ़्लो।कॉम/प्रश्न/27 9 0383/कैसे-से-एसिंक्रोनिस-रीड-टू-स्टडस्ट्रिंग-उपयोग-बूस्टैसियो – NoSenseEtAl

उत्तर

10

मुझे लगता है कि समस्या यह है कि आप एक परिवर्तनशील बफर के बजाय async_read करने के लिए एक स्थिरांक बफर से गुजर रहे हैं है। पंक्ति 50 में समाप्त होने वाले ब्लॉक में, boost::asio::buffer(_header) एक कॉन्स बफर देता है। आपको boost::asio::async_read(s, boost::asio::buffer(data, size), handler) जैसे कुछ करना चाहिए, क्योंकि boost::asio::buffer(data, size) एक म्यूटेबल बफर बनाता है।

इसके बजाय _header और _data के लिए std::string रों का उपयोग करने का, तो आप शायद इस तरह के रूप चार की सरणियों, उपयोग करने की आवश्यकता:

चार * _data;
बढ़ावा :: asio :: buffer (_data, strlen (_data));

बफर और async_read के संदर्भ देखें।

+2

मुझे पूरा यकीन है कि std :: तारों को char * arrays को असाइन किया जा सकता है, और कोई std से char * सरणी निर्यात कर सकता है :: स्ट्रिंग के साथ स्ट्रिंग :: string.c_str() –

+0

'std :: string :: c_str()' रिटर्न 'कॉन्स char *' '' char * '। इसका उपयोग केवल 'const_buffer' के साथ किया जा सकता है। –

4

आप पहले पैरामीटर के रूप एक सूचक गुजरना होगा:: इस पर

#include <string> 
#include <boost/asio.hpp> 

std::string request, reply; 
auto rsize = boost::asio::buffer(&reply[0], request.size()); 
+1

एक नोट के रूप में, सी ++ 11 तक, यह जरूरी नहीं है। प्री-सी ++ 11, std :: स्ट्रिंग द्वारा आयोजित चार सरणी को संगत होने की गारंटी नहीं थी, जिसे boost :: asio :: buffer द्वारा आवश्यक है। अभ्यास में, प्रत्येक कंपाइलर स्मृति के एक संगत ब्लॉक का उपयोग करता है, और इसलिए यह C++ 11 में आवश्यक व्यवहार बन गया। –

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