<?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 listen-mode unterbrechen]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>In einem anderen Beitrag wurde dieses Thema schonmal diskutiert, allerdings gab es keine konkrete Lösung.</p>
<p><strong>Problembeschreibung:</strong></p>
<p>Wenn man mit der Boost ASIO einen Server Socket erstellt und ihn auf einen Port lauschen lässt:</p>
<pre><code class="language-cpp">foo::foo(const int port) :  acceptor( io_service, tcp::endpoint(tcp::v4() , port )), socket(io_service)
{
	error_code=0;
	try
	{
		std::cout &lt;&lt; &quot;Socket erstellt! =&gt; Warten auf Verbindung\n&quot;;

		acceptor.accept(socket);

		std::cout &lt;&lt; &quot;Verbindung an Port &lt;&quot; &lt;&lt; port &lt;&lt; &quot;&gt; hergestellt!\n&quot;;

	}
	catch (std::exception&amp; e)
	{
		error_code = 1;
		//std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
	}
}
</code></pre>
<p>dann kann man diesesn Vorgang nicht fehlerfrei mit herkömlichen Methoden unterbrechen.</p>
<p>=&gt; Der Versuch den listen-mode mit</p>
<pre><code class="language-cpp">acceptor.close();
</code></pre>
<p>zu beenden führt sporadisch zu Laufzeitfehlern!</p>
<p>Meine Frage ist also, wie man diesen Modus fehlerfrei verlassen kann.</p>
<p>hustbaer hat in einem älteren Beitrag bereits Lösungsvorschläge gebracht:</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Achherrjeh, das ist Boost.ASIO.<br />
Nein, die ASIO ist da etwas doof, deren Funktionen darf man nicht multithreaded aufrufen. Dummerweise ist aber der einfachste Weg sein Programm (sauber) zu beenden der, einfach alle Sockets zu schliessen.</p>
<p>Mit &quot;rohen&quot; Sockets ist das auch kein Problem, bzw. auch nicht mit Socket-Klassen deren &quot;close&quot; Funktion man jederzeit aufrufen darf.</p>
<p>Willkommen in der &quot;doch-nicht-so-einfachen&quot; Welt von ASIO.</p>
<p>Dummerweise hab ich aber keine einfache Lösung für dein Problem.</p>
<p>Was du machen könntest, wäre<br />
a) die asynchronen Funktionen der ASIO verwenden und<br />
b) alle deine Completion-Funktoren mittels eines &quot;Strands&quot; synchronisieren und<br />
c) das &quot;close&quot; auf den Socket in einem Funktor durchführen, den du über &quot;dispatch&quot; auf dem gleichen &quot;Strand&quot; ausführst, der auch für das &quot;async_accept&quot; zuständig ist</p>
<p>Und ja, ich weiss, aber ich sagte ja ich habe keine einfache Lösung <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="🙂"
    /></p>
</blockquote>
<p>Leider kann ich damit nicht wirklich viel anfangen, da ich wohl so tief noch nicht in der Materie drin stecke.</p>
<p>Evtl. ist ja jemand schonmal auf das gleiche Problem gestoßen und hat eine kleine &quot;Musterlösung&quot; für das Problem oder Vorschläge wie man das Problem lösen könnte.</p>
<p>Ich bin für jede Hilfe dankbar! <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="🙂"
    /></p>
