<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Boost::Asio - async_read!?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe einen Clienten der ein Datenpaket zum Server schickt. Jedes Datenpaket besteht aus ID + Data. So, ich <em>receive</em> die ID (<em>int</em>) mit <em>async_read</em>. Das klappt auch wunderbar. Nun möchte ich allerdings den <em>Data</em>-Anhang receiven. Hier die Funktion:</p>
<p>(Nicht erschrecken, ich habe die Funktion jetzt schon öfters aus Testzwecken umgebastelt)</p>
<pre><code class="language-cpp">template &lt;typename PackageType&gt;
			void ReceivePackageData(const PackageType &amp;Data, const unsigned int &amp;ID)
			{
				std::vector&lt;PackageType, std::allocator&lt;PackageType&gt;&gt; DataBuffer(sizeof(PackageType));

				boost::asio::async_read(m_Socket, 
										boost::asio::buffer(DataBuffer),
										boost::asio::transfer_all(),
										boost::bind(&amp;Network::AsyncTCPServer::HandleRead,
													this,
													boost::asio::placeholders::error,
													boost::asio::placeholders::bytes_transferred,
													ID));

			}
</code></pre>
<p>Die Datenpakete sind bei mir einfache Strukturen. Zuerst wollte ich direkt über einen Zeiger auf die Struktur den Inhalt, der auf dem Socket liegt, in die Instanz einlesen (<a href="http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer/overload6.html" rel="nofollow">http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer/overload6.html</a>). Den <em>const_buffer</em> mochte er allerdings nicht, er wollte also einen <em>mutable_buffer</em>. Also gut dachte ich mir, knallste ihm halt alles in einem Vector da hin. Aber NEIN, Fehlanzeige. Ich habe jetzt testweise einfach mal einen <em>std::vector<a href="std::string" rel="nofollow">std::string</a> buf(25);</em> versucht zu übergeben, weil das Datenpaket aus genau dem selben Datentypen besteht, aber wieder Fail.</p>
<p>Egal was ich mir vo dem Socket holen will, jedesmal schmeisst er mir die Exception:<br />
<em>Unhandled exception at 0x77a6f217 in Test.exe: 0xC0000005: Access violation reading location 0x00239307.</em></p>
<p>Manchmal springt er auch zu irgendeiner <em>Destructor</em>-Funktion aus der Datei &quot;xmemory&quot;.</p>
<p>Ich hoffe mir kann einer helfen, weil langsam raffe ich gar nichts mehr... !?!?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271573/boost-asio-async_read</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 11:20:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271573.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Jul 2010 23:30:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Fri, 30 Jul 2010 23:30:53 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe einen Clienten der ein Datenpaket zum Server schickt. Jedes Datenpaket besteht aus ID + Data. So, ich <em>receive</em> die ID (<em>int</em>) mit <em>async_read</em>. Das klappt auch wunderbar. Nun möchte ich allerdings den <em>Data</em>-Anhang receiven. Hier die Funktion:</p>
<p>(Nicht erschrecken, ich habe die Funktion jetzt schon öfters aus Testzwecken umgebastelt)</p>
<pre><code class="language-cpp">template &lt;typename PackageType&gt;
			void ReceivePackageData(const PackageType &amp;Data, const unsigned int &amp;ID)
			{
				std::vector&lt;PackageType, std::allocator&lt;PackageType&gt;&gt; DataBuffer(sizeof(PackageType));

				boost::asio::async_read(m_Socket, 
										boost::asio::buffer(DataBuffer),
										boost::asio::transfer_all(),
										boost::bind(&amp;Network::AsyncTCPServer::HandleRead,
													this,
													boost::asio::placeholders::error,
													boost::asio::placeholders::bytes_transferred,
													ID));

			}
