<?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[Socketproblem: recv()]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>habe eine Klasse netsocket geschrieben, u.a. mit der Funktion Receive. Hier habe ich folgendes beim Debuggen festgestellt. Reist die Verbindung kurz vor dem &quot;empfangen = ::recv(...&quot; ab, so hängt sich das Programm auf. Das heißt, der Debugger beendet diese Zeile nicht.<br />
Wenn ich aber die Dokumentation richtig verstanden habe, so müsste doch aber die Funktion recv() eine 0 zurückliefern, wenn diese ein Problem hat, aber sich doch nicht totwarten.</p>
<p>Wie bekomme ich das Problem gelöst?</p>
<p>Gibt es evtl. eine komplett fertige Socketklasse, welche fehlerresistent und frei verwendbar ist?</p>
<pre><code class="language-cpp">bool netsocket::Receive(string&amp; s) const
{	char buf [MAXRECV + 1];
	int empfangen;
	try
	{	s = &quot;&quot;;
		memset (buf, 0, MAXRECV + 1);
		empfangen = ::recv(m_sock, buf, MAXRECV, 0);
		if (empfangen &gt; 0 || empfangen != SOCKET_ERROR)
		{	s = (string)buf;
			return true;
		}
	}
	catch (...)
	{	return false;
	}
	return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/206279/socketproblem-recv</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 01:06:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206279.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Feb 2008 07:30:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Socketproblem: recv() on Sat, 23 Feb 2008 07:30:48 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>habe eine Klasse netsocket geschrieben, u.a. mit der Funktion Receive. Hier habe ich folgendes beim Debuggen festgestellt. Reist die Verbindung kurz vor dem &quot;empfangen = ::recv(...&quot; ab, so hängt sich das Programm auf. Das heißt, der Debugger beendet diese Zeile nicht.<br />
Wenn ich aber die Dokumentation richtig verstanden habe, so müsste doch aber die Funktion recv() eine 0 zurückliefern, wenn diese ein Problem hat, aber sich doch nicht totwarten.</p>
<p>Wie bekomme ich das Problem gelöst?</p>
<p>Gibt es evtl. eine komplett fertige Socketklasse, welche fehlerresistent und frei verwendbar ist?</p>
<pre><code class="language-cpp">bool netsocket::Receive(string&amp; s) const
{	char buf [MAXRECV + 1];
	int empfangen;
	try
	{	s = &quot;&quot;;
		memset (buf, 0, MAXRECV + 1);
		empfangen = ::recv(m_sock, buf, MAXRECV, 0);
		if (empfangen &gt; 0 || empfangen != SOCKET_ERROR)
		{	s = (string)buf;
			return true;
		}
	}
	catch (...)
	{	return false;
	}
	return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1461310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461310</guid><dc:creator><![CDATA[inu]]></dc:creator><pubDate>Sat, 23 Feb 2008 07:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Sat, 23 Feb 2008 08:51:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Benutze die Forensuche für die Suche nach einer Socket Klasse oder einer Networking Library. Es wimmelt von einträgen, wo regelemässig alle brauchbaren Libraries aufgelistet werden.</p>
<p>Ich würde sagen, hier muss es &amp;&amp; heissen.</p>
<pre><code class="language-cpp">if (empfangen &gt; 0 &amp;&amp; empfangen != SOCKET_ERROR) 
        {
            //s = (string)buf; // ich würde den CTOR bevorzugen.
            s = string(buf);
            return true; 
        }
</code></pre>
<p>Zudem kann es sein, dass Du zuerst die hälfte des Strings empfängst und beim zweiten Aufruf von recv erst die zweite hälfte...</p>
<p>Wenn SOCKET_ERROR zurückgegeben wird kannst Du mir WSAGetLastError den genauen Fehler feststellen.</p>
<blockquote>
<p>Wenn ich aber die Dokumentation richtig verstanden habe, so müsste doch aber die Funktion recv() eine 0 zurückliefern, wenn diese ein Problem hat, aber sich doch nicht totwarten.</p>
</blockquote>
<p>Gilt nur bei Verbindungsorientierten sockets (sprich TCP/IP).</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461323</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sat, 23 Feb 2008 08:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Sat, 23 Feb 2008 13:55:15 GMT]]></title><description><![CDATA[<p>Hallo simon.gysi,</p>
<p>ich versuche eine POP3-Schnittstelle zu schreiben. Du hast selbstverständlich recht, dass recv() nicht unbedingt alle Daten empfängt (pufferabhängig), so dass ggf. mehrere recv()-Vorgänge notwendig sind. Dies habe ich schon berücksichtigt.</p>
<p>A-Bär: Das Problem ist jedoch, dass er unter bestimmten Bedingungen nicht bis zur Zeile</p>
<pre><code class="language-cpp">if (empfangen &gt; 0 &amp;&amp; empfangen != SOCKET_ERROR)
</code></pre>
<p>vordringt, sondern schon eine Zeile vorher bei</p>
<pre><code class="language-cpp">empfangen = ::recv(m_sock, buf, MAXRECV, 0);
</code></pre>
<p>nicht weitermacht. Das heißt, mein Debugger bekommt keine Rückmeldung - das Programm scheint bei diesem Befehl stehenzubleiben, ohne dass überhaupt eine Chance habe ggf. kurz danach mit WSAGetLastError Fehler abzufragen...</p>
<p>Nachtrag: Noch eine kleine Ungereimtheit habe ich bei POP3 festgestellt. Sende ich den LIST-Befehl, so erhalte ich eine Liste alle verfügbaren Mails einschließlich Grüßenangabe. Jedoch weicht diese Angabe von dem tatsächlich empfangenen Bytes um ca. 100 Byte ab. Das heißt, ich empfange 100 Byte mehr als per Auskunft über LIST. Werden bei LIST evtl. irgendwelche Steuerzeichen nicht mit berücksichtigt? Oder wie oder was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461493</guid><dc:creator><![CDATA[inu]]></dc:creator><pubDate>Sat, 23 Feb 2008 13:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Mon, 25 Feb 2008 11:06:57 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p><a href="http://msdn2.microsoft.com/en-us/library/ms740121.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740121.aspx</a></p>
<p>Aus MSDN:</p>
<blockquote>
<p>If no incoming data is available at the socket, the recv call blocks and waits for data to arrive according to the blocking rules defined for WSARecv with the MSG_PARTIAL flag not set unless the socket is nonblocking. In this case, a value of SOCKET_ERROR is returned with the error code set to WSAEWOULDBLOCK. The select, WSAAsyncSelect, or WSAEventSelect functions can be used to determine when more data arrives.</p>
</blockquote>
<p>Somit würde ich vermuten das es versucht weiter Daten zu empfangen da aber nichts ansteht und die Verbindung aber noch aufrecht bleibt(sprich: Server beendet die Verbindung nicht was auch Sinn macht da du ja z.B. nach dem du die größe der n'ten Mail mit LIST (n) holste dies dan vielleicht runterladen willst und wennste da jedes mal wieder ne neue Verbindung aufbauen müsstest wärs ja a schmarn <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="😉"
    /> ) ist die Funktion einfach noch im &quot;blocking mode&quot;.</p>
<p>Wenn du jetzt mit Fenstern abreitest und keine Konsolenprogramm schreibst würde ich dir mir die WSAAsyncSelect <a href="http://msdn2.microsoft.com/en-us/library/ms741540.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms741540.aspx</a> Funktion empfehlen</p>
<p>Ich hoff ich konnte dir helfen<br />
Mfg PinguGroup</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1462352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1462352</guid><dc:creator><![CDATA[PinguGroup]]></dc:creator><pubDate>Mon, 25 Feb 2008 11:06:57 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Wed, 27 Feb 2008 09:38:11 GMT]]></title><description><![CDATA[<p>das Probem ist aber, dass es eine Konsolenanwendung sein muss (Zusatztask zu einer Serveranwendung). Und genau hierfür suche ich eine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1463800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1463800</guid><dc:creator><![CDATA[inu]]></dc:creator><pubDate>Wed, 27 Feb 2008 09:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Wed, 27 Feb 2008 16:41:22 GMT]]></title><description><![CDATA[<p>Hi<br />
dan musste halt dafür sorgen daste die recv() Funktion nur dann aufrufts wenn auch wirklich was anstehen.</p>
<blockquote>
<p>Zudem kann es sein, dass Du zuerst die hälfte des Strings empfängst und beim zweiten Aufruf von recv erst die zweite hälfte</p>
</blockquote>
<blockquote>
<p>Du hast selbstverständlich recht, dass recv() nicht unbedingt alle Daten empfängt (pufferabhängig), so dass ggf. mehrere recv()-Vorgänge notwendig sind.</p>
</blockquote>
<p>Weiss ned obste das richtig verstanden hast hier mal ein Beispiel:<br />
[ohne Gewähr]<br />
du rufst recv auf und übergibst ein puffer der größe 100<br />
des stehen 50bytes am socket an<br />
recv liest aber nur 25 in dein buffer<br />
somit musste recv nochmal aufrufen um den rest zu &quot;holen&quot;</p>
<p>ist also nicht pufferabhängig<br />
[/ohne Gewähr]</p>
<p>Wenn das nicht stimmt berichtigt mich.</p>
<p>MFG PinguGroup</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464183</guid><dc:creator><![CDATA[PinguGroup]]></dc:creator><pubDate>Wed, 27 Feb 2008 16:41:22 GMT</pubDate></item><item><title><![CDATA[Reply to Socketproblem: recv() on Thu, 28 Feb 2008 10:24:54 GMT]]></title><description><![CDATA[<p>@PinguGroup:</p>
<blockquote>
<p>ist also nicht pufferabhängig</p>
</blockquote>
<p>Korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1464599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1464599</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 28 Feb 2008 10:24:54 GMT</pubDate></item></channel></rss>