<?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 Bibliothek]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>ich arbeite momentan an einem recht simpel gehaltenen Chat Programm und möchte dafür <a href="http://asio.sourceforge.net" rel="nofollow">asio</a> verwenden.</p>
<p>Das &quot;Protokoll&quot; soll recht einfach aufgebaut sein:</p>
<p>&quot;Name\nNachricht\n\n&quot;</p>
<p>Der Name des Absenders wird angegeben, gefolgt von \n (zum Trennen von Name und Nachricht), gefolgt von der Nachricht, die durch \n\n abgeschlossen wird (Ende der Übertragung).</p>
<p>Die &quot;Sicherheit&quot; des Protokolls darf vernachlässigt werden <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>Momentan verwirrt mich allerdings noch der Aufbau der Bibliothek.</p>
<p>Das Programm ist ein GUI und stellt ein Eingabefeld bereit, in dem der abgeschickte und empfangene Text angezeigt werden soll.</p>
<p>Momentan ist es mir allerdings ein Rätsel, wie genau ich 1.<br />
die Daten so empfangen kann, dass alles bis zu einschließlich dem Ende durch \n\n eingelesen wird (momentane Grenze 2048) und 2.<br />
nach der &quot;Dekodierung der empfangenen Daten&quot; (Also &quot;Name\nNachricht\n\n&quot; in eine Klasse verpackt) diese Daten an meine GUI gesendet werden.</p>
<p>Momentan wird bei Verbindungsherstellung folgendes ausgeführt</p>
<pre><code class="language-cpp">void TTMConnection::handle_connection(const asio::error&amp; error,
									  asio::ip::tcp::resolver::iterator endpoint_iterator)
{
	if (!error)
	{
		char tmp[2048];
		asio::async_read(socket_, asio::buffer(tmp),
			boost::bind(&amp;TTMClient::update, g_ttm_client, tmp));
	}
	else if (endpoint_iterator != asio::ip::tcp::resolver::iterator())
	{
		socket_.close();
		asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
		socket_.async_connect(endpoint,
			boost::bind(&amp;TTMConnection::handle_connection, this,
			asio::placeholders::error, ++endpoint_iterator));
	}
}
</code></pre>
<p>TTMClient ist die Schnittstelle für die GUI, über die alles verarbeitet wird. Es IST allerdings nicht die GUI. Die GUI greift nur auf ein TTMClient Objekt zu und verarbeitet darüber bereitgestellte Daten.<br />
TTMConnection ist für die Übertragungs zuständig, hat also Zugriff auf das (?) Socket.</p>
<p>Mich stört die Trennung von Logik (Empfangen der Daten) und GUI (Verarbeitung der Daten). Würde ich alles in eine Klasse schreiben, liefe das ganze wunderbar, aber das will ich nicht.</p>
<p>Nochmal kurz:</p>
<pre><code>1) Client wartet auf Nachricht
2) Client liest Nachricht (so viel wie möglich, eben bis zu den \n\n)
3) Client sendet Nachrichten an die GUI
4) GUI verarbeitet Daten und zeigt diese an
5) weiter bei Punkt 1
</code></pre>
<p>Hoffe mal, dass das gut verstädlich ist und mir jemand helfen kann.</p>
<p>Für Hilfe wäre ich äußerst dankbar.</p>
<p>PS.: Ich hoffe, dass das Forum die richtige Wahl war.<br />
PPS.: Ich habe mir bereits das Beispiel eines Chats von der asio Homepage angeschaut, das hilft mir aber nun auch nicht mehr weiter, da keine Trennung von Logik und GUI (Okay, Konsole) stattfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170417/asio-bibliothek</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 07:40:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170417.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Jan 2007 17:05:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to asio Bibliothek on Mon, 15 Jan 2007 17:05:20 GMT]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>ich arbeite momentan an einem recht simpel gehaltenen Chat Programm und möchte dafür <a href="http://asio.sourceforge.net" rel="nofollow">asio</a> verwenden.</p>
<p>Das &quot;Protokoll&quot; soll recht einfach aufgebaut sein:</p>
<p>&quot;Name\nNachricht\n\n&quot;</p>
<p>Der Name des Absenders wird angegeben, gefolgt von \n (zum Trennen von Name und Nachricht), gefolgt von der Nachricht, die durch \n\n abgeschlossen wird (Ende der Übertragung).</p>
<p>Die &quot;Sicherheit&quot; des Protokolls darf vernachlässigt werden <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>Momentan verwirrt mich allerdings noch der Aufbau der Bibliothek.</p>
<p>Das Programm ist ein GUI und stellt ein Eingabefeld bereit, in dem der abgeschickte und empfangene Text angezeigt werden soll.</p>
<p>Momentan ist es mir allerdings ein Rätsel, wie genau ich 1.<br />
die Daten so empfangen kann, dass alles bis zu einschließlich dem Ende durch \n\n eingelesen wird (momentane Grenze 2048) und 2.<br />
nach der &quot;Dekodierung der empfangenen Daten&quot; (Also &quot;Name\nNachricht\n\n&quot; in eine Klasse verpackt) diese Daten an meine GUI gesendet werden.</p>
<p>Momentan wird bei Verbindungsherstellung folgendes ausgeführt</p>
<pre><code class="language-cpp">void TTMConnection::handle_connection(const asio::error&amp; error,
									  asio::ip::tcp::resolver::iterator endpoint_iterator)
{
	if (!error)
	{
		char tmp[2048];
		asio::async_read(socket_, asio::buffer(tmp),
			boost::bind(&amp;TTMClient::update, g_ttm_client, tmp));
	}
	else if (endpoint_iterator != asio::ip::tcp::resolver::iterator())
	{
		socket_.close();
		asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
		socket_.async_connect(endpoint,
			boost::bind(&amp;TTMConnection::handle_connection, this,
			asio::placeholders::error, ++endpoint_iterator));
	}
}
</code></pre>
<p>TTMClient ist die Schnittstelle für die GUI, über die alles verarbeitet wird. Es IST allerdings nicht die GUI. Die GUI greift nur auf ein TTMClient Objekt zu und verarbeitet darüber bereitgestellte Daten.<br />
TTMConnection ist für die Übertragungs zuständig, hat also Zugriff auf das (?) Socket.</p>
<p>Mich stört die Trennung von Logik (Empfangen der Daten) und GUI (Verarbeitung der Daten). Würde ich alles in eine Klasse schreiben, liefe das ganze wunderbar, aber das will ich nicht.</p>
<p>Nochmal kurz:</p>
<pre><code>1) Client wartet auf Nachricht
2) Client liest Nachricht (so viel wie möglich, eben bis zu den \n\n)
3) Client sendet Nachrichten an die GUI
4) GUI verarbeitet Daten und zeigt diese an
5) weiter bei Punkt 1
</code></pre>
<p>Hoffe mal, dass das gut verstädlich ist und mir jemand helfen kann.</p>
<p>Für Hilfe wäre ich äußerst dankbar.</p>
<p>PS.: Ich hoffe, dass das Forum die richtige Wahl war.<br />
PPS.: Ich habe mir bereits das Beispiel eines Chats von der asio Homepage angeschaut, das hilft mir aber nun auch nicht mehr weiter, da keine Trennung von Logik und GUI (Okay, Konsole) stattfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210376</guid><dc:creator><![CDATA[plusman]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:05:20 GMT</pubDate></item><item><title><![CDATA[Reply to asio Bibliothek on Mon, 15 Jan 2007 17:13:33 GMT]]></title><description><![CDATA[<p>Kannst du bei Asio keinen Buffer verwenden, der auf die Größe der eingehenden Daten wächst?</p>
<p>Was genau ist dein Problem? Du beschreibst deine Anwendung sehr genau, was durchweg positiv ist. Hast allerdings vergessen dein Problem genau zu beschreiben. Da deine Vorstellung wie das ganze funktionieren soll schon sehr konkret sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210381</guid><dc:creator><![CDATA[Asio-Nicht-Kenner]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:13:33 GMT</pubDate></item><item><title><![CDATA[Reply to asio Bibliothek on Mon, 15 Jan 2007 20:13:59 GMT]]></title><description><![CDATA[<p>Ich würde sagen &quot;der&quot; Socket, nicht &quot;das&quot;.<br />
Ansonsten, wie schon wer geschrieben hat, sach ma was genau das Problem ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210463</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 15 Jan 2007 20:13:59 GMT</pubDate></item><item><title><![CDATA[Reply to asio Bibliothek on Mon, 15 Jan 2007 21:12:29 GMT]]></title><description><![CDATA[<p>Okay, dachte das Problem wäre klar geworden <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>Here we go:</p>
<p>Wie bereits geklärt, soll TTMConnection die Rohdaten empfangen und an TTMClient schicken. TTMClient soll aus den Rohdaten dann eine TTMMessage erzeugen. Die dekodierte Nachricht soll nun an das Hauptfenster geschickt werden, damit die Nachricht angezeigt werden kann.</p>
<p>Problem: Wie informiere ich das Hauptfenster, dass eine Nachricht zum Abholen bereit steht? Über TTMClient kann nun die Nachricht abgefragt werden, nur weiß das Fenster nicht, wann es das tun soll. Irgendwoher muss ja die Information kommen. Ich weiß nur nicht, wie ich das Fenster informieren soll.</p>
<p>Von TTMClient möchte ich auf das Fenster nicht direkt zugreifen, da sonst wieder die Trennung von GUI und Logik verwischen.</p>
<p>Edit:</p>
<p>Okay, ich glaube, dass ich die Lösung nun selbst gefunden habe.<br />
Die GUI wird sich über einen Ereignishandler / Callback beim Clienten anmelden und somit auf Nachrichteneingang reagieren.</p>
<p>Vielleicht gibt's ja aber noch eine andere Möglichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210481</guid><dc:creator><![CDATA[plusman]]></dc:creator><pubDate>Mon, 15 Jan 2007 21:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to asio Bibliothek on Mon, 15 Jan 2007 21:25:46 GMT]]></title><description><![CDATA[<p>Hm... ich hätte da eine Idee wie du das Problem lösen könntest. Sagt dir das &quot;Erzeuger - Verbraucher&quot; Problem etwas? Bei diesem Problem geht es darum, das ein Erzeuger permanent Daten in einen Puffer hineinschreibt bis er voll ist. Anschließend wird der Puffer von dem Verbraucher geleert. Das ganze wird mit 2 Threads gelöst und dient eigentlich dazu, Probleme beim Multithreading (Deadlocks) zu veranschaulichen und zu lösen. Denn der Erzeuger darf niemals etwas in den Puffer schreiben während der Verbraucher gerade etwas daraus liest.</p>
<p>Naja wiedemauchsei... dein TMTClient könnte z.B. die Nachricht in den Puffer schreiben. Und deine GUI liest diesen Puffer immer dann aus, wenn er nicht leer ist.</p>
<p>So könnte das ganze prinzipiell funktionieren. Zum &quot;Verbraucher - Erzeuger&quot; Problem gehört noch einiges mehr (z.B. Wechselseitiger außchluss)...</p>
<p>Google eventuell ein bisschen danach. Vieleicht hilft dir das weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210498</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Mon, 15 Jan 2007 21:25:46 GMT</pubDate></item></channel></rss>