<?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[[Socket] Zeichen werden verschluckt]]></title><description><![CDATA[<p>Hallo!<br />
Ich hab vor kurzem bzgl. Sockets eine Frage gehabt... und nun wieder.<br />
Habe eben was probiert und es klappt. Und zwar habe ich eine HTTP-Anfrage zu machen. Klappt alles wunderbar, jedoch verschluckt der mir den letzten Tag und zwar &lt;/html&gt;.</p>
<p>Meine Funktion zum empfangen:</p>
<pre><code class="language-cpp">int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;

	while (true) {
		buffer[0] = '\0';
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		buffer[bytes] = '\0';
		cout &lt;&lt; buffer;
	}

	return 0;
}
</code></pre>
<p>Was passt hier nicht?</p>
<p>gesamter code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;netdb.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;unistd.h&gt;
using namespace std;

#define BUFFER_SIZE 1024
#define DEFAULT_ADDR &quot;85.125.39.37&quot;
#define DEFAULT_PORT 80

int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;

	while (true) {
		buffer[0] = '\0';
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		buffer[bytes] = '\0';
		cout &lt;&lt; buffer;
	}

	return 0;
}

int main(int argc, char *argv[])
{
	int s;
	struct sockaddr_in srv;

	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == -1)
	{
		perror(&quot;socket failed()&quot;);
		return 2;
	}

	srv.sin_addr.s_addr = inet_addr(DEFAULT_ADDR);
	srv.sin_port = htons(DEFAULT_PORT);
	srv.sin_family = AF_INET;

	if (connect(s, (const sockaddr*)&amp;srv, sizeof(srv)) == -1) {
		perror(&quot;connect failed()&quot;);
		return 3;
	}

	char buffer[] = &quot;GET / HTTP/1.1\nHost: citrosaft\nConnection: close\n\n&quot;;

	send(s, buffer, strlen(buffer), 0);
	if (handling(s) == -1) {
		fprintf(stderr, &quot;%s: error in handling()\n&quot;, argv[0]);
		return 4;
	}

	close(s);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/206944/socket-zeichen-werden-verschluckt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 00:41:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206944.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Mar 2008 20:33:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sat, 01 Mar 2008 20:33:45 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich hab vor kurzem bzgl. Sockets eine Frage gehabt... und nun wieder.<br />
Habe eben was probiert und es klappt. Und zwar habe ich eine HTTP-Anfrage zu machen. Klappt alles wunderbar, jedoch verschluckt der mir den letzten Tag und zwar &lt;/html&gt;.</p>
<p>Meine Funktion zum empfangen:</p>
<pre><code class="language-cpp">int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;

	while (true) {
		buffer[0] = '\0';
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		buffer[bytes] = '\0';
		cout &lt;&lt; buffer;
	}

	return 0;
}
</code></pre>
<p>Was passt hier nicht?</p>
<p>gesamter code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;netdb.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;unistd.h&gt;
using namespace std;

#define BUFFER_SIZE 1024
#define DEFAULT_ADDR &quot;85.125.39.37&quot;
#define DEFAULT_PORT 80

int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;

	while (true) {
		buffer[0] = '\0';
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		buffer[bytes] = '\0';
		cout &lt;&lt; buffer;
	}

	return 0;
}

