<?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[Frage zu Winsock]]></title><description><![CDATA[<p>Morgen ich guck mir gerade das C Worker Tutorial zu Winsocks an aber ein Teil verstehe ich nicht:</p>
<p><a href="http://www.c-worker.ch/tuts/wstut_op.php" rel="nofollow">http://www.c-worker.ch/tuts/wstut_op.php</a></p>
<p>Dort steht:</p>
<p>Noch ein kleiner Hinweis: Wenn man mit Strings arbeitet hat man mehrere Möglichkeiten:<br />
- Entweder sendet man das terminierende \0 gleich mit, und so kann der andere den String gleich ausgeben<br />
oder die Variante die ich gewählt habe (ist etwas sicherer)<br />
- Man prüft zuerst den Rückgabewert von recv, ist es kein Fehler macht man folgendes:<br />
buf[rc]='\0';</p>
<p>(Annahme: buf ist der Buffer der die Daten speichert, und rc der Rückgabewert)<br />
Da recv() ja die Anzahl der empfangenen Bytes zurück gibt wird so automatisch hinter dem letzten empfangenen Zeichen ein \0 angefügt.</p>
<p>Wieso ist das jetzt rc der Rückgabewert von revc <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>
<pre><code class="language-cpp">rc=recv(kSock,buf,256,0);

	if(rc==0)
        {
	  cout&lt;&lt;&quot;Server hat die Verbindung getrennt..\n&quot;;
	  system(&quot;PAUSE&quot;);
	  return 0;
	}

    if(rc==SOCKET_ERROR)
    {
	  cout&lt;&lt;&quot;Fehler: recv, fehler code: &quot;&lt;&lt;WSAGetLastError();
	 system(&quot;PAUSE&quot;);
	  return 0;
	}

	 buf[rc]='\0';   

	cout&lt;&lt;&quot;\nServer antwortet: \n&quot;&lt;&lt;buf;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/216952/frage-zu-winsock</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 02:52:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216952.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jul 2008 08:39:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Winsock on Tue, 01 Jul 2008 08:39:06 GMT]]></title><description><![CDATA[<p>Morgen ich guck mir gerade das C Worker Tutorial zu Winsocks an aber ein Teil verstehe ich nicht:</p>
<p><a href="http://www.c-worker.ch/tuts/wstut_op.php" rel="nofollow">http://www.c-worker.ch/tuts/wstut_op.php</a></p>
<p>Dort steht:</p>
<p>Noch ein kleiner Hinweis: Wenn man mit Strings arbeitet hat man mehrere Möglichkeiten:<br />
- Entweder sendet man das terminierende \0 gleich mit, und so kann der andere den String gleich ausgeben<br />
oder die Variante die ich gewählt habe (ist etwas sicherer)<br />
- Man prüft zuerst den Rückgabewert von recv, ist es kein Fehler macht man folgendes:<br />
buf[rc]='\0';</p>
<p>(Annahme: buf ist der Buffer der die Daten speichert, und rc der Rückgabewert)<br />
Da recv() ja die Anzahl der empfangenen Bytes zurück gibt wird so automatisch hinter dem letzten empfangenen Zeichen ein \0 angefügt.</p>
<p>Wieso ist das jetzt rc der Rückgabewert von revc <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>
<pre><code class="language-cpp">rc=recv(kSock,buf,256,0);

	if(rc==0)
        {
	  cout&lt;&lt;&quot;Server hat die Verbindung getrennt..\n&quot;;
	  system(&quot;PAUSE&quot;);
	  return 0;
	}

    if(rc==SOCKET_ERROR)
    {
	  cout&lt;&lt;&quot;Fehler: recv, fehler code: &quot;&lt;&lt;WSAGetLastError();
	 system(&quot;PAUSE&quot;);
	  return 0;
	}

	 buf[rc]='\0';   

	cout&lt;&lt;&quot;\nServer antwortet: \n&quot;&lt;&lt;buf;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1538960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1538960</guid><dc:creator><![CDATA[Winsock]]></dc:creator><pubDate>Tue, 01 Jul 2008 08:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Winsock on Tue, 01 Jul 2008 08:49:43 GMT]]></title><description><![CDATA[<p>Winsock schrieb:</p>
<blockquote>
<p>Wieso ist das jetzt rc der Rückgabewert von revc <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>
</blockquote>
<p>Weil in folgendem Codestück der Variable rc der Rückgabewert von recv zugewiesen wird. Wenn Dir diese Antwort nicht weiterhilft, formuliere die Frage anders.</p>
<pre><code class="language-cpp">rc=recv(kSock,buf,256,0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1538966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1538966</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 01 Jul 2008 08:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Winsock on Tue, 01 Jul 2008 09:26:45 GMT]]></title><description><![CDATA[<p>Winsock schrieb:</p>
<blockquote>
<p>- Man prüft zuerst den Rückgabewert von recv, ist es kein Fehler macht man folgendes:<br />
buf[rc]='\0';<br />
[...]<br />
Da recv() ja die Anzahl der empfangenen Bytes zurück gibt wird so automatisch hinter dem letzten empfangenen Zeichen ein \0 angefügt.</p>
</blockquote>
<p>Darauf würde ich definitiv <em>nicht</em> setzen! Wenn du etwas sendest, kann es auch in kleinen Stückchen ankommen. Sendest du z.B. den String &quot;Hello World&quot;, kann es z.B. sein, dass dein recv nur &quot;Hel&quot; empfängt und halt 3 zurückgibt, von wegen 3 Bytes empfangen. Das nächste recv würde dann vielleicht den Rest empfangen, evtl aber auch nur einen einzigen weitern Buchstaben.<br />
Um das zu umgehen, muss der String null-terminiert sein (wie von dem Tutorial vorgeschlagen, recv in einer Schleife aufrufen, bis ein Fehler kommt oder das Zeichen '\0' dabei ist) oder du musst die Länge des String vorwegschicken (z.B. als 32-Bit Binärzahl).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1538987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1538987</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 01 Jul 2008 09:26:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Winsock on Tue, 01 Jul 2008 09:36:02 GMT]]></title><description><![CDATA[<p>Übrigens würde ich dir gerne eine Bibliothek an's Herz legen, die das Ganze für dich kapselt. Du könntest dir z.B. <a href="http://asio.sourceforge.net/boost_asio_1_0_0/libs/asio/doc/html/boost_asio/tutorial.html" rel="nofollow">boost::asio</a> oder <a href="http://www.sfml-dev.org/tutorials/1.3/network-sockets.php" rel="nofollow">SFML</a> anschauen.</p>
<p>Unter SFML sähe das dann in etwa so aus:</p>
<pre><code class="language-cpp">// Senden
sf::Packet packet;
packet &lt;&lt; &quot;Hello World&quot;;
socket.Send( packet );

// Empfangen
std::string received_string;
sf::Packet packet;

if ( socket.Receive(packet) != sf::Socket::Status::Done )
    ; // Fehler

packet &gt;&gt; received_string;
if ( ! packet )
    ; // Fehler

std::cout &lt;&lt; received_string &lt;&lt; std::endl; // String ausgeben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1538992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1538992</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 01 Jul 2008 09:36:02 GMT</pubDate></item></channel></rss>