<?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[recv socket Problem]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgende Methode für den Datenempfang;</p>
<pre><code class="language-cpp">int rc = 0;
   std::size_t size = 2000;
   std::vector&lt;char&gt; buffer(size, 0);
   rc = recv(s, &amp;buffer.front(), buffer.size(), 0);
return std::string(buffer.begin(), buffer.end());
</code></pre>
<p>Nun ist das so, dass ab einer bestimmten Größe die Daten nicht mehr vollständig ausgelesen werden. Sie werden nur noch doppelt ausgelesen?!? kann mir aber das nicht erklären.</p>
<p>Hat jemand eine Idee?</p>
<p>PS: Die größe des Puffers ist ausreichend</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297632/recv-socket-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 08:24:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297632.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Jan 2012 16:55:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 16:55:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgende Methode für den Datenempfang;</p>
<pre><code class="language-cpp">int rc = 0;
   std::size_t size = 2000;
   std::vector&lt;char&gt; buffer(size, 0);
   rc = recv(s, &amp;buffer.front(), buffer.size(), 0);
return std::string(buffer.begin(), buffer.end());
</code></pre>
<p>Nun ist das so, dass ab einer bestimmten Größe die Daten nicht mehr vollständig ausgelesen werden. Sie werden nur noch doppelt ausgelesen?!? kann mir aber das nicht erklären.</p>
<p>Hat jemand eine Idee?</p>
<p>PS: Die größe des Puffers ist ausreichend</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163358</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Tue, 03 Jan 2012 16:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 17:14:09 GMT]]></title><description><![CDATA[<p>Zerstückel die Datei in die Größe deines Puffers und dann send diese.<br />
Wenn sie angekommen sind setz die Stücken in einer Datein wieder zusammen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163368</guid><dc:creator><![CDATA[CCodex]]></dc:creator><pubDate>Tue, 03 Jan 2012 17:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 17:18:50 GMT]]></title><description><![CDATA[<p>CCodex schrieb:</p>
<blockquote>
<p>Zerstückel die Datei in die Größe deines Puffers und dann send diese.<br />
Wenn sie angekommen sind setz die Stücken in einer Datein wieder zusammen.</p>
</blockquote>
<p>Nein.</p>
<p>Eine ausführliche Antwort findest du sicherlich in der WinAPI-FAQ. Kurz: recv in einer Schleife aufrufen, bis alle Daten da sind. Oder Statemachine o.Ä. falls die Länge nicht im Voraus feststeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163370</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Tue, 03 Jan 2012 17:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 17:55:01 GMT]]></title><description><![CDATA[<p>Hi nochmals,</p>
<p>bei mir werden aber die socketverbindung nicht geschlossen, so schließt es sich aus nach -1 oder 0 zu prüfen. Gibt es eine andere alternative?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163382</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Tue, 03 Jan 2012 17:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 18:28:53 GMT]]></title><description><![CDATA[<p>Du könntest damit anfangen, den Rückgabewert von <code>recv</code> zu beachten.</p>
<p>Das ist Unsinn, weil immer der ganze Puffer zurückgegeben wird:</p>
<pre><code class="language-cpp">return std::string(buffer.begin(), buffer.end());
</code></pre>
<p>Korrekt wäre:</p>
<pre><code class="language-cpp">if (rc &lt;= 0)
{
... Verbindung verloren
}
else
{
    return std::string(buffer.begin(), buffer.begin() + rc);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2163395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163395</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Jan 2012 18:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 18:39:04 GMT]]></title><description><![CDATA[<p>ich könnte doch auch</p>
<pre><code class="language-cpp">int rc = 0;
   std::size_t size = 2000;
   std::vector&lt;char&gt; buffer(size, 0);
   rc = recv(s, &amp;buffer.front(), buffer.size(), 0);
   if(rc&lt;=0)
       return &quot;&quot;;
return std::string(buffer.begin(), buffer.end());
</code></pre>
<p>Aber die Frage ist immernoch nicht geklärt, warum nach einer bestimmten Anzahl keine Daten mehr ausglesen werden? stattdesen wird nach einer weile die werte immer doppelt ausglesen:<br />
bsp: send: 123456789<br />
recv() -&gt; 123456666<br />
warum keine Ahnung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163398</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Tue, 03 Jan 2012 18:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 18:49:33 GMT]]></title><description><![CDATA[<p>dein letzter code ist falsch weil recv nicht zwingend den ganzen puffer abfüllt -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163402</guid><dc:creator><![CDATA[r-c]]></dc:creator><pubDate>Tue, 03 Jan 2012 18:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 19:10:58 GMT]]></title><description><![CDATA[<p>Dein recv weiß überhaupt nicht, wieviel auf der anderen Seite gesendet worden ist. Es ist durchaus möglich, dass der Sender in Rutsch 100000 Byte sendet, die in mehreren kleinen Teilen via recv beim Empfänger gelesen werden müssen.<br />
Entweder 'weiß' das Programm, das recv ausführt, wieviel Daten kommen müssen, und muss dann solange recv ausführen, bis alle empfangen wurden, oder aber man braucht ein kleines Protokoll, so dass das recv-Programm erkennen kann, wann es mit lesen fertig ist.<br />
Du solltest wirklich, wie hier schon mal jemand erwähnt hat, im WINAPI - Forum suchen, da ist das nochmal beschrieben und dort gibt es auch Codebeispiele usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163407</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 03 Jan 2012 19:10:58 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 19:25:14 GMT]]></title><description><![CDATA[<p>ich weiss ganz genau, dass die größe der Daten 2000Byte überschreitet. Also im worst case wären es tatächlich 2000byte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163411</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Tue, 03 Jan 2012 19:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 19:30:48 GMT]]></title><description><![CDATA[<p>EDIT:wollte natürlich nicht überschreitet schreiben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163412</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Tue, 03 Jan 2012 19:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Tue, 03 Jan 2012 19:36:56 GMT]]></title><description><![CDATA[<p>Das ändert nichts an der Tatsache, dass Deine 2000 Byte unterwegs möglicherweise aufgeteilt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163413</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Tue, 03 Jan 2012 19:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Wed, 04 Jan 2012 10:20:37 GMT]]></title><description><![CDATA[<p>Beobachter01 schrieb:</p>
<blockquote>
<p>ich weiss ganz genau, dass die größe der Daten 2000Byte überschreitet. Also im worst case wären es tatächlich 2000byte</p>
</blockquote>
<p>Beobachter01 schrieb:</p>
<blockquote>
<p>EDIT:wollte natürlich nicht überschreitet schreiben</p>
</blockquote>
<p>Mag sein, dass DU das weißt. Nochmal:<br />
Es ist durchaus möglich, dass Dein recv 100Byte liest, und zwar egal, ob die Gegenstelle 100, 1000, oder 2000 Byte gesendet hat!<br />
Wenn Du also weißt, dass die Gegenstelle irgendwas zwischen 100 und 2000 Byte gesendet hat, und Dein recv liest zB 200Byte, dann weißt Du an der Stelle doch nicht, ob noch was gelesen werden muss, oder ob evtl. nur 200 Byte gesendet wurden, und Du demnach fertig bist mit Lesen.<br />
Und deshalb muss recv in einer Schleife solange aufgerufen werden, bis es alles was gesendet wurde, auch gelesen hat. Dazu aber ist es erforderlich, dass bekannt ist, wieviel gesendet wurde. Dazu mal zwei Möglichkeiten:<br />
Die einfache:<br />
Es werden immer genau 2000Byte gesendet. Dann macht man sooft recv, bis 2000Byte gelesen wurden. Dazu addiert man einfach die Rückgabewerte von recv.<br />
Die kompliziertere:<br />
Es wird irgendwas zwischen 1 und 2000 Byte gesendet. Nun weiß man beim recv natürlich nicht, wann man alles gelesen hat. Es ist ein Protokoll notwendig, um diese Situation sinnvoll behandeln zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163570</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 04 Jan 2012 10:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to recv socket Problem on Wed, 04 Jan 2012 16:45:14 GMT]]></title><description><![CDATA[<p>Hi nochmals,</p>
<p>du hast Recht, das Protokoll zu verändern wird nicht möglich. Ich sende ein codiertes const char* aus diesem Anlass kann durchaus vorkommen das dieses Zeichen auch im eigentlichen Protokoll als Nutzdaten enthalten ist!</p>
<p>Danke euch, wohl oder übel muss ich etwas machen. Es ist sehr wichtig, dass alles empfangen werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2163764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2163764</guid><dc:creator><![CDATA[Beobachter01]]></dc:creator><pubDate>Wed, 04 Jan 2012 16:45:14 GMT</pubDate></item></channel></rss>