<?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() empfängt nicht alles]]></title><description><![CDATA[<p>Hallo Leute<br />
Ich schreib mir gerade einen Server und stehe gerade vor dem Problem das wenn der Client eine Zeichenkette von unbekannter Länge sendet, wie kann ich dann mit meinem Server diese Zeichenkette empfangen? Ich will natürlich nicht das Puffer von recv auf 5 millionen schrauben...<br />
ich habs so versucht:</p>
<pre><code>char msg[20];
	msg[0] ='\0';
	int rc;
	while((rc = recv(client, msg, sizeof(msg)-1, 0)) &gt;0 ){
		msg[rc] ='\0';
		cout &lt;&lt; msg;
	}
</code></pre>
<p>das wird zwar anstandslos compiliert aber sobald ich es ausführe bring mir vista das es &quot;nicht mehr funktioniert...&quot; an was liegt das?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254596/recv-empfängt-nicht-alles</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 18:18:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254596.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Nov 2009 16:02:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 16:02:47 GMT]]></title><description><![CDATA[<p>Hallo Leute<br />
Ich schreib mir gerade einen Server und stehe gerade vor dem Problem das wenn der Client eine Zeichenkette von unbekannter Länge sendet, wie kann ich dann mit meinem Server diese Zeichenkette empfangen? Ich will natürlich nicht das Puffer von recv auf 5 millionen schrauben...<br />
ich habs so versucht:</p>
<pre><code>char msg[20];
	msg[0] ='\0';
	int rc;
	while((rc = recv(client, msg, sizeof(msg)-1, 0)) &gt;0 ){
		msg[rc] ='\0';
		cout &lt;&lt; msg;
	}
</code></pre>
<p>das wird zwar anstandslos compiliert aber sobald ich es ausführe bring mir vista das es &quot;nicht mehr funktioniert...&quot; an was liegt das?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1809980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1809980</guid><dc:creator><![CDATA[netzwerk]]></dc:creator><pubDate>Wed, 18 Nov 2009 16:02:47 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 17:08:27 GMT]]></title><description><![CDATA[<p>Es ist immer dasselbe...</p>
<p>recv(..) kann &quot;immer&quot; zurückkehren... nach 1 Byte, nach 20 Bytes, ...</p>
<p>Du brauchst eine Schleife und musst recv solange aufrufe, bis alles da ist was Du benötigst oder ein Fehler verursacht wurde... (rc == -1).</p>
<p>Dann musst Du z.B. erst die Länge des Strings senden (z.B. int, 4 Bytes), auf der Gegenseite empfängst Du die Länge und empfängst danach soviele Bytes wie eben vorher übermittelt wurden.</p>
<p>Oder Du machst ein Start / Stop Pattern...</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810008</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 18 Nov 2009 17:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 19:25:49 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Es ist immer dasselbe...</p>
</blockquote>
<p>Jopp.</p>
<p>Natürlich würde Doku lesen + Gehirn einschalten vollkommen ausreichen, es zu verstehen. Aber wenn ich sehe wie oft das falsch gemacht/verstanden wird, denke ich mir, ... die Semantik von recv ist nicht praxisgerecht.</p>
<p>Default = alles empfangen, mit derzeitigem Verhalten per Flag (&quot;ALLOW_PARTIAL&quot; oder so) auswählbar wäre vermutlich besser gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810087</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 18 Nov 2009 19:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 19:33:49 GMT]]></title><description><![CDATA[<p>ja...</p>
<p>boost::asio könnte das z.B.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810100</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 18 Nov 2009 19:33:49 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 20:15:54 GMT]]></title><description><![CDATA[<p>aber er nutzt doch ne schleife Oo</p>
<pre><code class="language-cpp">char msg[20]; 
  msg[0] ='\0'; 
  int rc; 
  while((rc = recv(client, msg, sizeof(msg)-1, 0)) &gt;0 )
  { 
    msg[rc] ='\0'; 
    cout &lt;&lt; msg; 
  }
</code></pre>
<p>kA, wieso hier iwas nicht gehen sollte...<br />
ich würds aber so machen:</p>
<pre><code class="language-cpp">char msg[20]; 
  int rc; 
  while((rc = recv(client, msg, sizeof(msg), 0)) &gt;0 )
  {
    cout &lt;&lt; msg.write(msg, msg+rc);
  }
</code></pre>
<p>das hier hab ich noch in meinem test-cpp-projekt gefunden, da hatte ma jmd nen http-socket bauen wollen und mir war langweilig <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=";D"
      alt="😉"
    /><br />
vll bringts dir ja was^^</p>
<pre><code class="language-cpp">namespace sockets
{
	class http
	{
	private:
		SOCKET sock;

		static std::size_t counter;
		enum { BUF_LEN = 1024 };

		void connect(const std::string &amp;ip)
		{
			SOCKADDR_IN sin;
			sin.sin_family = AF_INET;
			sin.sin_addr.s_addr = inet_addr(ip.c_str());
			sin.sin_port = htons(80);

			int error_code = ::connect(sock, (SOCKADDR *)&amp;sin, sizeof(sin));
			if(error_code == SOCKET_ERROR)
			{
				throw std::runtime_error(&quot;Cannot connect to &quot; + ip);
			}
		}
	public:
		http()
		:	sock(INVALID_SOCKET)
		{
			if(counter++ == 0)
			{
				WSADATA WSAdata;
				WSAStartup(MAKEWORD(2,0), &amp;WSAdata);
			}

			sock = socket(AF_INET, SOCK_STREAM, 0);
			if(sock == INVALID_SOCKET)
			{
				throw std::runtime_error(&quot;Cannot create socket&quot;);
			}
		}

		~http()
		{
		    closesocket(sock);

			if(--counter &gt; 0)
				return;

			WSACleanup();
		}

		void send(const std::string &amp;ip, const std::string &amp;request)
		{
			connect(ip);

			int len;
			for(std::string::size_type sent = 0, tosend(request.size()); sent != tosend; sent += len)
			{

				len = ::send(sock, request.c_str()+sent, tosend-sent+1, 0);
				if(len == SOCKET_ERROR)
				{
					throw std::runtime_error(&quot;Cannot send request&quot;);
				}
			}
		}

		std::string recv()
		{
			char buf[BUF_LEN];

			std::string R;
			for( ;; )
			{
				const int length = ::recv(sock, &amp;buf[0], BUF_LEN, 0);

				if(length == 0)
				{//	hier ist auch ne andere behandlung denkbar
					throw std::runtime_error(&quot;Connection closed&quot;);
				}
				else if(length == SOCKET_ERROR)
				{
					if(GetLastError() == WSAEMSGSIZE)
					{
						R.append(&amp;buf[0], &amp;buf[BUF_LEN]);
						continue;
					}

				//	hier evtl noch auf unterschiedliche errorcodes unterschiedlich reagieren...
					throw std::runtime_error(&quot;failure at receive&quot;);
				}
				else
				{
					R.append(&amp;buf[0], &amp;buf[length]);
					break;
				}
			}

			return R;
		}
	};

	std::size_t http::counter = 0;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810131</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 18 Nov 2009 20:15:54 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 20:30:33 GMT]]></title><description><![CDATA[<p>...ich habe schlecht gelesen...<br />
simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810146</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 18 Nov 2009 20:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 20:32:00 GMT]]></title><description><![CDATA[<p>also ich habs jetzt...<br />
die schleife war schon richtig! aber ich hab dann folgendes geschrieben:</p>
<pre><code>WSADATA lpwsadata;
	WSAStartup(MAKEWORD(2,0), &amp;lpwsadata);
</code></pre>
<p>und nicht mehr :</p>
<pre><code>LPWSADATA lpwsadata;
	WSAStartup(MAKEWORD(2,0), lpwsadata);
</code></pre>
<p>Weis auch nicht was da der Unterschied ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810148</guid><dc:creator><![CDATA[netzwerk]]></dc:creator><pubDate>Wed, 18 Nov 2009 20:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 20:42:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">LPWSADATA lpwsadata; 
WSAStartup(MAKEWORD(2,0), lpwsadata);
</code></pre>
<p>erzeugt imho UB.<br />
<a href="http://msdn.microsoft.com/en-us/library/ms741563(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms741563(VS.85).aspx</a><br />
ist also nur nen typedef auf nen Pointer auf WSADATA.<br />
Damit zeigt er nur irgendwo hin und beim lesen/schreiben darauf... bäm...</p>
<p>bb</p>
<p>edit: ich seh gerade, dass mein iwann aus langer weile mal geschriebener quellcode im regelfall auch nur einmal recv aufruft xD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810156</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 18 Nov 2009 20:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 21:04:25 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>imho UB.</p>
</blockquote>
<p>limoblub?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810164</guid><dc:creator><![CDATA[enginemotor]]></dc:creator><pubDate>Wed, 18 Nov 2009 21:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 21:06:58 GMT]]></title><description><![CDATA[<p>undefined behaviour</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810167</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 18 Nov 2009 21:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to recv() empfängt nicht alles on Wed, 18 Nov 2009 21:07:05 GMT]]></title><description><![CDATA[<p>UB = undefined behaviour...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810168</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 18 Nov 2009 21:07:05 GMT</pubDate></item></channel></rss>