<p>Gruß<br />
WAR][FIRE</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246969/boost-asio-listen-mode-unterbrechen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 13:13:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246969.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2009 12:40:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 12:42:55 GMT]]></title><description><![CDATA[<p>Hallo Leute!</p>
<p>In einem anderen Beitrag wurde dieses Thema schonmal diskutiert, allerdings gab es keine konkrete Lösung.</p>
<p><strong>Problembeschreibung:</strong></p>
<p>Wenn man mit der Boost ASIO einen Server Socket erstellt und ihn auf einen Port lauschen lässt:</p>
<pre><code class="language-cpp">foo::foo(const int port) :  acceptor( io_service, tcp::endpoint(tcp::v4() , port )), socket(io_service)
{
	error_code=0;
	try
	{
		std::cout &lt;&lt; &quot;Socket erstellt! =&gt; Warten auf Verbindung\n&quot;;

		acceptor.accept(socket);

		std::cout &lt;&lt; &quot;Verbindung an Port &lt;&quot; &lt;&lt; port &lt;&lt; &quot;&gt; hergestellt!\n&quot;;

	}
	catch (std::exception&amp; e)
	{
		error_code = 1;
		//std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
	}
}
</code></pre>
<p>dann kann man diesesn Vorgang nicht fehlerfrei mit herkömlichen Methoden unterbrechen.</p>
<p>=&gt; Der Versuch den listen-mode mit</p>
<pre><code class="language-cpp">acceptor.close();
</code></pre>
<p>zu beenden führt sporadisch zu Laufzeitfehlern!</p>
<p>Meine Frage ist also, wie man diesen Modus fehlerfrei verlassen kann.</p>
<p>hustbaer hat in einem älteren Beitrag bereits Lösungsvorschläge gebracht:</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Achherrjeh, das ist Boost.ASIO.<br />
Nein, die ASIO ist da etwas doof, deren Funktionen darf man nicht multithreaded aufrufen. Dummerweise ist aber der einfachste Weg sein Programm (sauber) zu beenden der, einfach alle Sockets zu schliessen.</p>
<p>Mit &quot;rohen&quot; Sockets ist das auch kein Problem, bzw. auch nicht mit Socket-Klassen deren &quot;close&quot; Funktion man jederzeit aufrufen darf.</p>
<p>Willkommen in der &quot;doch-nicht-so-einfachen&quot; Welt von ASIO.</p>
<p>Dummerweise hab ich aber keine einfache Lösung für dein Problem.</p>
<p>Was du machen könntest, wäre<br />
a) die asynchronen Funktionen der ASIO verwenden und<br />
b) alle deine Completion-Funktoren mittels eines &quot;Strands&quot; synchronisieren und<br />
c) das &quot;close&quot; auf den Socket in einem Funktor durchführen, den du über &quot;dispatch&quot; auf dem gleichen &quot;Strand&quot; ausführst, der auch für das &quot;async_accept&quot; zuständig ist</p>
<p>Und ja, ich weiss, aber ich sagte ja ich habe keine einfache Lösung <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="🙂"
    /></p>
</blockquote>
<p>Leider kann ich damit nicht wirklich viel anfangen, da ich wohl so tief noch nicht in der Materie drin stecke.</p>
<p>Evtl. ist ja jemand schonmal auf das gleiche Problem gestoßen und hat eine kleine &quot;Musterlösung&quot; für das Problem oder Vorschläge wie man das Problem lösen könnte.</p>
<p>Ich bin für jede Hilfe dankbar! <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="🙂"
    /></p>
