<?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 nur bis &#x5C;n]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem und zwar nutze ich folgenden Ausschnitt um Daten von einem Socket zu empfangen:</p>
<pre><code class="language-cpp">char ausgabe[1000];
	int x = 0;

	while(1)
	{
		x = recv((SOCKET)sock, ausgabe, 1000, 0);

		if(x &gt; 0)
		{
			ausgabe[x] = 0;
			CheckForEvent(ausgabe);
		}
		Sleep(10);
	}
</code></pre>
<p>Nun habe ich das Problem, dass mir der Server nicht schön Line für Line sendet sondern eine Masse an Nachrichten welche in keinsterweise getrennt sind sondern nur durch \n. So kann es zustande kommen, dass die Nachrichten nur halb ankommen und solche Sachen. Nun ist die Frage wie bekomme ich es am besten hin, dass die Variable ausgabe jeweils nur bis &quot;\n&quot; gefüllt wird? Muss ich da Zeichen für Zeichen einlesen und solange die Zeichen anhängen bis ich auf ein &quot;\n&quot; stoße oder gibt es da eine andere Möglichkeit?</p>
<p>MfG<br />
snpr</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286479/recv-nur-bis-n</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 22:22:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286479.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 May 2011 20:36:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 20:36:10 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgendes Problem und zwar nutze ich folgenden Ausschnitt um Daten von einem Socket zu empfangen:</p>
<pre><code class="language-cpp">char ausgabe[1000];
	int x = 0;

	while(1)
	{
		x = recv((SOCKET)sock, ausgabe, 1000, 0);

		if(x &gt; 0)
		{
			ausgabe[x] = 0;
			CheckForEvent(ausgabe);
		}
		Sleep(10);
	}
