<?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[Winsock : unbegrenzte datenmenge senden]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich habe mit winsock ein server- und ein clientproggie geschrieben, was soweit auch ganz gut klappt, nur wenn ich mehr daten versenden will als auf einmal möglich ist (also den rest in einer schleife nachsende) kommt auf der andern seite nicht mehr alles an. ich hab das mal in eine klasse verpackt und da beim versenden kleiner textnachrichten alles klappt denke ich, dass nur folgende zwei methoden wichtig sind:</p>
<pre><code class="language-cpp">bool Socket::send( const std::string&amp; s ) const 
{	
	int ret=0;
	std::string avail=s;
	std::ifstream is(avail.c_str());

	if(is.is_open())
	{
		std::getline(is, avail, static_cast&lt;char&gt;(EOF));
		is.close();
	}

	do
	{
		ret = ::send ( sock, avail.c_str(), avail.size(),  0 );		
		if ( ret == -1 ) 
			return false;

		avail.erase(0, ret);

	}while(ret&gt;0);

	return true;
}

int Socket::recv ( std::string&amp; s ) const 
{
	int ret=0;
	char buf [ MAXRECV + 1 ];
	s = &quot;&quot;;
	do
	{
		memset ( buf, 0, MAXRECV + 1 );
		ret = ::recv (sock, buf, MAXRECV, 0 );

		if ( ret == -1 )
		{
			throw std::runtime_error(&quot;Fehler beim Senden aufgetreten.&quot;);
			return ret;
		}
		else
		{
			s.append(buf);
		}

	}while(ret&gt;0);

	return s.size();
}
</code></pre>
<p>Es kommt genau soviel an wie wenn ichs ohne schleife mache. was mache ich da falsch? oder kann es sein dass die schleife zum senden/empfangen in die main-funktion sollte? ausserdem würde mich noch interessieren: wie verwende ich die getline-funktion korrekt, sodass alles auf einmal eingelesen wird (also schon noch bis EOF aber ich kann ja EOF (int) nicht so einfach nach char casten oder? ) ?</p>
<p>vielen dank schonmal im voraus <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/topic/180178/winsock-unbegrenzte-datenmenge-senden</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 16:24:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180178.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Apr 2007 19:43:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Winsock : unbegrenzte datenmenge senden on Sun, 29 Apr 2007 19:43:11 GMT]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich habe mit winsock ein server- und ein clientproggie geschrieben, was soweit auch ganz gut klappt, nur wenn ich mehr daten versenden will als auf einmal möglich ist (also den rest in einer schleife nachsende) kommt auf der andern seite nicht mehr alles an. ich hab das mal in eine klasse verpackt und da beim versenden kleiner textnachrichten alles klappt denke ich, dass nur folgende zwei methoden wichtig sind:</p>
<pre><code class="language-cpp">bool Socket::send( const std::string&amp; s ) const 
{	
	int ret=0;
	std::string avail=s;
	std::ifstream is(avail.c_str());

	if(is.is_open())
	{
		std::getline(is, avail, static_cast&lt;char&gt;(EOF));
		is.close();
	}

	do
	{
		ret = ::send ( sock, avail.c_str(), avail.size(),  0 );		
		if ( ret == -1 ) 
			return false;

		avail.erase(0, ret);

	}while(ret&gt;0);

	return true;
}

int Socket::recv ( std::string&amp; s ) const 
{
	int ret=0;
	char buf [ MAXRECV + 1 ];
	s = &quot;&quot;;
	do
	{
		memset ( buf, 0, MAXRECV + 1 );
		ret = ::recv (sock, buf, MAXRECV, 0 );

		if ( ret == -1 )
		{
			throw std::runtime_error(&quot;Fehler beim Senden aufgetreten.&quot;);
			return ret;
		}
		else
		{
			s.append(buf);
		}

	}while(ret&gt;0);

	return s.size();
}
</code></pre>
<p>Es kommt genau soviel an wie wenn ichs ohne schleife mache. was mache ich da falsch? oder kann es sein dass die schleife zum senden/empfangen in die main-funktion sollte? ausserdem würde mich noch interessieren: wie verwende ich die getline-funktion korrekt, sodass alles auf einmal eingelesen wird (also schon noch bis EOF aber ich kann ja EOF (int) nicht so einfach nach char casten oder? ) ?</p>
<p>vielen dank schonmal im voraus <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/1275890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1275890</guid><dc:creator><![CDATA[jimmy3]]></dc:creator><pubDate>Sun, 29 Apr 2007 19:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Winsock : unbegrenzte datenmenge senden on Mon, 30 Apr 2007 12:00:44 GMT]]></title><description><![CDATA[<p>weiss denn keiner wie man das richtig macht ?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276236</guid><dc:creator><![CDATA[jimmy3]]></dc:creator><pubDate>Mon, 30 Apr 2007 12:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Winsock : unbegrenzte datenmenge senden on Mon, 30 Apr 2007 16:07:50 GMT]]></title><description><![CDATA[<p>jimmy3 schrieb:</p>
<blockquote>
<p>weiss denn keiner wie man das richtig macht ?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Du musst mehrere male <em>recv</em> audführen, um alle Daten zu empfangen. Es muss außerdem nicht sein, dass alle Daten die du mit einem <em>send</em> abgeschickt hast auch mit einem <em>recv</em> ankommen. Es kann sein, dass du mehrere <em>recv</em> brauchst. Es kann auch sein, dass du mit einem <em>recv</em> Daten, die du mit mehreren <em>send</em>s geschickt hast, empfängst.</p>
<p>Du musst also in einer Schleife empfangen und die Daten wieder auseinanderpflücken, so wie du sie haben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276441</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 30 Apr 2007 16:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to Winsock : unbegrenzte datenmenge senden on Mon, 30 Apr 2007 16:11:45 GMT]]></title><description><![CDATA[<p>Er hat eine Schleife...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276443</guid><dc:creator><![CDATA[do while]]></dc:creator><pubDate>Mon, 30 Apr 2007 16:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to Winsock : unbegrenzte datenmenge senden on Mon, 30 Apr 2007 16:28:40 GMT]]></title><description><![CDATA[<p>do while schrieb:</p>
<blockquote>
<p>Er hat eine Schleife...</p>
</blockquote>
<p>Vielleicht Asynchrone Sockets?</p>
<p>Er sollte mal mit einem Debugger durch das Programm gehen und schauen, ob die Nachricht nur nicht so gespeichert wird, wie er das möchte und desswegen nicht angezeigt wird, weil er zum Beispiel die NULL mit sendet oder so, oder ob es wirklich am <em>recv</em> liegt.</p>
<p>Ich sehe an der Stelle keinen Fehler. Würd mal tippen, der liegt woanders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276454</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 30 Apr 2007 16:28:40 GMT</pubDate></item></channel></rss>