<?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 spinnt? (recv)]]></title><description><![CDATA[<p>Huhu!<br />
Ich versuche gerade ein typisches Client/Server modell aufzubauen. Ich habe einen Server der auf Nachrichten wartet und einen Client der dem Server nachrichten schicken kann. Der Server empfängt und verarbeitet die Nachrichten korrekt, jedoch hängt sich der Server in einer endlosschleife auf, sobald der Client die Verbindung verliert.</p>
<p>Ich habe send und recv in eine Klasse gekapselt, die auch wirklich die Bytes empfangen, die empfangen werden sollen. (Nötig wegen Nagle Algorithmus)<br />
Hier das Stück code:</p>
<pre><code class="language-cpp">void Unisocket::RecvAll(char *buf, const int size)
{
	int bytesRecv = 0; //Anzahl Bytes die bereits vom Buffer empfangen wurden.
	do
	{
		int result = recv((int)Socket, buf + bytesRecv, size - bytesRecv, 0);

		if(result &lt; 0) // Wenn send einen Wert &lt; 0 zurückgibt, deutet dies auf einen Fehler hin.
		{
			throw CreateSocketError();
		}
		bytesRecv += result;
	}
	while(bytesRecv &lt; size);
}
</code></pre>
<p>Ich ging davon aus, dass recv den Wert -1 (also SOCKET_ERROR) zurück gibt, wenn die Verbindung abbricht. recv liefert allerdings jedesmal 0 zurück, woraus die endlosschleife resultiert.<br />
Wenn ich mit send 0 bytes senden will, erhalte ich SOCKET_ERROR, jedoch nicht bei recv. Ist das normal? Muss ich nach jedem recv ein send mit 0 bytes machen um zu schauen ob die Verbindung abgebrochen ist, oder geht es auch eleganter?</p>
<p>Mfg Perner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181516/socket-spinnt-recv</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 07:53:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181516.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2007 15:47:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Socket spinnt? (recv) on Mon, 14 May 2007 15:47:54 GMT]]></title><description><![CDATA[<p>Huhu!<br />
Ich versuche gerade ein typisches Client/Server modell aufzubauen. Ich habe einen Server der auf Nachrichten wartet und einen Client der dem Server nachrichten schicken kann. Der Server empfängt und verarbeitet die Nachrichten korrekt, jedoch hängt sich der Server in einer endlosschleife auf, sobald der Client die Verbindung verliert.</p>
<p>Ich habe send und recv in eine Klasse gekapselt, die auch wirklich die Bytes empfangen, die empfangen werden sollen. (Nötig wegen Nagle Algorithmus)<br />
Hier das Stück code:</p>
<pre><code class="language-cpp">void Unisocket::RecvAll(char *buf, const int size)
{
	int bytesRecv = 0; //Anzahl Bytes die bereits vom Buffer empfangen wurden.
	do
	{
		int result = recv((int)Socket, buf + bytesRecv, size - bytesRecv, 0);

		if(result &lt; 0) // Wenn send einen Wert &lt; 0 zurückgibt, deutet dies auf einen Fehler hin.
		{
			throw CreateSocketError();
		}
		bytesRecv += result;
	}
	while(bytesRecv &lt; size);
}
</code></pre>
<p>Ich ging davon aus, dass recv den Wert -1 (also SOCKET_ERROR) zurück gibt, wenn die Verbindung abbricht. recv liefert allerdings jedesmal 0 zurück, woraus die endlosschleife resultiert.<br />
Wenn ich mit send 0 bytes senden will, erhalte ich SOCKET_ERROR, jedoch nicht bei recv. Ist das normal? Muss ich nach jedem recv ein send mit 0 bytes machen um zu schauen ob die Verbindung abgebrochen ist, oder geht es auch eleganter?</p>
<p>Mfg Perner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284770</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Mon, 14 May 2007 15:47:54 GMT</pubDate></item><item><title><![CDATA[Reply to Socket spinnt? (recv) on Mon, 14 May 2007 15:59:04 GMT]]></title><description><![CDATA[<p>Hi, die msdn schreibt dazu:</p>
<blockquote>
<p>If no error occurs, recv returns the number of bytes received. <strong>If the connection has been gracefully closed, the return value is zero.</strong> Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1284779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284779</guid><dc:creator><![CDATA[Fencer]]></dc:creator><pubDate>Mon, 14 May 2007 15:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to Socket spinnt? (recv) on Mon, 14 May 2007 16:04:57 GMT]]></title><description><![CDATA[<p>Alles klar thx. <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="🙂"
    /><br />
Das heißt also, ich darf jedesmal wenn recv den Wert 0 zurück gibt einen 0 Byte send machen? Oder ist das unsauber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284784</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Mon, 14 May 2007 16:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to Socket spinnt? (recv) on Mon, 14 May 2007 18:45:49 GMT]]></title><description><![CDATA[<p>Ich mach's jedenfalls so. Wer was besseres weiß bitte melden <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1284890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284890</guid><dc:creator><![CDATA[Fencer]]></dc:creator><pubDate>Mon, 14 May 2007 18:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Socket spinnt? (recv) on Mon, 14 May 2007 20:18:55 GMT]]></title><description><![CDATA[<p>Interessant wäre mal zu wissen, ob ein send mit 0 byte überhaupt losgeschickt wird. Wenn nicht, dann kann man genau sagen, dass wenn recv den Wert 0 zurückliefert, die Verbindung getrennt wurde.</p>
<p>Habe leider heute keine Zeit mehr, dass zu testen. Morgen probier ichs mal aus und berichte. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1284963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284963</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Mon, 14 May 2007 20:18:55 GMT</pubDate></item></channel></rss>