<?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[asio schleife]]></title><description><![CDATA[<p>ich brauch hilfe beim erstellen einer asynchronen asio lese schreibschleife:</p>
<p>also ich hab mir das daytime 3 als server genommen.<br />
es beginnt bei der funktion start.<br />
nun soll ich es so funktionieren, dass es immer erst die komplette nachricht gelesen wird.<br />
also async read soloange im handler ausgeführt wird bis der error angibt, dass die ganze nachricht gelesen wurde.<br />
gleichzeitig soll eine nachricht gesendet werden.<br />
Und sobald der write_handler ausgeführt wird, also die nachricht gesendet wird soll es wieder von vorn anfangen. das Problem ist nur, wie komm ich vom Handler wieder zurück zu start()?<br />
ich kann sie ja nicht direkt in den handler schreiben, da dieser ja abgeschlossen werden muss.<br />
die doc ist natürlich auch wertlos und ünötig kompliziert.<br />
hat jemand eine idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300145/asio-schleife</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 22:00:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300145.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Feb 2012 14:31:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to asio schleife on Sun, 26 Feb 2012 14:31:23 GMT]]></title><description><![CDATA[<p>ich brauch hilfe beim erstellen einer asynchronen asio lese schreibschleife:</p>
<p>also ich hab mir das daytime 3 als server genommen.<br />
es beginnt bei der funktion start.<br />
nun soll ich es so funktionieren, dass es immer erst die komplette nachricht gelesen wird.<br />
also async read soloange im handler ausgeführt wird bis der error angibt, dass die ganze nachricht gelesen wurde.<br />
gleichzeitig soll eine nachricht gesendet werden.<br />
Und sobald der write_handler ausgeführt wird, also die nachricht gesendet wird soll es wieder von vorn anfangen. das Problem ist nur, wie komm ich vom Handler wieder zurück zu start()?<br />
ich kann sie ja nicht direkt in den handler schreiben, da dieser ja abgeschlossen werden muss.<br />
die doc ist natürlich auch wertlos und ünötig kompliziert.<br />
hat jemand eine idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185972</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Sun, 26 Feb 2012 14:31:23 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Mon, 27 Feb 2012 09:24:32 GMT]]></title><description><![CDATA[<p>Bei Asio nimmst du nicht wirklich eine Schleife. Du springst einfach von Handler zu Handler. Wenn du mit einem Client fertig bist, machst du einfach gar nichts mehr, dh. rufst keinen Handler mehr auf. Dank RAII wird aufgeräumt.<br />
Wenn du weiter arbeiten willst, dann rufst du eben eben im letzten Handler wird dein Start auf.</p>
<blockquote>
<p>die doc ist natürlich auch wertlos und ünötig kompliziert.</p>
</blockquote>
<p>Nicht wirklich, die Dokumentation von Asio ist echt angenehm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186110</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 27 Feb 2012 09:24:32 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Mon, 27 Feb 2012 09:44:45 GMT]]></title><description><![CDATA[<p>ok, also</p>
<p>1. du meinst asio.post, oder?</p>
<p>2.ich hab noch das problem, dass ich, wenn ich das programm ein zweites mal starte, dass ich den Port ändern muss, damit es wieder funktioniert.</p>
<p>3. angenehm? es gibt ein biliges tutorial und ein paar Beispiele ohne die geringste erklärung?<br />
oder hast etwa eine andere im sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186113</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Mon, 27 Feb 2012 09:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Mon, 27 Feb 2012 10:00:28 GMT]]></title><description><![CDATA[<blockquote>
<p>1. du meinst asio.post, oder?</p>
</blockquote>
<p>Eher so (Pseudocode):</p>
<pre><code class="language-cpp">writeHandler()
{
    reset();
    async_read(getBuffer(), bind(this, readHandler));
}

readHandler()
{
   if(hasEnoughData())
   {
       processResult();
       async_write(getResultBuffer(), bind(this, readHandler));
   }
   else
   {
       async_read(getBuffer(), bind(this, readHandler));
   }
}

acceptHandler()
{
   async_read(getBuffer(), bind(this, readHandler));
   async_accept(bind(this, acceptHandler));
}

...
async_accept(bind(shared_ptr&lt;MyClass&gt;(new MyClass), acceptHandler));
service.run();
...
</code></pre>
<blockquote>
<p>2.ich hab noch das problem, dass ich, wenn ich das programm ein zweites mal starte, dass ich den Port ändern muss, damit es wieder funktioniert.</p>
</blockquote>
<p>Ist doch Standard. Man kann nicht ohne weiteres 2 Programme an den selben Port binden. Das geht nur in Ausnahmefällen wie zb Multicast.</p>
<blockquote>
<p>3. angenehm? es gibt ein biliges tutorial und ein paar Beispiele ohne die geringste erklärung?<br />
oder hast etwa eine andere im sinn?</p>
</blockquote>
<p><a href="http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/reference.html" rel="nofollow">http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/reference.html</a></p>
<p>Die Tutorials (sind 12 und nicht 1) sind super dokumentiert und zeigen praktisch alles.</p>
<p>Die Beispiele erfordern halt ein Verständnis der Bibliothek an sich.</p>
<p>Boost.Asio ist halt keine einfache Bibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186118</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 27 Feb 2012 10:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Mon, 27 Feb 2012 11:29:49 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Nicht wirklich, die Dokumentation von Asio ist echt angenehm.</p>
</blockquote>
<p>Netter Witz...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186152</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 27 Feb 2012 11:29:49 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Tue, 28 Feb 2012 11:50:56 GMT]]></title><description><![CDATA[<p>also über kreuz?<br />
Nette Idee, hätt ich auch drauf kommen müssen, super, aber vielleicht würds mir tatsächlich gut tun noch mal die Klassenbasics zu studieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186349</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Tue, 28 Feb 2012 11:50:56 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 09:19:59 GMT]]></title><description><![CDATA[<p>dann noch ne frage, wie aknn ich rausfinden ob die Verbindung beendet wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186888</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 09:27:07 GMT]]></title><description><![CDATA[<p>alterbro schrieb:</p>
<blockquote>
<p>dann noch ne frage, wie aknn ich rausfinden ob die Verbindung beendet wurde?</p>
</blockquote>
<p>Da Du von &quot;Verbindung&quot; sprichst, nehme ich an, Du benutzt TCP.<br />
Es kommt darauf an, wie sie beendet wurde. Wenn die Gegenseite sauber geschlossen wurde, dann kommt Dein read-Handler mit einem Fehler zurück. Solche Dinge wie das Ziehen des Netzwerksteckers bekommst Du nur zuverlässig heraus, in dem Du etwas über die Verbindung sendest. Du brauchst also z.B. einen Heartbeat, das Du zyklisch sendest. Wenn dabei ein Fehler auftritt, ist die Gegenseite tot.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186894</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 09:36:47 GMT]]></title><description><![CDATA[<p>also pseudo:</p>
<pre><code class="language-cpp">while(isinbuffer(&quot;keine angst ich  bin noch da&quot;)){
lisindenbuffer();
schreibdemclient();

}q
uit();
</code></pre>
<p>oder so änhlich?<br />
hab ich mir auch schon überlegt, aber ich dachte wenn asio mir das schon abgenommenhättte, wärs bandbreitenverschwendung.</p>
<p>gut und vielleicht doch noch :<br />
kann ich das programm so schreiben, dass wenn man auf das rote kreuz klickt, noch irgendwie gesendet wird:&quot;bin dann mal weg&quot;, und das programm erst dann beendet wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186898</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 09:49:13 GMT]]></title><description><![CDATA[<p>Machs halt so: Der Client fragt regelmäßig beim Server nach, obs was Neues gibt. Der Server schmeißt alle Clients raus, die sich seit x Sekunden nicht mehr gemeldet haben.</p>
<blockquote>
<p>kann ich das programm so schreiben, dass wenn man auf das rote kreuz klickt, noch irgendwie gesendet wird:&quot;bin dann mal weg&quot;, und das programm erst dann beendet wird?</p>
</blockquote>
<p>Da musst du in deine GUI-Bibliothek sehen, was sie in Sachen Quit-Handler anbietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186908</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 09:51:10 GMT]]></title><description><![CDATA[<p>ok, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186912</guid><dc:creator><![CDATA[alterbro]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 10:55:17 GMT]]></title><description><![CDATA[<blockquote>
<p>noch irgendwie gesendet wird:&quot;bin dann mal weg&quot;, und das programm erst dann beendet wird?</p>
</blockquote>
<p>Ich weiss nicht, was du fuer vorstellungen von &quot;Beenden&quot; hasst, aber wenn beenden bei dir heisst, deinem Prozess einfahc die CPU zeit, Ressource und Speicher unterm A.... wegzuziehen, dann hasst natuerlich keine chance.</p>
<p>Aber normal wird beim Beenden noch ordnungsgemaess aufgeraeumt ... auch beim BS mit dem roten kreuz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /><br />
Das heisst zumindest wuerden destrukturen durchlaufen ...</p>
<p>Wenn du mit roten kreuz das close am Fenster meinst:<br />
Dann heisst das rote kreuz auch nicht, das deine Main sofort abgewuergt wird, sondern es beideutet das ein WM Close an ein Fenster geschickt wird.<br />
Das laesst sich abfangen, und auch wenn dein Mainfenster den Close schon bekommen hat, macht es noch andere dinge bevor es endgueltig im Nirvana verschwindet, und danach wird erst die main zuende gebracht. zigtausend möglichkeiten sich da noch einzuklinken.</p>
<p>Wenn du mit rotem kreuz das Shutdown des BS meinst:<br />
Egal ob Gui App oder Server ohne Konsole, dein BS schickt dir Signale in dem Fall, wenn das BS selber versucht dich zu beenden.<br />
Zuerst versucht es das auf die Freundliche Art, also schickt dir nen Signal, was du handeln kannst, aka du kannst aufraeumoperationen anstossen ...<br />
Wenn du da drauf ned reagierst, faehrt es haertere Geschuetze auf, und nen Boeses signal kommt, und deinem Prozess werden ressource und speicher einfach weggenommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /><br />
Wie genau das funktioniert, da musst bei den entsprechenden BS API's schauen.<br />
Da gibts auch noch andere Wege.<br />
z.b. unter windows, Dienste / Services (was das equivalent zu daemons ist), da bekommst ne eventschnittstelle, wo auf solche events auch hoeren und reagieren kanns.</p>
<p>Trotzdem solltes den fall beruecksichtigen, dass dein Server / CLient einfach mal hängt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186931</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 29 Feb 2012 10:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to asio schleife on Wed, 29 Feb 2012 12:44:19 GMT]]></title><description><![CDATA[<p>Oder bei SDL: Auf das SDL_Quit event reagieren, sonst beendet sich dein Program beim Klick auf das Kreuz gar nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186964</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 29 Feb 2012 12:44:19 GMT</pubDate></item></channel></rss>