<?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[Dateien per Sockets versenden]]></title><description><![CDATA[<p>Ich habe einen Client und einen Server geschrieben, die sich auch Problemlos Texte zuschicken können. Nun möchte ich aber Dateien versenden, die länger sind, als mein Puffer:</p>
<p>#define BUFFER_SIZE 4096</p>
<p>Dazu muss man ja eine Schleife benutzen. Wie genau schaut diese aus?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275534/dateien-per-sockets-versenden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 23:23:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275534.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Oct 2010 12:19:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 12:19:35 GMT]]></title><description><![CDATA[<p>Ich habe einen Client und einen Server geschrieben, die sich auch Problemlos Texte zuschicken können. Nun möchte ich aber Dateien versenden, die länger sind, als mein Puffer:</p>
<p>#define BUFFER_SIZE 4096</p>
<p>Dazu muss man ja eine Schleife benutzen. Wie genau schaut diese aus?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966396</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 12:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 12:34:23 GMT]]></title><description><![CDATA[<p>Ich dachte mir das ja so, dass send() und recv() einfach doppelt aufgerufen werden müssen, wenn dei Datei in meinem Fall z.B. 8000 Byte groß ist. So habe ich es dann auch versucht, mein Programm ist dann aber leider abgestürzt <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/1966397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966397</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 12:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 14:53:50 GMT]]></title><description><![CDATA[<p>Dann mach es eben so, dass es nicht abstürzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966433</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 16 Oct 2010 14:53:50 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:01:15 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Dann mach es eben so, dass es nicht abstürzt.</p>
</blockquote>
<p>Und wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966436</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:05:59 GMT]]></title><description><![CDATA[<p>Schau mal <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-274922-and-start-is-40.html" rel="nofollow">hier</a>. Ist aus dem WINAPI-Forum und sollte funktionieren.</p>
<p>Edit: Die Senderoutine steht unten richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966438</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:05:59 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:42:29 GMT]]></title><description><![CDATA[<p>Vicious Falcon schrieb:</p>
<blockquote>
<p>Schau mal <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-274922-and-start-is-40.html" rel="nofollow">hier</a>. Ist aus dem WINAPI-Forum und sollte funktionieren.</p>
<p>Edit: Die Senderoutine steht unten richtig.</p>
</blockquote>
<p>Ich habe die beiden Routinen übernommen. Meine Frage war aber, wie eine Sendeschleife aussehen muss, falls die Datei größer als der Puffer ist... Und wie teile ich recv() am besten mit, wir groß die zu schickende Datei ist?<br />
(Ein send() vorweg?)</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966448</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:42:29 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:47:52 GMT]]></title><description><![CDATA[<p>HELPVISTAWIN7 schrieb:</p>
<blockquote>
<p>Ich habe die beiden Routinen übernommen. Meine Frage war aber, wie eine Sendeschleife aussehen muss, falls die Datei größer als der Puffer ist... Und wie teile ich recv() am besten mit, wir groß die zu schickende Datei ist?<br />
(Ein send() vorweg?)</p>
</blockquote>
<p>1. Was für ein Puffer beim Senden?<br />
2. Indem du die Größe vorwegschickst.</p>
<p>EDIT:<br />
So geht man damit um, dass <code>send</code> nicht alles auf einmal sendet:</p>
<pre><code class="language-cpp">bool send_all(int s, const char *data, size_t size)
{
	size_t sent = 0;

	while (sent &lt; size)
	{
		const int rc = send(s, data + sent, size - sent);
		if (rc &gt; 0)
		{
			sent += rc;
		}
		else
		{
			return false;
		}
	}

	return true;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966451</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:47:52 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:46:51 GMT]]></title><description><![CDATA[<p>Bei recv() scheint die Schleife ja zu funktionieren...</p>
<p>Ich benutze immer</p>
<p>#define BUF_SIZ 4096</p>
<p>als Puffergröße für recv() und für send(). Ist da vlt. schon der Fehler? Ich habe gelesen, dass Sockets eine bestimmte Puffergröße nicht mehr &quot;vertragen&quot;. Wenn die zu übertragende Datei also z.B. 2 GB groß ist.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966452</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:52:22 GMT]]></title><description><![CDATA[<p>Du sendest die ersten 4096 Bytes, dann die restlichen 3904 Bytes - sollte aber eigentlich offensichtlich sein.<br />
Empfangen läuft sowieso immer nach dem gleichen Schema ab: du empfängst solange, bis die Verbindung beendet wird bzw. die gesamte Datei empfangen ist.</p>
<blockquote>
<p>Wenn die zu übertragende Datei also z.B. 2 GB groß ist.</p>
</blockquote>
<p>4096 Bytes &lt; 2 GB. Und zwar deutlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966454</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:51:50 GMT]]></title><description><![CDATA[<p>Du kannst doch per ReadFile immer bspw. 4096 Bytes lesen und an die Send-Methode übergeben.<br />
ReadFile verrät dir geschickterweise auch noch, wie viele Bytes tatsächlich eingelesen wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966455</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:52:07 GMT]]></title><description><![CDATA[<p>@ TyRoXx:<br />
Aaah, danke. Und wie sieht die entsprechende recv() Routine dazu aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966456</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:53:27 GMT]]></title><description><![CDATA[<p>Ich habe es nicht getestet und es ist plattformabhängig, aber folgender Code sollte eine mögliche Lösung darstellen:</p>
<pre><code class="language-cpp">//siehe einige Posts weiter oben für send_all

bool send_file(int s, const char *data, size_t size)
{
	return
		send_all(s, reinterpret_cast&lt;const char *&gt;(&amp;size), sizeof(size)) &amp;&amp;
		send_all(s, data, size);
}

bool receive_all(int s, char *data, size_t size)
{
	size_t received = 0;
	while (received &lt; size)
	{
		const int rc = recv(s, data + received, size - received);
		if (rc &gt;= 0)
		{
			received += rc;
		}
		else
		{
			return false;
		}
	}

	return true;
}

bool receive_file(int s, std::vector&lt;char&gt; &amp;data)
{
	size_t fileLength;
	if (!receive_all(s, reinterpret_cast&lt;char *&gt;(&amp;fileLength), sizeof(fileLength)))
	{
		return false;
	}

	if (fileLength == 0)
		return true;

	data.resize(fileLength);
	return receive_all(s, &amp;data[0], data.size());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966457</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:53:55 GMT]]></title><description><![CDATA[<p>Vicious Falcon schrieb:</p>
<blockquote>
<p>Du kannst doch per ReadFile immer bspw. 4096 Bytes lesen und an die Send-Methode übergeben.<br />
ReadFile verrät dir geschickterweise auch noch, wie viele Bytes tatsächlich eingelesen wurden.</p>
</blockquote>
<p>Ich benutze dafür fstream. Daher war mir das nicht bekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966458</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:53:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dateien per Sockets versenden on Sat, 16 Oct 2010 15:57:26 GMT]]></title><description><![CDATA[<p>Danke für eure Hilfe.</p>
<p>Es hat geklappt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966460</guid><dc:creator><![CDATA[HELPVISTAWIN7]]></dc:creator><pubDate>Sat, 16 Oct 2010 15:57:26 GMT</pubDate></item></channel></rss>