<?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] Reihenfolge von Schreiboperationen bei boost::async_write()]]></title><description><![CDATA[<p>Moin,</p>
<p>angenommen ich mache irgendetwas in der Art:</p>
<pre><code class="language-cpp">void f(tcp::socket&amp; socket, std::string buffer_1, std::string buffer_2) {
    async_write(socket, buffer(buffer_1), ... );
    async_write(socket, buffer(buffer_2), ...);
}
</code></pre>
<p>Kann ich dann davon ausgehen, dass zuerst alles aus buffer_1 bei der<br />
Gegenseite ankommt und dann erst Inhalte von buffer_2 oder muss<br />
ich davon ausgehen, dass buffer_1[0], buffer_2[0], buffer_1[1] o.ä.<br />
auf der Gegenseite ankommen?</p>
<p>Was passiert, wenn es einen Fehler bei der Übertragung des ersten Buffers gibt?</p>
<p>Muss ich mir, um die Reihenfolge zu garantieren, eine Queue bauen und<br />
den nächsten Aufruf von async_write erst absetzen, wenn der letzte<br />
fertig ist?</p>
<p>Gruß, Panke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289616/boost-asio-reihenfolge-von-schreiboperationen-bei-boost-async_write</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 16:56:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289616.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jul 2011 14:11:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Sat, 09 Jul 2011 14:11:38 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>angenommen ich mache irgendetwas in der Art:</p>
<pre><code class="language-cpp">void f(tcp::socket&amp; socket, std::string buffer_1, std::string buffer_2) {
    async_write(socket, buffer(buffer_1), ... );
    async_write(socket, buffer(buffer_2), ...);
}
</code></pre>
<p>Kann ich dann davon ausgehen, dass zuerst alles aus buffer_1 bei der<br />
Gegenseite ankommt und dann erst Inhalte von buffer_2 oder muss<br />
ich davon ausgehen, dass buffer_1[0], buffer_2[0], buffer_1[1] o.ä.<br />
auf der Gegenseite ankommen?</p>
<p>Was passiert, wenn es einen Fehler bei der Übertragung des ersten Buffers gibt?</p>
<p>Muss ich mir, um die Reihenfolge zu garantieren, eine Queue bauen und<br />
den nächsten Aufruf von async_write erst absetzen, wenn der letzte<br />
fertig ist?</p>
<p>Gruß, Panke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090640</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Sat, 09 Jul 2011 14:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Sat, 09 Jul 2011 15:39:35 GMT]]></title><description><![CDATA[<p>Hallo Panke!</p>
<p>boost::asio::async_write setzt voraus, dass deine Buffer Götter sind bzw. lang leben, lang genug bis der completion_handler aufgerufen wird.<br />
Du hast hier aber 2 lokale Buffer:<br />
boost::asio::async_write kehrt aber sofort nach dem Funktionsaufruf zurück und wenn dann der completion_handler in den Buffer etwas reinschreiben will crashed dein Programm, wegen einer Speicherzugriffsverletzung.</p>
<p>ERGO: Du musst deinen Buffer am Heap platzieren oder du hast eine Membervariable, like:</p>
<pre><code class="language-cpp">class Connection {
    std::string mBuffer; // lebt lang genug
public:
    void send(const std::string &amp;message) {
        mBuffer = message;
        using namespace boost::asio;
        async_write(socket_, buffer(mBuffer),...);
    }
};
</code></pre>
<p>Weiters habe ich die boost::asio Doku so verstanden, dass während einer write-operation keine weitere write-operation ausgeführt werden darf.(das selbe gilt auch für eine read-operation):</p>
<blockquote>
<p>This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program <strong>must ensure that the stream performs no other write operations</strong> (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.</p>
</blockquote>
<blockquote>
<p>This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program <strong>must ensure that the stream performs no other read operations</strong> (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.</p>
</blockquote>
<p>Ja, du musst dir also eine Queue bauen, siehe das Chat-Example von boost::asio.</p>
<p>Jeder deiner completion_handler bekommt eine error Variable.</p>
<pre><code class="language-cpp">void read_handler(const boost::asio::system::error_code &amp;error) {
    if(!error) { // Kein Error, alles hat funktioniert.
        // lese den buffer aus
    } else { // UPS!
        std::cerr &lt;&lt; &quot;[read_handler()]: &quot; &lt;&lt; error.message() &lt;&lt; std::endl;
    }
}
</code></pre>
<p>boost::asio bzw. asynchrone Bibliotheken sind sehr eigen in ihrer Verwendung.<br />
Schau dir ein paar examples an, versuch das Prinzip dahinter zu verstehen, dann solltest du keine Schwierigkeiten mehr haben.</p>
<p>Ich selbst habe hier im Forum einige Threads bzgl. Boost::asio aufgemacht, such mal hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090674</guid><dc:creator><![CDATA[AmITrolling?]]></dc:creator><pubDate>Sat, 09 Jul 2011 15:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Sat, 09 Jul 2011 16:05:06 GMT]]></title><description><![CDATA[<blockquote>
<p>Weiters habe ich die boost::asio Doku so verstanden, dass während einer write-operation keine weitere write-operation ausgeführt werden darf.(das selbe gilt auch für eine read-operation):</p>
</blockquote>
<p>Dafür würde es noch die Scattered Buffer geben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2090684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090684</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 09 Jul 2011 16:05:06 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Sat, 09 Jul 2011 18:10:07 GMT]]></title><description><![CDATA[<p>AmITrolling? schrieb:</p>
<blockquote>
<p>Hallo Panke!</p>
<p>[alles über die Lebendauer von Puffern]</p>
</blockquote>
<p>Danke, das weiß ich. Da habe ich nur hier im Forum gepennt.</p>
<blockquote>
<blockquote>
<p>This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program <strong>must ensure that the stream performs no other write operations</strong> (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.</p>
</blockquote>
<blockquote>
<p>This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program <strong>must ensure that the stream performs no other read operations</strong> (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.</p>
</blockquote>
<p>Ja, du musst dir also eine Queue bauen, siehe das Chat-Example von boost::asio.</p>
</blockquote>
<p>Danke, das sind genau die Stellen in der Doku, die ich suchte <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2090723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2090723</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Sat, 09 Jul 2011 18:10:07 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Wed, 20 Jul 2011 15:43:10 GMT]]></title><description><![CDATA[<p>Wie ist das denn, wenn ich die Memberfunktionen des UDP-Sockets benutze?</p>
<p>Also async_receive_from<br />
und async_send_to</p>
<p>Ich arbeite an einem Spiel und muss mit mehreren Clients kommunizieren können.</p>
<p>Kann ich da mit async_send_to gleichzeitig zu mehreren Empfängern senden, oder muss ich warten, bis der erste Sendvorgang fertig ist, bevor ich den zweiten starte (was sehr schlecht wäre).</p>
<p>Und bei async_receive_from habe ich mir überlegt, dass ungefähr so zu machen:</p>
<pre><code class="language-cpp">void NetworkServer::onReadFinished(const boost::system::error_code&amp; error,
    std::size_t bytesTransferred)
{
   //mache was mit den empfangen daten...

   //starte den nächsten empfang-Vorgang
   mySocket.async_receive_from(buffer(myReadBuffer), myRemoteEndpointStorage, 0, boost::bind(&amp;NetworkServerImpl::onReadFinished,
		this, boost::asio::placeholders::error,
		boost::asio::placeholders::bytes_transferred));
}

void NetworkServer::update()
{
   while(myIoService.poll() &gt; 0) ;
}
</code></pre>
<p>In der Hoffnung, dass dann der completion handler (onReadFinished) mehrfach ausgerufen wird, weil mehrere Nachrichten sofort empfangen werden können, weil sie eigentlich schon da sind und in irgendwelchen Buffern von boost oder dem OS warten...</p>
<p>Was meint ihr, geht das so? Oder geht das vll noch besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2095479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2095479</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Wed, 20 Jul 2011 15:43:10 GMT</pubDate></item><item><title><![CDATA[Reply to [boost::asio] Reihenfolge von Schreiboperationen bei boost::async_write() on Thu, 21 Jul 2011 13:03:01 GMT]]></title><description><![CDATA[<blockquote>
<p>In der Hoffnung, dass dann der completion handler (onReadFinished) mehrfach ausgerufen wird, weil mehrere Nachrichten sofort empfangen werden können, weil sie eigentlich schon da sind und in irgendwelchen Buffern von boost oder dem OS warten...</p>
</blockquote>
<p>Das solle gehen, ja. Auch das gleichzeitige senden sollte funktionieren, jedenfalls finde ich nichts Gegenteiliges in der Doku.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096077</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Thu, 21 Jul 2011 13:03:01 GMT</pubDate></item></channel></rss>