int main(int argc, char *argv[])
{
	int s;
	struct sockaddr_in srv;

	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == -1)
	{
		perror(&quot;socket failed()&quot;);
		return 2;
	}

	srv.sin_addr.s_addr = inet_addr(DEFAULT_ADDR);
	srv.sin_port = htons(DEFAULT_PORT);
	srv.sin_family = AF_INET;

	if (connect(s, (const sockaddr*)&amp;srv, sizeof(srv)) == -1) {
		perror(&quot;connect failed()&quot;);
		return 3;
	}

	char buffer[] = &quot;GET / HTTP/1.1\nHost: citrosaft\nConnection: close\n\n&quot;;

	send(s, buffer, strlen(buffer), 0);
	if (handling(s) == -1) {
		fprintf(stderr, &quot;%s: error in handling()\n&quot;, argv[0]);
		return 4;
	}

	close(s);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1466323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466323</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 01 Mar 2008 20:33:45 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sat, 01 Mar 2008 20:42:04 GMT]]></title><description><![CDATA[<p>Deine recv-Schleife sieht doch etwas sonderbar aus. Was passiert denn, wenn die Verbindung abgebaut ist? Dann ergibt recv -1, und du packst an buffer[-1] eine 0 und erwartest, dass da was sinnvolles passiert. Unwahrscheinlich. Letztendlich fehlt auch noch das flush beim cout, deshalb wirst du wohl keine Ausgabe bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466329</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 01 Mar 2008 20:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sat, 01 Mar 2008 21:25:35 GMT]]></title><description><![CDATA[<p>hallo !</p>
<p>butterbrei schrieb:</p>
<blockquote>
<p>Klappt alles wunderbar, jedoch verschluckt der mir den letzten Tag und zwar &lt;/html&gt;</p>
</blockquote>
<p>der server beendet die verbindung, nachdem alle daten gesendet worden sind und schickt zum schluss ne 0.</p>
<p>in deinem puffer steht noch der rest der antwort drin und du machst den<br />
mit</p>
<pre><code class="language-cpp">buffer[0] = '\0';
</code></pre>
<p>dicht.<br />
wenn also &lt;/html&gt; fehlt, dann sollte im puffer '\0'/html&gt; drin stehen.<br />
wo ist eigentlich die abbruchbedingung in deiner schleife ?<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1466352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466352</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sat, 01 Mar 2008 21:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sat, 01 Mar 2008 22:45:46 GMT]]></title><description><![CDATA[<p>Hm... das klingt ja alles logisch.<br />
Aber ich habe noch keinen Lösungsansatz.<br />
Ich hab die Schleife einmal auf diese hier abgeändert (bloss eine Zeile ist neu und eine ist weniger bzw auskommentiert):</p>
<pre><code class="language-cpp">while (true) {
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		if (bytes == -1) break;
		buffer[bytes] = '\0';
		cout &lt;&lt; buffer;
		//buffer[0] = '\0';
	}
</code></pre>
<p>Ergebniss: Das selbe wie vorhin.</p>
<p>//edit:<br />
Wenn ich es so mache:</p>
<pre><code class="language-cpp">int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;
	string ttmp;

	while (true) {
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
		if (bytes &lt;= 0) break;

		buffer[bytes] = '\0';

		ttmp += buffer;
		//cout &lt;&lt; buffer;
		//buffer[0] = '\0';
	}

	/*tmp.open(&quot;tmp.txt&quot;, ios::out);
	if (tmp.is_open()) {
		tmp &lt;&lt; buffer;
	}*/
	cout &lt;&lt; ttmp;

	return 0;
}
</code></pre>
<p>Dann funktioniert es. Aber warum? Und ist es gut, wenn man das so macht? Also das ganze in einem String aufblähen?</p>
<p>//edit2:<br />
Jetzt versteh ich das erst! Aber ich dachte recv übergibt die bytes? Wenn recv nun aber noch etwas enthält, kann es doch nicht 0 sein. Warum wird dann &lt;/html&gt; nicht angezeigt?</p>
<p>//edit3 und der letzte für heute:<br />
Wenn ich kein break mach, sondern nur continue, dann tritt das ganze auf.<br />
gn8</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466363</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 01 Mar 2008 22:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sat, 01 Mar 2008 23:23:59 GMT]]></title><description><![CDATA[<p>Probier mal so:</p>
<pre><code class="language-cpp">while (true) {
  bytes = recv(sock, buffer, sizeof(buffer)-1, 0);
  if (bytes == 0)
    break;  // Verbindung wurde regulär geschlossen
  else if (bytes &lt; 0) {
    perror(&quot;recv&quot;); exit(1); // irgendwas ist schiefgegangen. TODO: bessere Fehlerbehandlung
  }
  buffer[bytes] = 0;
  cout &lt;&lt; buffer;
}
cout &lt;&lt; flush;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1466395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466395</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 01 Mar 2008 23:23:59 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sun, 02 Mar 2008 01:44:39 GMT]]></title><description><![CDATA[<p>butterbrei schrieb:</p>
<blockquote>
<p>//edit2:<br />
Jetzt versteh ich das erst! Aber ich dachte recv übergibt die bytes? Wenn recv nun aber noch etwas enthält, kann es doch nicht 0 sein. Warum wird dann &lt;/html&gt; nicht angezeigt?</p>
</blockquote>
<p>sorry, da habe ich mist geschrieben.<br />
ich habe deine erste schleife nochmal gecheckt, kompiliert.<br />
die komplette seite kommt rüber. weiss nicht warum das bei dir nicht geklappt hat.</p>
<p>butterbrei schrieb:</p>
<blockquote>
<p>Dann funktioniert es. Aber warum? Und ist es gut, wenn man das so macht? Also das ganze in einem String aufblähen?</p>
</blockquote>
<p>wenn du dir sicher bist, das dein arbeitsspeicher immer groß genug für die webseite( oder für was auch immer) ist.<br />
aber wer guckt sich schon ne webseite über cout in der konsole an, ne.<br />
für testzwecke mag das ja völlig ausreichen.<br />
wo es mit sicherheit probleme geben wird: wenn du daten im binärformat empfängst, also bilder, mukke, videos und so.<br />
denn die enthalten nullbytes. die anzeige wird dann zerhackt, bzw. wenn du den string speicherst, wird die datei zerstückelt und gekürzt.<br />
darüber hinaus fügst du unnötig nullbytes ein, wo keine hingehören.</p>
<p>wenn du allerdings nur textdateien empfangen willst, ist es egal.</p>
<p>ich habe bei meinem downloader den puffer bei jedem schleifendurchlauf in einer datei gespeichert, nachdem ich den<br />
http-antwort-header rausgefiltert hatte. ( das wäre in deinem programm eventuell noch ein todo )</p>
<pre><code class="language-cpp">...
int bytes = 0;

while( ( bytes = recv(sock, buffer, sizeof(buffer), 0) ) &gt; 0 )
{
    fwrite(buffer, bytes, 1, fp); // hier vielleicht noch ne fehlerbehandlung rein.
}

if ( bytes ) 
// fehlerbehandlung ...
...
</code></pre>
<p>edit: quellkot entfernt.<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1466420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466420</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sun, 02 Mar 2008 01:44:39 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sun, 02 Mar 2008 15:46:03 GMT]]></title><description><![CDATA[<p>Okay!<br />
Vielen Dank.<br />
Mit dem hier:</p>
<pre><code class="language-cpp">int handling(int sock) {
	char buffer[BUFFER_SIZE];
	int bytes;
	string ttmp;
	ofstream tmp;
	FILE* fp;

	while (true) {
		bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);

		if (bytes == 0) {
			continue;
		}else if (bytes &lt; 0) {
			perror(&quot;recv&quot;); exit(1);
		}else {
			buffer[bytes] = '\0';
			fp = fopen(&quot;test.txt&quot;, &quot;a&quot;);
			fputs(buffer,fp);
			fclose(fp);
		}
	}

	return 0;
}
</code></pre>
<p>klappts.</p>
<p>Warum ich die das ganze wirklich in einer Endlosschleife laufen hab ist einfach: Ich möchte einfach immer lauschen, ob da nun was kommt oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466739</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 02 Mar 2008 15:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sun, 02 Mar 2008 17:09:41 GMT]]></title><description><![CDATA[<p>butterbrei schrieb:</p>
<blockquote>
<p>Okay!<br />
Vielen Dank.<br />
Mit dem hier:</p>
<pre><code class="language-cpp">if (bytes == 0) {
			continue;
</code></pre>
<p>klappts.</p>
</blockquote>
<p>Was soll das bringen? Wenn bytes == 0 ist, dann ist die Verbindung geschlossen. Und sie geht von selbst auch nicht wieder auf. Der Himmel weiß, was du unter &quot;klappt&quot; verstehst.</p>
<blockquote>
<p>Warum ich die das ganze wirklich in einer Endlosschleife laufen hab ist einfach: Ich möchte einfach immer lauschen, ob da nun was kommt oder nicht.</p>
</blockquote>
<p>Wie gesagt, wenn die Verbindung zu ist, ist sie zu. Da kannst du lange lauschen, AFAIK müsstest du von recv danach -1 bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466773</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 02 Mar 2008 17:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sun, 02 Mar 2008 19:15:32 GMT]]></title><description><![CDATA[<p>Hmm... stimmt.</p>
<p>Eine andere Frage noch. Wenn ich kein 0-Byte am ende hinschreibe, dann wird ja irgendwie zum nächsten 0-Byte gelesen, also über die Grenzen hinaus oder so. Zumindest kamen bei mir, wenn ich das 0-Byte weglass, immer wieder komische Zeichen.<br />
Also beispielsweise war das Ende</p>
<pre><code>&lt;/html&gt;und hier noch ein paar wenige komische Zeichen
</code></pre>
<p>Wie kann ich das umgehen, damit ich auch binäre Daten ohne Probleme laden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466851</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 02 Mar 2008 19:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Sun, 02 Mar 2008 20:08:35 GMT]]></title><description><![CDATA[<p>butterbrei schrieb:</p>
<blockquote>
<p>Wie kann ich das umgehen, damit ich auch binäre Daten ohne Probleme laden kann.</p>
</blockquote>
<p>- kein fputs fürs speichern benutzen, eher sowas hier:</p>
<pre><code class="language-cpp">fwrite(buffer, bytes, 1, fp);
</code></pre>
<p>oder ein c++ äquivalent.<br />
die variable bytes hat ja immer die übertragene anzahl der bytes, die im puffer sind, gespeichert.</p>
<p>- keine strings anhängen in der form: ttmp += buffer;</p>
<p>in buffer kann in etwa so etwas drin stehen:</p>
<pre><code class="language-cpp">abc\0def
</code></pre>
<p>bei einem fputs oder einem ttmp += buffer würdest du einen teil der daten verlieren, nämlich das &quot;def&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1466908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1466908</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sun, 02 Mar 2008 20:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Mon, 03 Mar 2008 08:36:09 GMT]]></title><description><![CDATA[<p>Tatsächlich... Danke</p>
<p>achja man muss wenn dann schreiben</p>
<pre><code class="language-cpp">fwrite(buffer, 1, bytes, fp);
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1467108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467108</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Mar 2008 08:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Mon, 03 Mar 2008 15:07:43 GMT]]></title><description><![CDATA[<p>butterbrei schrieb:</p>
<blockquote>
<p>Tatsächlich... Danke<br />
achja man muss wenn dann schreiben</p>
<pre><code class="language-cpp">fwrite(buffer, 1, bytes, fp);
</code></pre>
<p><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>
</blockquote>
<p>achja ? muss ? nöö.<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1467374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467374</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Mon, 03 Mar 2008 15:07:43 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Mon, 03 Mar 2008 21:07:48 GMT]]></title><description><![CDATA[<p>Echt? Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1467601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467601</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 03 Mar 2008 21:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to [Socket] Zeichen werden verschluckt on Mon, 03 Mar 2008 21:44:05 GMT]]></title><description><![CDATA[<p>Weil dann size = bytes ist, der count = 1 mal geschrieben wird, das ist das gleiche in grün.<br />
Die Blockgröße ist bytes, die einmal geschrieben wird.<br />
Wie würdest du denn die fwrite-Parameter beim Speichern von z.B. 300 Strukturblöcken schreiben ?</p>
<pre><code class="language-cpp">struct myStruct
{
    int i;
};

    struct myStruct many_structs[300];
    fwrite( many_structs, ???, ???, fp );
</code></pre>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/1467620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1467620</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Mon, 03 Mar 2008 21:44:05 GMT</pubDate></item></channel></rss>