<?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[[gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen]]></title><description><![CDATA[<p>Hallo Ihr lieben.<br />
Zuerst: Ich nutze noch Boost 1.35. da ich die neuste Boostlibrary nicht kompilieren kann (NTVDM CPU has encountered an illegal instruction).</p>
<p>Doch nun zum Phänomen:</p>
<p>Ich baue mit boost:asio eine Socketverbindung zu einer Software auf und sende darüber zwei Befehle, was auch incl. Empfang funktioniert.<br />
Also Befehl1: Senden-Empfangen, Befehl2: Senden-Empfangen.</p>
<p>Den Zweiten Befehl sollte ich nun in einer extra Funktion senden/empfangen.<br />
Also übergebe ich den Socket als Zeiger und sende in der Funktion den 2. Befehl, was auch funktioniert.Allerdings kann ich dann nichts empfangen, bzw. der Empfangsbuffer ist leer, da kann ich machen was ich will.</p>
<p>Dann habe ich ein wenig herumexperimentiert:</p>
<p>Befehl1 in der extra Funktion empfangen-&gt; funktioniert.</p>
<p>Mit normalen Windows Sockets: Befehl1 Senden/empfangen, dann Befehl2 in der Funktion Senden/Empfangen-&gt; Funktioniert!</p>
<p>Es scheint also nicht am Prinzip oder an der Software zu liegen, sondern es muss irgendwie mit boost zusammenhängen.</p>
<p>Hier der Teil-Quellcode:</p>
<pre><code>*string ip_client_str = ip_client;
	string port_interface_str = str( boost::format(&quot;%1%&quot;) % CUservariable::PORT_INTERFACE_ORIG);

    tcp::resolver resolver(io_service);
    tcp::resolver::query query(ip_client_str,port_interface_str );
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;

	tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error &amp;&amp; endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);	  
    }
    if (error)
      throw boost::system::system_error(error);

    boost::asio::streambuf request;
    std::ostream request_stream(&amp;request);
	boost::asio::streambuf response;
	std::istream response_stream(&amp;response);
    std::string erg_socksize;

	request_stream &lt;&lt; &quot;Befehl2&quot;;     
    boost::asio::write(socket, request);    
    boost::asio::read_until(socket, response, &quot;\0&quot;);	
    // Check that response is OK.   
    response_stream &gt;&gt; erg_socksize;//OK

CCheckLogin chklgn;
	 chklgn.logintext = erg_socksize;
	 bool isSockSize = chklgn.getLogin([b]&amp;socket[/b]);
</code></pre>
<p>Deklaration der Funktion:</p>
<pre><code>class CCheckLogin
{
..

public:

	bool getLogin(boost::asio::ip::tcp::socket *);	

..

....
</code></pre>
<p>Implementierung:</p>
<pre><code>....
bool CCheckLogin::getLogin_str(boost::asio::ip::tcp::socket * socket)
 {.......
request_stream &lt;&lt; stdPwdSend;
iSend = boost::asio::write(*socket, request); 
boost::asio::read_until(*socket, response, &quot;\0&quot;); [b]//STREAM IST LEER![/b]
....
</code></pre>
<p>In der Software sehe ich, daß der Befehl ankommt und versendet wird, nur kann ich ihn nicht empfangen.<br />
Wie gesagt, mache ich das ohne &quot;extra&quot; Funktion hintereinander, funktioniert es bzw. ich empfange was.<br />
Kann es an der Referenz auf den Socket liegen? Aber dann könnte ja die Software nichts empfangen?</p>
<p>Woran kann das liegen, daß ich beim empfangen in der Funktion nichts bekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309139/gelöst-c-boost-asio-socket-als-variable-übergeben-keine-daten-empfangen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 11:19:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309139.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Oct 2012 09:48:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 12:09:00 GMT]]></title><description><![CDATA[<p>Hallo Ihr lieben.<br />
Zuerst: Ich nutze noch Boost 1.35. da ich die neuste Boostlibrary nicht kompilieren kann (NTVDM CPU has encountered an illegal instruction).</p>
<p>Doch nun zum Phänomen:</p>
<p>Ich baue mit boost:asio eine Socketverbindung zu einer Software auf und sende darüber zwei Befehle, was auch incl. Empfang funktioniert.<br />
Also Befehl1: Senden-Empfangen, Befehl2: Senden-Empfangen.</p>
<p>Den Zweiten Befehl sollte ich nun in einer extra Funktion senden/empfangen.<br />
Also übergebe ich den Socket als Zeiger und sende in der Funktion den 2. Befehl, was auch funktioniert.Allerdings kann ich dann nichts empfangen, bzw. der Empfangsbuffer ist leer, da kann ich machen was ich will.</p>
<p>Dann habe ich ein wenig herumexperimentiert:</p>
<p>Befehl1 in der extra Funktion empfangen-&gt; funktioniert.</p>
<p>Mit normalen Windows Sockets: Befehl1 Senden/empfangen, dann Befehl2 in der Funktion Senden/Empfangen-&gt; Funktioniert!</p>
<p>Es scheint also nicht am Prinzip oder an der Software zu liegen, sondern es muss irgendwie mit boost zusammenhängen.</p>
<p>Hier der Teil-Quellcode:</p>
<pre><code>*string ip_client_str = ip_client;
	string port_interface_str = str( boost::format(&quot;%1%&quot;) % CUservariable::PORT_INTERFACE_ORIG);

    tcp::resolver resolver(io_service);
    tcp::resolver::query query(ip_client_str,port_interface_str );
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;

	tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error &amp;&amp; endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);	  
    }
    if (error)
      throw boost::system::system_error(error);

    boost::asio::streambuf request;
    std::ostream request_stream(&amp;request);
	boost::asio::streambuf response;
	std::istream response_stream(&amp;response);
    std::string erg_socksize;

	request_stream &lt;&lt; &quot;Befehl2&quot;;     
    boost::asio::write(socket, request);    
    boost::asio::read_until(socket, response, &quot;\0&quot;);	
    // Check that response is OK.   
    response_stream &gt;&gt; erg_socksize;//OK