<p>Gruß<br />
WAR][FIRE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755059</guid><dc:creator><![CDATA[WAR**FIRE]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 15:39:56 GMT]]></title><description><![CDATA[<p>Wie ich es damals im Thread gesagt hatte und hustbaer es in der Liste aufgeführt hat, mach die Sache asynchron, dann geht es. Hier ein sehr kurzes Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/date_time/posix_time/posix_time.hpp&gt;

void acceptHandler(boost::system::error_code const&amp; /*error*/)
{
    // whatever
}

int main()
{
    typedef boost::asio::ip::tcp::socket Socket;
    typedef boost::asio::ip::tcp::acceptor Acceptor;

    unsigned short const PORT = 1234;

    boost::asio::io_service service;
    Acceptor::endpoint_type endpoint(Acceptor::protocol_type::v4(), PORT);
    Acceptor acceptor(service, endpoint);

    Socket peer(acceptor.io_service());
    acceptor.async_accept(peer, &amp;acceptHandler);

    boost::thread t1(boost::bind(&amp;boost::asio::io_service::run, &amp;service));

    boost::this_thread::sleep(boost::posix_time::seconds(5));

    service.post(boost::bind(&amp;Acceptor::close, &amp;acceptor));

    t1.join();

    return 0;
}
</code></pre>
<p>Ich möchte darauf hinweisen, dass man mit einer neueren Boost Version zum Beispiel <code>boost::thread</code> einfacher starten kann. Ich arbeite hier noch mit einer bisschen älteren Version. Auch habe ich den Code ziemlich schnell hingeschrieben, da es nur mein Ziel ist, die Idee zu vermitteln.<br />
Ganz wichtig ist der <code>service.post(...)</code> Aufruf. Der <code>acceptor</code> ist nicht Thread sicher, also muss es der gleiche Thread sein, welcher die <code>close</code> Funktion aufruft, wie derjenige welcher auf ankommende Verbindungen wartet. Dies wird mit dieser Funktion garantiert, da sie den Funktionsaufruf auch asynchron macht und intern in eine Art von Nachrichtenschleife setzt.</p>
<p>Der Thread <code>t1</code> wird übrigens beendet, wenn alle asynchronen Funktionsaufrufe, bzw. man auch könnte sagen alle Nachrichten, abgearbeitet wurden.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755190</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 04 Aug 2009 15:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 17:13:37 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>:<br />
So wie du das machst, geht es sehr schön, solange man nur einen einzigen &quot;run&quot; Thread (pro io_service) hat. (In deinem Beispiel OK, da du ja nur einen startest)</p>
<p>Hat man mehrere Threads, muss man eben &quot;Strands&quot; verwenden.</p>
<p>Wollte ich nur nochmal dazuschreiben, weil es IMO nicht ganz offensichtlich ist, und zu dummen Fehlern führen kann, wenn man es falsch macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755225</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Aug 2009 17:13:37 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 17:16:41 GMT]]></title><description><![CDATA[<p>mein gott ist das kompliziert da progg ich lieber winsock</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755228</guid><dc:creator><![CDATA[strandbar]]></dc:creator><pubDate>Tue, 04 Aug 2009 17:16:41 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 17:47:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Das finde ich auch nicht so schön.<br />
Da doch auch das Beenden eines Prozesses immer dazugehört.</p>
<p>Vielleicht dazu eine kleine andere Frage.<br />
Lohnt sich ASIO vielleicht nur für kleinere Projekte?<br />
Wobei ich klein jetzt nicht näher definieren möchte.</p>
<p>Viele Grüße<br />
Thomy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755250</guid><dc:creator><![CDATA[Thomy]]></dc:creator><pubDate>Tue, 04 Aug 2009 17:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Tue, 04 Aug 2009 22:50:43 GMT]]></title><description><![CDATA[<p>ASIO ist nicht an sich schlecht.<br />
ASIO ist IMO auch nicht nur für kleine Projekte geeignet.</p>
<p>ASIO ist einfach nur unter bestimmten Bedingungen etwas umständlich zu verwenden. Und oft sind die Möglichkeiten wie man etwas einfach und korrekt mit ASIO machen kann, nicht ganz offensichtlich. Auf Grund der Lernkurve die sich dadurch ergibt, denke ich sogar, dass ASIO für kleine Projekte eher schlechter geegnet ist, als für grosse Projekte.</p>
<p>BTW: wenns nur um das Beenden des ganzen Programms geht, gibt's noch einen halbwegs einfachen Weg: <code>io_service::stop()</code> .</p>
<p>Das führt dazu dass <code>io_service::run()</code> in allen Threads zurückkommt.</p>
<p>Wenn du danach das io_service Objekt zerstörst, sorgt der Dtor von <code>io_service</code> dafür, dass auch alle &quot;ausständigen&quot; Handler zerstört werden.<br />
(Sie werden aber NICHT &quot;aufgerufen&quot;, sondern nur regulär &quot;zerstört&quot;. D.h. der Dtor läuft, der <code>operator ()</code> aber nicht!)</p>
<p>Und das Zerstören der Handler wiederum kannst du verwenden, um &quot;sauberzumachen&quot; (Log Eintrag schreiben, Socket kontrolliert zumachen, Resourcen freigeben etc.).</p>
<p>Ein Pattern das nicht ganz unüblich ist, ist die Sessions nur implizit am Leben zu halten, indem man <code>boost::shared_ptr</code> in die Handler mit reinbindet ( <code>boost::bind(&amp;Session::HandlerFunction, sharedPtrToSession, ...)</code> ).<br />
Dadurch wird ein Session Objekt automatisch zerstört, sobald es keinen &quot;pending handler&quot; mehr gibt. D.h. wenn man <code>io_service::stop()</code> verwendet, und danach das <code>io_service</code> Objekt zerstört, werden dabei auch alle Sessions zerstört.</p>
<p>p.S.:</p>
<p>Ich habe im Code auch ein paar Stellen entdeckt, wo es passieren kann, dass Handler nicht aufgerufen werden, sondern nur zerstört. Ich weiss leider nichtmehr welche Funktionen das waren, aber es gibt Fälle wo es vorkommen kann.<br />
Konkret wurde <code>io_service::post</code> verwendet, um den Handler &quot;zu posten&quot;. Wenn nun in <code>io_service::post</code> z.B. ein <code>std::bad_alloc</code> fliegt ( <code>io_service::post</code> muss u.U. Speicher anfordern, d.h. das kann passieren), wird der Handler nie aufgerufen.</p>
<p>Dass er zerstört wird sollte dagegen immer sichergestellt sein. (Ich hab da zwar auch nen Bug gefunden, wo Handler nicht freigegeben wurden, aber den hat der Chris Kohlhoff sofort gefixt nachdem ich ihn gemeldet habe, ist in 1.39.0 also behoben. Wie viele andere solche Bugs es noch gibt kann ich natürlich nicht sagen :D).</p>
<p>Worauf ich damit hinaus will ist einfach...<br />
Programme die die ASIO verwenden, sollten darauf ausgelegt sein, mit Fällen klarzukommen, wo ein Handler nie ausgeführt wird, sondern nur zerstört. Da der Zustand des Streams in dem Fall dann unbekannt ist, sollte man diese Fälle behandeln, in dem man die Session abbricht.</p>
<p>Und wenn man das macht, kann man auch <code>io_service::stop()</code> wie beschrieben verwenden, wenn man alle Connections schliessen will, um das Programm zu beenden.</p>
<p>p.p.S.: Sorry dass das schon wieder so lange geworden ist <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="🙂"
    /> Mich kurz fassen ist <em>nicht</em> eine meiner Stärker <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755432</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Aug 2009 22:50:43 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 06:27:17 GMT]]></title><description><![CDATA[<p>Danke, im Gegenteil ausführich war lecker. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Das Thema &quot;Lernerei&quot; stimmt auf jeden Fall, nur wenn man davon mal absieht,<br />
kann man mit ASIO ja eigentlich ganz fix und direkt mit einem &quot;Anfangsdesign&quot; ein neues Programm entwerfen.<br />
Ich finde mich durch ASIO halt nur durch solche Eigenheiten ein wenig eingeschränkt,<br />
was ich mit einem simplen Socket-Wrapper, der natürlich nicht dieses gewisse &quot;Anfangsdesign&quot; bietet, nicht bin.</p>
<p>Für einen kleinen Shell-Befehl, der sich connected, und vorausgesetzt, man kennt sich mit ASIO aus,<br />
würde ich ASIO empfehlen. (Notfalls killen <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="😃"
    /> )<br />
Aber bei einem aufwendigen Server-Prozess, der vllt. zwischendurch Clients, die in der Listen-Schlange stehen,<br />
rauswirft, nur damit ein anderer Listen-Port geschlossen werden kann, finde ich nicht so elegant.</p>
<p>Okay, lassen wir es vielleicht hierbei.<br />
Wenn ich gefragt werde, ob ich ASIO empfehlen kann, sage ich: &quot;Hää? ASIO?&quot;</p>
<p>Viele Grüße und Danke<br />
Thomy</p>
<p>PS: &quot;Anfangsdesign&quot;?? -Mir ist nichts besseres eingefallen. Man wird halt durch das ASIO-Konzept geführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755482</guid><dc:creator><![CDATA[Thomy]]></dc:creator><pubDate>Wed, 05 Aug 2009 06:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 06:52:22 GMT]]></title><description><![CDATA[<p>hustbaer: du scheinst da ja richtig den Durchblick zu haben - lässt du uns teilhaben in Form eines Magazinartikels? <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="🙂"
    /> Sowas fehlt noch... Die Tutorials auf der offiziellen Seite find ich etwas mau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755486</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 05 Aug 2009 06:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 06:56:11 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>hustbaer: du scheinst da ja richtig den Durchblick zu haben - lässt du uns teilhaben in Form eines Magazinartikels? <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="🙂"
    /> Sowas fehlt noch... Die Tutorials auf der offiziellen Seite find ich etwas mau.</p>
</blockquote>
<p>Ja, das wäre grandios. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Kennt eigentlich jemand das <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2054.pdf" rel="nofollow">&quot;Proposal to add a networking library to standard library for TR2&quot;</a>? Das ist ja quasi ASIO und es werden ein paar Dinge etwas besser beschrieben, als in der ASIO Doku.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755487</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 05 Aug 2009 06:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 20:53:00 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>hustbaer: du scheinst da ja richtig den Durchblick zu haben - lässt du uns teilhaben in Form eines Magazinartikels? <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="🙂"
    /> Sowas fehlt noch... Die Tutorials auf der offiziellen Seite find ich etwas mau.</p>
</blockquote>
<p>Jain.</p>
<p>Ich hab' angefangen einen &quot;XML-Schnippel-Hin-Und-Her-Schicker&quot; (aka. &quot;Application-Server&quot;) mit der ASIO zu programmieren, und bin dabei über einige Dinge gestolpert, die ich mir dann etwas genauer angesehen habe. Dort bin ich auch über das Handler-Leak in der OpenSSL Anbindung gestolpert. Den vollen 100%igen Durchblick hab ich aber auch noch nicht.</p>
<p>Wenn ich da nen Artikel schreiben soll, wäre es aber auf jeden Fall hilfreich, ein paar Fragen/Vorschläge zum Inhalt zu bekommen. Was jetzt aber nicht heisst dass ich das in nächster Zeit machen werde, das muss ich mir noch überlegen. Hab so schon immer zu wenig Zeit <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755999</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Aug 2009 20:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 21:08:31 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Kennt eigentlich jemand das <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2054.pdf" rel="nofollow">&quot;Proposal to add a networking library to standard library for TR2&quot;</a>? Das ist ja quasi ASIO und es werden ein paar Dinge etwas besser beschrieben, als in der ASIO Doku.</p>
</blockquote>
<p>Kannte ich noch nicht. Dass es sich dabei im grossen und ganzen um die ASIO handelt, ist aber nicht weiter verwunderlich, wenn man sieht, dass es von Chris Kohlhoff geschrieben wurde <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="🙂"
    /></p>
<p>BTW: <a href="http://www.think-async.com/" rel="nofollow">http://www.think-async.com/</a> und <a href="http://blog.think-async.com/" rel="nofollow">http://blog.think-async.com/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756003</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 05 Aug 2009 21:08:31 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 05 Aug 2009 21:27:03 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Jain.</p>
<p>Ich hab' angefangen einen &quot;XML-Schnippel-Hin-Und-Her-Schicker&quot; (aka. &quot;Application-Server&quot;) mit der ASIO zu programmieren, und bin dabei über einige Dinge gestolpert, die ich mir dann etwas genauer angesehen habe. Dort bin ich auch über das Handler-Leak in der OpenSSL Anbindung gestolpert. Den vollen 100%igen Durchblick hab ich aber auch noch nicht.</p>
</blockquote>
<p>Das die wirklich guten Leute immer so bescheiden sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß<br />
WAR][FIRE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756008</guid><dc:creator><![CDATA[WAR**FIRE]]></dc:creator><pubDate>Wed, 05 Aug 2009 21:27:03 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Sun, 09 Aug 2009 23:38:03 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wie ich es damals im Thread gesagt hatte und hustbaer es in der Liste aufgeführt hat, mach die Sache asynchron, dann geht es. Hier ein sehr kurzes Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/thread.hpp&gt;
#include &lt;boost/date_time/posix_time/posix_time.hpp&gt;

void acceptHandler(boost::system::error_code const&amp; /*error*/)
{
    // whatever
}

int main()
{
    typedef boost::asio::ip::tcp::socket Socket;
    typedef boost::asio::ip::tcp::acceptor Acceptor;

    unsigned short const PORT = 1234;

    boost::asio::io_service service;
    Acceptor::endpoint_type endpoint(Acceptor::protocol_type::v4(), PORT);
    Acceptor acceptor(service, endpoint);

    Socket peer(acceptor.io_service());
    acceptor.async_accept(peer, &amp;acceptHandler);

    boost::thread t1(boost::bind(&amp;boost::asio::io_service::run, &amp;service));

    boost::this_thread::sleep(boost::posix_time::seconds(5));

    service.post(boost::bind(&amp;Acceptor::close, &amp;acceptor));

    t1.join();

    return 0;
}
</code></pre>
<p>Ich möchte darauf hinweisen, dass man mit einer neueren Boost Version zum Beispiel <code>boost::thread</code> einfacher starten kann. Ich arbeite hier noch mit einer bisschen älteren Version. Auch habe ich den Code ziemlich schnell hingeschrieben, da es nur mein Ziel ist, die Idee zu vermitteln.<br />
Ganz wichtig ist der <code>service.post(...)</code> Aufruf. Der <code>acceptor</code> ist nicht Thread sicher, also muss es der gleiche Thread sein, welcher die <code>close</code> Funktion aufruft, wie derjenige welcher auf ankommende Verbindungen wartet. Dies wird mit dieser Funktion garantiert, da sie den Funktionsaufruf auch asynchron macht und intern in eine Art von Nachrichtenschleife setzt.</p>
<p>Der Thread <code>t1</code> wird übrigens beendet, wenn alle asynchronen Funktionsaufrufe, bzw. man auch könnte sagen alle Nachrichten, abgearbeitet wurden.</p>
<p>Grüssli</p>
</blockquote>
<p>Hallo Dravere!</p>
<p>Funktioniert folgende Funktion aus deinem Code:</p>
<pre><code class="language-cpp">acceptor.async_accept(peer, &amp;acceptHandler);
</code></pre>
<p>Auch in Klassen`?<br />
acceptHandler ist bei bei mir eine Methoder in der Klasse foo.</p>
<p>Beim Aufruf im Konstruktor dieser Klasse:</p>
<pre><code class="language-cpp">acceptor.async_accept(peer, &amp;foo::acceptHandler);
</code></pre>
<p>kommt folgender Fehler:</p>
<pre><code class="language-cpp">Error	3	error C2064: term does not evaluate to a function taking 1 arguments	...boost_1_39_0\boost\asio\detail\bind_handler.hpp	39	Application
</code></pre>
<p>In der Datei bind_handler.hpp sitzt der Fehler dann in Zeile 39.</p>
<p>Auszug:</p>
<pre><code class="language-cpp">//
// bind_handler.hpp
// ~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
#define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP

#if defined(_MSC_VER) &amp;&amp; (_MSC_VER &gt;= 1200)
# pragma once
#endif // defined(_MSC_VER) &amp;&amp; (_MSC_VER &gt;= 1200)

#include &lt;boost/asio/detail/push_options.hpp&gt;

#include &lt;boost/asio/detail/handler_alloc_helpers.hpp&gt;
#include &lt;boost/asio/detail/handler_invoke_helpers.hpp&gt;

namespace boost {
namespace asio {
namespace detail {

template &lt;typename Handler, typename Arg1&gt;
class binder1
{
public:
  binder1(const Handler&amp; handler, const Arg1&amp; arg1)
    : handler_(handler),
      arg1_(arg1)
  {
  }

  void operator()()
  {
    handler_(arg1_);                      //Zeile 39. Hier sitzt der Fehler von oben.
  }

  void operator()() const
  {
    handler_(arg1_);
  }

//private:
  Handler handler_;
  Arg1 arg1_;
};
</code></pre>
<p>Ich finde leider keine Lösung für das Problem. Evtl. lässt sich das ja leicht erklären <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="🙂"
    /></p>
<p>Gruß<br />
WAR][FIRE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758072</guid><dc:creator><![CDATA[WAR**FIRE]]></dc:creator><pubDate>Sun, 09 Aug 2009 23:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Mon, 10 Aug 2009 12:38:57 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html</a></p>
<p>Am besten löst du es über Boost.Bind:</p>
<pre><code class="language-cpp">struct Foo
{
  void acceptHandler(boost::system::error_code const&amp; /*error*/)
  {
  }
};

// ...

Foo foo;
acceptor.async_accept(peer, boost::bind(&amp;Foo::acceptHandler, &amp;foo, _1));
</code></pre>
<p>Man kann so ein Bind auch innerhalb der Klasse machen und dann <code>this</code> nehmen. Kannst du übrigens auch in allen Tutorials und Beispielen von Asio finden.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758255</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 10 Aug 2009 12:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO listen-mode unterbrechen on Wed, 12 Aug 2009 16:31:44 GMT]]></title><description><![CDATA[<p>Danke Dravere!</p>
<p>Jetzt funktioniert bei mir alles einwandfrei! <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="🙂"
    /></p>
<p>Gruß<br />
WAR][FIRE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1759634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1759634</guid><dc:creator><![CDATA[WAR**FIRE]]></dc:creator><pubDate>Wed, 12 Aug 2009 16:31:44 GMT</pubDate></item></channel></rss>