</code></pre>
<p>Die Datenpakete sind bei mir einfache Strukturen. Zuerst wollte ich direkt über einen Zeiger auf die Struktur den Inhalt, der auf dem Socket liegt, in die Instanz einlesen (<a href="http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer/overload6.html" rel="nofollow">http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer/overload6.html</a>). Den <em>const_buffer</em> mochte er allerdings nicht, er wollte also einen <em>mutable_buffer</em>. Also gut dachte ich mir, knallste ihm halt alles in einem Vector da hin. Aber NEIN, Fehlanzeige. Ich habe jetzt testweise einfach mal einen <em>std::vector<a href="std::string" rel="nofollow">std::string</a> buf(25);</em> versucht zu übergeben, weil das Datenpaket aus genau dem selben Datentypen besteht, aber wieder Fail.</p>
<p>Egal was ich mir vo dem Socket holen will, jedesmal schmeisst er mir die Exception:<br />
<em>Unhandled exception at 0x77a6f217 in Test.exe: 0xC0000005: Access violation reading location 0x00239307.</em></p>
<p>Manchmal springt er auch zu irgendeiner <em>Destructor</em>-Funktion aus der Datei &quot;xmemory&quot;.</p>
<p>Ich hoffe mir kann einer helfen, weil langsam raffe ich gar nichts mehr... !?!?</p>
<p>Danke im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934272</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Fri, 30 Jul 2010 23:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sat, 31 Jul 2010 10:03:12 GMT]]></title><description><![CDATA[<p>Lies mal die Doku und fummel nicht nur rum. Dein Empfangspuffer existiert zum Empfangszeitpunkt gar nicht mehr. Außerdem steht in der Doku auch, wie Empfangspuffer aussehen müssen. Ein Vektor aus std::string geht auf jeden Fall nicht.<br />
Von so einem Quark wie sizeof(string) mal ganz abgesehen. Asio ist recht komplex in der Benutzung. Die C++ Grundlagen sollte man auf jeden Fall beherrschen. Grundlagen in Socketprogrammierung sind auch nötig. Beides fehlt Dir noch, wie man sieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934326</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 31 Jul 2010 10:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sat, 31 Jul 2010 10:50:32 GMT]]></title><description><![CDATA[<p>Als ich deinen Namen gelesen habe erst: &quot;YEEEEHAAAA&quot;, dann: &quot;hä o0&quot; und dann &quot;AHHH&quot;. Aber irgendwie verstehe ich immer noch nicht was da nicht stimmen soll...</p>
<p>Übergebe ich einen <em>int</em>, wird der problemlos empfangen, jedoch meine Struktur nicht, obwohl ich von <em>boost::enable_shared_from_this&lt;AsyncTCPServer&gt;</em> erbe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934339</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Sat, 31 Jul 2010 10:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sat, 31 Jul 2010 11:00:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Dein Empfangspuffer existiert zum Empfangszeitpunkt gar nicht mehr.</p>
</blockquote>
<p>Das heißt nicht umsonst &quot;asio&quot;. Der Aufruf wird sofort terminieren. Dadurch läufst du sofort aus der Funktion &quot;ReceivePackageData&quot; raus - und dein DataBuffer exisitert nicht mehr, sobald die Antwort eintrifft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934342</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 31 Jul 2010 11:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sat, 31 Jul 2010 11:01:45 GMT]]></title><description><![CDATA[<p>Ein Empfangspuffer muss eine zusammenhängende Sequenz sein. Also z.B. ein std::vector&lt;char&gt;. Komplexe Objekte die intern selbst dynamischen Speicher anfordern sind keine zusammenhängende Sequenzen! Also z.B. ein std::vector<a href="std::string" rel="nofollow">std::string</a>. Woher soll der Socket Deiner Meinung nach wissen, wie er die empfangenen Bytes da hinein bringen soll? Raten?<br />
Alle async_* Funktionen kommen sofort zurück. Der Scope der Funktion wird verlassen und alle automatischen Variablen zerstört. Dein Empfangspuffer ist dan futsch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934343</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 31 Jul 2010 11:01:45 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sun, 01 Aug 2010 02:12:07 GMT]]></title><description><![CDATA[<p>Hallo,<br />
erstmal besten Dank für die Antworten! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Von so einem Quark wie sizeof(string) mal ganz abgesehen. Asio ist recht komplex in der Benutzung. Die C++ Grundlagen sollte man auf jeden Fall beherrschen. Grundlagen in Socketprogrammierung sind auch nötig. Beides fehlt Dir noch, wie man sieht.</p>
</blockquote>
<p>Hm, ich denke nicht das mir Grundlagenwissen in C++ fehlt. Die Funktion war zu aller erst dafür gedacht, Pakete alá Strukturen zu empfangen. Das <em>sizeof()</em> ist hier schon richtig gedacht, da alle Pakete konstante Datentypen besitzen. Von der Socketprogrammierung selber habe ich keine Ahnung, richtig. Ist auch meine erste richtige Implementation auf diesem Gebiet.</p>
<p>@last post<br />
Ok, alles nachvollziehbar. Ich habe da was von Serialization gelesen, ist es möglich damit Ähnliches zu realisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934602</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Sun, 01 Aug 2010 02:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to Boost::Asio - async_read!? on Sun, 01 Aug 2010 04:59:58 GMT]]></title><description><![CDATA[<p>Kóyaánasqatsi schrieb:</p>
<blockquote>
<p>Ok, alles nachvollziehbar. Ich habe da was von Serialization gelesen, ist es möglich damit Ähnliches zu realisieren?</p>
</blockquote>
<p>Ja</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934609</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 01 Aug 2010 04:59:58 GMT</pubDate></item></channel></rss>