</code></pre>
<p>Nun habe ich das Problem, dass mir der Server nicht schön Line für Line sendet sondern eine Masse an Nachrichten welche in keinsterweise getrennt sind sondern nur durch \n. So kann es zustande kommen, dass die Nachrichten nur halb ankommen und solche Sachen. Nun ist die Frage wie bekomme ich es am besten hin, dass die Variable ausgabe jeweils nur bis &quot;\n&quot; gefüllt wird? Muss ich da Zeichen für Zeichen einlesen und solange die Zeichen anhängen bis ich auf ein &quot;\n&quot; stoße oder gibt es da eine andere Möglichkeit?</p>
<p>MfG<br />
snpr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061433</guid><dc:creator><![CDATA[snpr]]></dc:creator><pubDate>Tue, 10 May 2011 20:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 20:38:31 GMT]]></title><description><![CDATA[<p>Was spricht dagegen, in den empfangenen Daten nach dem Newline zu suchen und sich dann die entsprechenden Teile herauszuschneiden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061434</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 May 2011 20:38:31 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 20:54:19 GMT]]></title><description><![CDATA[<p>Im moment ist es wohl der Ansatz wie ich das am besten anstelle. Also das aufteilen in verschiedene substrings. Anderes Problem ist, dass es ja vorkommen kann das ein Satz in der Hälfte unterbrochen ist. Dieser sollte aber wieder als ein Satz erkannt werden. Irgendwie habe ich grade ein Brett vor dem Kopf wie man das am besten anstellen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061438</guid><dc:creator><![CDATA[snpr]]></dc:creator><pubDate>Tue, 10 May 2011 20:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 20:58:19 GMT]]></title><description><![CDATA[<p>Wenn du feststellst, daß die erwartete Eingabe nicht komplett ist, schreibst du dir den Teil vom &quot;hier geht die Zeile los&quot;-Marker bis zum Ende des empfangenen Puffers in eine Hilfsvariable. Danach holst du dir per recv() den nächsten Block und holst dir daraus den Rest der Zeile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061440</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 May 2011 20:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 21:07:40 GMT]]></title><description><![CDATA[<p>okay klar ist natürlich 'ne nette Lösung und definitv ne super idee <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="🙂"
    /> dankeschön. Jetzt bleibt nurnoch die Frage womit ich letztlich den String am besten zerstückel. Problem ist in meiner Überlegung im moment, dass ich ja nicht beim \n aufhören darf. Also stehe gerade wirklich auf dem Schlauch. Hast du da noch eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061442</guid><dc:creator><![CDATA[snpr]]></dc:creator><pubDate>Tue, 10 May 2011 21:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 21:17:58 GMT]]></title><description><![CDATA[<p>Ich würde std::find() verwenden, um die NewLines zu finden, und dann die Bereiche dazwischen gleich in einen String reinpacken. Den Puffer und (ganz wichtig) die Position, bis wohin du ihn schon ausgewertet hast, würde ich als statische Variable<sup>*</sup> aufbewahren und bei der nächsten Anforderung weiter auswerten.</p>
<p><sup>*</sup> alternativ packst du das ganze in eine Klasse mit dem Puffer als Member.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061444</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 May 2011 21:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 21:39:01 GMT]]></title><description><![CDATA[<p>Wahrscheinlich war das jetzt viel zu überhastet und zu wenig durchdacht aber ich bekommen eine komplet leere Ausgabe. <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="😞"
    /> Vermutlich sollte ich mich dafür schämen was ich da gebaut habe aber naja. Dass eine Satz auf 2 Nachrichten aufgeteil ist, ist hier mal schön rausgelassen.</p>
<pre><code class="language-cpp">void ausgeben(char *ausgabe)
{

	std::string	buffer(ausgabe);
	std::string line[20];
	unsigned int n_line = 0;
	size_t pos,lastpos;
	lastpos = 0;
	while(buffer.find(&quot;\n&quot;,lastpos+1) != std::string::npos)
	{
		pos = buffer.find(&quot;\n&quot;,lastpos+1);
		line[n_line] = buffer.substr(lastpos+1,(pos-lastpos));
		std::cout &lt;&lt; line[n_line] &lt;&lt; std::endl;
		n_line++;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2061460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061460</guid><dc:creator><![CDATA[snpr]]></dc:creator><pubDate>Tue, 10 May 2011 21:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 21:49:58 GMT]]></title><description><![CDATA[<p>Kommt denn in der Eingabe überhaupt ein NewLine vor? Wenn nicht, wird die Schleife komplett übersprungen.</p>
<p>Ansonsten hast du vergessen, in der Schleife die lastpos anzupassen - mit einigen leichten Anpassungen läuft es so: <a href="http://ideone.com/4dB4T" rel="nofollow">http://ideone.com/4dB4T</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061464</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 May 2011 21:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 22:03:53 GMT]]></title><description><![CDATA[<p>Okay. Ich glaube es läuft schonmal halbwegs <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>Leider zickt das ganze noch ein wenig rum. Warum ist momentan zwar noch in den sternen aber naja. Und zwar kommen scheinbar nicht alle nachrichten durch. Könnte natürlich daran liegen, dass ich bisher nicht berücksichtigt hab, dass die Nachricht in der nächsten Ladung weitergehen könnte. Ich müsste dann mir quasi merken, dass es nicht abgeschlossen wurde und dann quasi den Rest des einen Strings + dem des neuens bis zum NewLine oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061467</guid><dc:creator><![CDATA[snpr]]></dc:creator><pubDate>Tue, 10 May 2011 22:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Tue, 10 May 2011 22:11:41 GMT]]></title><description><![CDATA[<p>Ja, das Endstück solltest du dir auch noch merken und dann mit dem Anfang der nächsten Eingabe zusammenfassen.</p>
<p>(PS: Nur ein kleiner Hinweis: Ich würde statt des festen Arrays lieber einen vector&lt;string&gt; verwenden - ich weiß zwar nicht wie lang die einzelnen Zeilen sind, aber bei 1000 Byte recv-Puffer könnte es passieren, daß du die 20 Einträge überschreitest)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061470</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 10 May 2011 22:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to recv nur bis &#x5C;n on Wed, 11 May 2011 05:28:49 GMT]]></title><description><![CDATA[<p>snpr schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void ausgeben(char *ausgabe)
{

	std::string	buffer(ausgabe);
	std::string line[20];
	unsigned int n_line = 0;
	size_t pos,lastpos;
	lastpos = 0;
	while(buffer.find(&quot;\n&quot;,lastpos+1) != std::string::npos)
	{
		pos = buffer.find(&quot;\n&quot;,lastpos+1);
		line[n_line] = buffer.substr(lastpos+1,(pos-lastpos));
		std::cout &lt;&lt; line[n_line] &lt;&lt; std::endl;
		n_line++;
	}
}
</code></pre>
</blockquote>
<p>Mhm, dies Codestück sieht so aus, als wolltest Du einfach die empfangenen Daten Zeile für Zeile in einen Stream schreiben ... dafür würde aber doch:</p>
<pre><code class="language-cpp">void ausgeben(char *ausgabe)
{
   std::cout &lt;&lt; ausgabe;
}
</code></pre>
<p>völlig ausreichen <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="😕"
    /><br />
Edit: Der Puffer 'ausgabe' muss natürlich nullterminiert werden, nachdem er mit recv gefüllt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061507</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 11 May 2011 05:28:49 GMT</pubDate></item></channel></rss>