CCheckLogin chklgn;
	 chklgn.logintext = erg_socksize;
	 bool isSockSize = chklgn.getLogin([b]&amp;socket[/b]);
</code></pre>
<p>Deklaration der Funktion:</p>
<pre><code>class CCheckLogin
{
..

public:

	bool getLogin(boost::asio::ip::tcp::socket *);	

..

....
</code></pre>
<p>Implementierung:</p>
<pre><code>....
bool CCheckLogin::getLogin_str(boost::asio::ip::tcp::socket * socket)
 {.......
request_stream &lt;&lt; stdPwdSend;
iSend = boost::asio::write(*socket, request); 
boost::asio::read_until(*socket, response, &quot;\0&quot;); [b]//STREAM IST LEER![/b]
....
</code></pre>
<p>In der Software sehe ich, daß der Befehl ankommt und versendet wird, nur kann ich ihn nicht empfangen.<br />
Wie gesagt, mache ich das ohne &quot;extra&quot; Funktion hintereinander, funktioniert es bzw. ich empfange was.<br />
Kann es an der Referenz auf den Socket liegen? Aber dann könnte ja die Software nichts empfangen?</p>
<p>Woran kann das liegen, daß ich beim empfangen in der Funktion nichts bekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260593</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Mon, 15 Oct 2012 12:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 10:01:35 GMT]]></title><description><![CDATA[<p>Was für ein Typ hat <code>response</code> und wie wird die Variable initialisiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260599</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 15 Oct 2012 10:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 10:08:08 GMT]]></title><description><![CDATA[<p>Response ist ein streambuf, der innerhalb der Funktion angelegt wird:</p>
<blockquote>
<p>bool CCheckLogin::getLogin_str(boost::asio::ip::tcp::socket * socket)<br />
{.......<br />
boost::asio::streambuf response;<br />
std::istream response_stream(&amp;response)<br />
...<br />
request_stream &lt;&lt; stdPwdSend;<br />
iSend = boost::asio::write(*socket, request);<br />
boost::asio::read_until(*socket, response, &quot;\0&quot;); //STREAM IST LEER!</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2260602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260602</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Mon, 15 Oct 2012 10:08:08 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 12:08:47 GMT]]></title><description><![CDATA[<p>Hat sich erledigt.<br />
Das Problem lag an read-until - diese Funktion liest bis ein bestimmtes Zeichen empfangen wurde, in meinem Fall '\0', der Buffer war dann aber noch nicht leer, sondern war noch aufgefüllt mit nullen.<br />
mir der Funktion read_some kann ich die Länge angeben, dann wird auch alles abgeholt und es kommen auch die gewünschten Ergebnisse.<br />
Danke für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260673</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Mon, 15 Oct 2012 12:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 13:27:20 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Mit <code>read_some(..)</code> werden nicht zwingend soviele Daten gelesen wie dein Buffer gross ist, sondern etwas zwischen 0 und Buffer Grösse an Bytes! Du musst selbst prüfen ob das Ende deiner Nachricht schon angekommen ist, ansonsten weiterlesen und die Daten aufkumulieren - halt das Framing Protokoll umsetzten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260701</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 15 Oct 2012 13:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 13:32:51 GMT]]></title><description><![CDATA[<p>Ja, das mache ich so:<br />
Lesen, prüfen ob alles da ist, wenn nicht, den rest abholen, so lange bis alles da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260704</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Mon, 15 Oct 2012 13:32:51 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Mon, 15 Oct 2012 14:12:56 GMT]]></title><description><![CDATA[<p>Wieso kannst du Boost nicht kompilieren unter Windows7 mit VS2010 und auch VS2012 kein Problem, per CMD und b2. Dauert halt etwas länger als z.B. wxWidgets.</p>
<pre><code>bootstrap.bat
.\b2 toolset=msvc --build-type=complete --libdir=&lt;boostdir&gt;\lib\i386 install
</code></pre>
<p>Mehr mache ich nicht außer beim 64Bit Build.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260715</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 15 Oct 2012 14:12:56 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]C++ boost asio&#x2F;Socket als variable übergeben: Keine Daten empfangen on Tue, 16 Oct 2012 06:21:33 GMT]]></title><description><![CDATA[<p>Wie gesagt, es kommt die Meldung, daß <strong>NTVDM CPU eine illegal instruction encountered</strong> hat <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="🙂"
    /> Auch direkt auf der Commandozeile geht es wegen diesem Problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260874</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Tue, 16 Oct 2012 06:21:33 GMT</pubDate></item></channel></rss>