<?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 Problem]]></title><description><![CDATA[<p>Hallo Gemeinde, ich habe ein Problem mit boost::asio. Ich möchte eine Client/Server Anwendung schreiben, diese soll eigenltich vorerst mal ganz simpel sein.</p>
<p>Client schickt ein &quot;Hello Server&quot; an den Server. Wenn der Server &quot;Hello Server&quot; empfangen hat, soll der Server &quot;Hello Client&quot; zurück schicken wenn alles geklappt hat, soll das Progamm beendet werde, ansonsten soll der Server nichts machen. Sprich er muss die übermittelten Daten Prüfen um daraud zu reagieren.</p>
<p>Main Problem ist allerdings, Das der Server &quot;Hello Server&quot; empfängt, jedoch Hello Client nicht zurück sendet. Da das ganze Asynchron läuft, habe ich vermutlich da einen Fehler, kann ihn aber nicht finde, vermutlich habe ich die Sache auch falsch angepackt. Anbei ist mein Client und der Server:</p>
<p><strong>Client:</strong></p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/array.hpp&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::socket sock(io_service);
boost::array&lt;char, 512&gt; buffer;

void read_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
  if (!ec)
  {
    std::cout &lt;&lt; std::string(buffer.data(), bytes_transferred) &lt;&lt; std::endl;
    sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

void connect_handler(const boost::system::error_code &amp;ec)
{
  if (!ec)
  {
    boost::asio::write(sock, boost::asio::buffer(&quot;Hello Server&quot;));
    sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

void resolve_handler(const boost::system::error_code &amp;ec, boost::asio::ip::tcp::resolver::iterator it)
{
  if (!ec)
  {
    sock.async_connect(*it, connect_handler);
  }
}

int main()
{
  boost::asio::ip::tcp::resolver::query query(&quot;localhost&quot;, &quot;8080&quot;);
  resolver.async_resolve(query, resolve_handler);
  io_service.run();

  return 0;
}
</code></pre>
<p><strong>Server:</strong></p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/array.hpp&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 8080);
boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);
boost::asio::ip::tcp::socket sock(io_service);
std::string data = &quot;Hello Client\n&quot;;
boost::array&lt;char, 512&gt; buffer;

void write_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
}

void read_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
	if (!ec) {
		sock.async_read_some(boost::asio::buffer(buffer), read_handler);
		std::cout &lt;&lt; std::string(buffer.data(), bytes_transferred) &lt;&lt; std::endl;
		if (std::string(buffer.data(), bytes_transferred) == &quot;Hello Server&quot;) {
			boost::asio::async_write(sock, boost::asio::buffer(data), write_handler);
		}
	}
}

void accept_handler(const boost::system::error_code &amp;ec)
{
  if (!ec)
  {
	  sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

int main()
{
  acceptor.listen();
  acceptor.async_accept(sock, accept_handler);
  io_service.run();

  return 0;
}
</code></pre>
<p>Ich bin über jede Hilfe dankbar.</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243516/boost-asio-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 22:19:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243516.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jun 2009 17:36:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::asio Problem on Wed, 17 Jun 2009 17:36:53 GMT]]></title><description><![CDATA[<p>Hallo Gemeinde, ich habe ein Problem mit boost::asio. Ich möchte eine Client/Server Anwendung schreiben, diese soll eigenltich vorerst mal ganz simpel sein.</p>
<p>Client schickt ein &quot;Hello Server&quot; an den Server. Wenn der Server &quot;Hello Server&quot; empfangen hat, soll der Server &quot;Hello Client&quot; zurück schicken wenn alles geklappt hat, soll das Progamm beendet werde, ansonsten soll der Server nichts machen. Sprich er muss die übermittelten Daten Prüfen um daraud zu reagieren.</p>
<p>Main Problem ist allerdings, Das der Server &quot;Hello Server&quot; empfängt, jedoch Hello Client nicht zurück sendet. Da das ganze Asynchron läuft, habe ich vermutlich da einen Fehler, kann ihn aber nicht finde, vermutlich habe ich die Sache auch falsch angepackt. Anbei ist mein Client und der Server:</p>
<p><strong>Client:</strong></p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/array.hpp&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::socket sock(io_service);
boost::array&lt;char, 512&gt; buffer;

void read_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
  if (!ec)
  {
    std::cout &lt;&lt; std::string(buffer.data(), bytes_transferred) &lt;&lt; std::endl;
    sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

void connect_handler(const boost::system::error_code &amp;ec)
{
  if (!ec)
  {
    boost::asio::write(sock, boost::asio::buffer(&quot;Hello Server&quot;));
    sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

void resolve_handler(const boost::system::error_code &amp;ec, boost::asio::ip::tcp::resolver::iterator it)
{
  if (!ec)
  {
    sock.async_connect(*it, connect_handler);
  }
}

int main()
{
  boost::asio::ip::tcp::resolver::query query(&quot;localhost&quot;, &quot;8080&quot;);
  resolver.async_resolve(query, resolve_handler);
  io_service.run();

  return 0;
}
</code></pre>
<p><strong>Server:</strong></p>
<pre><code class="language-cpp">#include &lt;boost/asio.hpp&gt;
#include &lt;boost/array.hpp&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 8080);
boost::asio::ip::tcp::acceptor acceptor(io_service, endpoint);
boost::asio::ip::tcp::socket sock(io_service);
std::string data = &quot;Hello Client\n&quot;;
boost::array&lt;char, 512&gt; buffer;

void write_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
}

void read_handler(const boost::system::error_code &amp;ec, std::size_t bytes_transferred)
{
	if (!ec) {
		sock.async_read_some(boost::asio::buffer(buffer), read_handler);
		std::cout &lt;&lt; std::string(buffer.data(), bytes_transferred) &lt;&lt; std::endl;
		if (std::string(buffer.data(), bytes_transferred) == &quot;Hello Server&quot;) {
			boost::asio::async_write(sock, boost::asio::buffer(data), write_handler);
		}
	}
}

void accept_handler(const boost::system::error_code &amp;ec)
{
  if (!ec)
  {
	  sock.async_read_some(boost::asio::buffer(buffer), read_handler);
  }
}

int main()
{
  acceptor.listen();
  acceptor.async_accept(sock, accept_handler);
  io_service.run();

  return 0;
}
</code></pre>
<p>Ich bin über jede Hilfe dankbar.</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728392</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Wed, 17 Jun 2009 17:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio Problem on Wed, 17 Jun 2009 17:50:27 GMT]]></title><description><![CDATA[<p>Ich bin jetzt zu faul alles genau durchzulesen, aber nur was mir auf die Schnelle aufgefallen ist:<br />
Was passiert, wenn deine Übermittlung aufgestückelt wird? Also beim Server zum Beispiel zuerst ein &quot;Hallo &quot; und danach eine &quot;Server&quot; ankommt. <code>read_handler</code> wird zweimal ausgeführt, und beide Male stimmt der String nicht überein.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728406</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Jun 2009 17:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio Problem on Wed, 17 Jun 2009 18:16:39 GMT]]></title><description><![CDATA[<p>Ich verstehe worauf du hinaus willst, aber wie vergleiche ist das richtig?</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::string(buffer.data(), bytes_transferred) &lt;&lt; std::endl;
</code></pre>
<p>Das steht immer in einer Zeile. Der read_handler ist ja so aufgebaut, das er solange ausgeführt wird, bis der buffer voll ist. Wie vergleiche ich das dann...</p>
<p>Ich habe das jetzt mal mit stringstream versucht:</p>
<pre><code class="language-cpp">stream &lt;&lt; std::string(buffer.data(), bytes_transferred);
if (stream.str() == &quot;Hello Server&quot;) {
			boost::asio::async_write(sock, boost::asio::buffer(data), write_handler);
		}
</code></pre>
<pre><code class="language-cpp">std::stringstream stream;
</code></pre>
<p>ist außerhalb definiert, so das nichts überschrieben sondern hinzugefügt wird.</p>
<p>Leider funktioniert das auch nicht. Obwohl ja irgendwann mal alles im stream landen müsste.</p>
<pre><code class="language-cpp">if (buffer.data() == &quot;Hello Server&quot;) {
			boost::asio::async_write(sock, boost::asio::buffer(data), write_handler);
		}
</code></pre>
<p>klappt auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wie kann ich das also richtig vergleichen?</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728423</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Wed, 17 Jun 2009 18:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio Problem on Thu, 18 Jun 2009 08:48:14 GMT]]></title><description><![CDATA[<p>Habe jetzt nochmal in der Doku nach gelesen, bin aber leider nicht fündig geworden, was mein Problem angeht, hat jemand von euch noch einen Einfall?</p>
<p>so long<br />
jd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728630</guid><dc:creator><![CDATA[jd]]></dc:creator><pubDate>Thu, 18 Jun 2009 08:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to boost::asio Problem on Thu, 18 Jun 2009 22:35:36 GMT]]></title><description><![CDATA[<p>jd schrieb:</p>
<blockquote>
<p>Habe jetzt nochmal in der Doku nach gelesen, bin aber leider nicht fündig geworden, was mein Problem angeht, hat jemand von euch noch einen Einfall?</p>
</blockquote>
<p>So hatte nochmals Zeit, mir das ganze anzuschauen. Hätte fast aufgegeben, da die IDE völlig gesponnen hat, aber bin dem Fehler dann doch auf die Schliche gekommen.</p>
<p>Hier liegt dein Hauptfehler:</p>
<pre><code class="language-cpp">boost::asio::buffer(&quot;Hello Server&quot;)
</code></pre>
<p>Was passiert hier? Hier wird eine solche Funktion aufgerufen:</p>
<pre><code class="language-cpp">template&lt;typename PodType, std::size_t N&gt;
/* ... */ buffer(PodType const (&amp;array)[N])
{
  /* ... */
}
</code></pre>
<p><code>&quot;Hello Server&quot;</code> hat den Typ <code>char[13]</code> . Also es wird aus einem C Array mit 13 Elementen ein Puffer erzeugt. Vielleicht wirst du jetzt schon hellhörig und denkst: &quot;13? Das sind doch nur 12 Buchstaben!&quot;<br />
Jedes Stringliteral hat eine Nullterminierung, also eine abschliessende 0. Wenn du nun den <code>std::string</code> konstruiert hast, dann hast du diese 0 mit reingeschoben:</p>
<pre><code class="language-cpp">std::string(buffer.data(), bytes_transfered);
</code></pre>
<p>Beim Vergleich mit dem Stringliteral wird diese Nullterminierung beim Literal ignoriert, beim <code>std::string</code> Objekt allerdings nicht. Also sind die beiden ungleich.</p>
<p>Meinen ersten Tipp würde ich nicht wegwerfen. Du musst bei der Netzwerkprogrammierung extrem aufpassen, vor allem wenn man asynchron kommuniziert. Es ist nicht garantiert, dass immer die ganzen Puffer gleichzeitig ankommen. Die können auch zerstückelt werden, du musst sie also unbedingt vorher wieder zusammenflicken. Dies bedeutet dann auch, dass du ein sinnvolles und stabiles Protokoll definierst, über welches kommuniziert werden kann.</p>
<p>Aber abgesehen von all dem und mal ganz allgemein, der Code ist ziemlich hässlich. Globale variablen, x-fache Code Duplizierung, unnötige Variablen, usw. usf.<br />
Auch deine Versuche den Fehler zu finden, sehen ziemlich nach C++ Anfänger aus und zwar blutiger Anfänger. Zum Beispiel auch das mit <code>buffer.data() == &quot;Hello Server&quot;</code> .<br />
Wäre es vielleicht nicht klüger, wenn du zuerst richtig C++ lernst, bevor du dich an Bibliotheken wie Boost.Asio ranwagst?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729154</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 18 Jun 2009 22:35:36 GMT</pubDate></item></channel></rss>