<?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[Fehler bei Datenübertagung (TCP&#x2F;IP)]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe ein Server/Client Programm, Server in Java, Client in C.</p>
<p>Die Kommunikation klappt wunderbar, bis auf ein Problem bei der Datenübertragung.</p>
<p>Sende ich z.b vom Server eine größere Datei (~3 MB) an den Client, werden nicht alle Daten empfangen, und der client hängt in der recv() Funktion. Dieser Fehler tritt aber nicht immer auf !! Für Testzwecke habe ich auch 40 MB gesendet, manchmal kommen alle Daten an, manchmal nicht.</p>
<p>Kann es sein das der Client in C nicht nachkommt mit dem Empfangen der Daten und so möglicherweise der internet Buffer fürs Empfangen von Daten überfüllt wird, und dabei Daten verloren gehen ??? Anders kann ich es mir nicht erklären, bei kleinen Daten funktioniert es wunderbar.</p>
<p>Das Prinzip ist auch ganz primitiv und einfach, in einer Endlosschleife wird die recv() Funktion aufgerufen, sobald diese das Char-array, in welches die recv() Funktion schreibt, nicht komplett füllt, wird die Schleifen verlassen.</p>
<p>Zusätzlich gibt es noch eine Abbruchbedingung, wenn nur 1 Byte empfangen wird, und dieser 0 ist, das ist notwending, falls die Dateigröße, die empfangen wird, genau ein Vielfaches der Char-array - größe ist, dann hängt der Sender einen 0-Byte an, ansonsten würde die recv()-Funktion wieder erneut aufgerufen.</p>
<p>Hier der Code vom Client (bei der recv() Funktion bleibt er hängen) :</p>
<pre><code class="language-cpp">for (;;) {

                    ivar = recv(socket_client,recvBuff,sizeof(recvBuff),0);

             /*Die Abbruchbedingung, wenn nur mehr ein 0 Byte gesendet worden ist*/
                    if(ivar == 1 &amp;&amp; recvBuff[0] == 0) {
                        fflush(file);
                        fclose(file);
                        break;
                    }

                    for (i = 0; i &lt; ivar; i++) {
                        fputc(recvBuff[i],file);
                    }

                 /*Die 2. Abbruchbedingung, falls der Buffer, in den die recv() Funktion schreibt, nicht vollständig gefüllt wird*/
                    if (ivar != RECV_BUF_MAX) {
                        fflush(file);
                        fclose(file);
                        break;
                    }

                }
</code></pre>
<p>Ich hoffe ihr könnt mir weiterhelfen, ich sitze schon 2 Tage an diesem Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208291/fehler-bei-datenübertagung-tcp-ip</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 03:57:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208291.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Mar 2008 10:39:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 10:39:52 GMT]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe ein Server/Client Programm, Server in Java, Client in C.</p>
<p>Die Kommunikation klappt wunderbar, bis auf ein Problem bei der Datenübertragung.</p>
<p>Sende ich z.b vom Server eine größere Datei (~3 MB) an den Client, werden nicht alle Daten empfangen, und der client hängt in der recv() Funktion. Dieser Fehler tritt aber nicht immer auf !! Für Testzwecke habe ich auch 40 MB gesendet, manchmal kommen alle Daten an, manchmal nicht.</p>
<p>Kann es sein das der Client in C nicht nachkommt mit dem Empfangen der Daten und so möglicherweise der internet Buffer fürs Empfangen von Daten überfüllt wird, und dabei Daten verloren gehen ??? Anders kann ich es mir nicht erklären, bei kleinen Daten funktioniert es wunderbar.</p>
<p>Das Prinzip ist auch ganz primitiv und einfach, in einer Endlosschleife wird die recv() Funktion aufgerufen, sobald diese das Char-array, in welches die recv() Funktion schreibt, nicht komplett füllt, wird die Schleifen verlassen.</p>
<p>Zusätzlich gibt es noch eine Abbruchbedingung, wenn nur 1 Byte empfangen wird, und dieser 0 ist, das ist notwending, falls die Dateigröße, die empfangen wird, genau ein Vielfaches der Char-array - größe ist, dann hängt der Sender einen 0-Byte an, ansonsten würde die recv()-Funktion wieder erneut aufgerufen.</p>
<p>Hier der Code vom Client (bei der recv() Funktion bleibt er hängen) :</p>
<pre><code class="language-cpp">for (;;) {

                    ivar = recv(socket_client,recvBuff,sizeof(recvBuff),0);

             /*Die Abbruchbedingung, wenn nur mehr ein 0 Byte gesendet worden ist*/
                    if(ivar == 1 &amp;&amp; recvBuff[0] == 0) {
                        fflush(file);
                        fclose(file);
                        break;
                    }

                    for (i = 0; i &lt; ivar; i++) {
                        fputc(recvBuff[i],file);
                    }

                 /*Die 2. Abbruchbedingung, falls der Buffer, in den die recv() Funktion schreibt, nicht vollständig gefüllt wird*/
                    if (ivar != RECV_BUF_MAX) {
                        fflush(file);
                        fclose(file);
                        break;
                    }

                }
</code></pre>
<p>Ich hoffe ihr könnt mir weiterhelfen, ich sitze schon 2 Tage an diesem Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475695</guid><dc:creator><![CDATA[,.,.,,.,.]]></dc:creator><pubDate>Mon, 17 Mar 2008 10:39:52 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 10:41:04 GMT]]></title><description><![CDATA[<p>statt &quot;internet Buffer&quot; meinte ich &quot;interne Buffer&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475698</guid><dc:creator><![CDATA[,.,.,.,.]]></dc:creator><pubDate>Mon, 17 Mar 2008 10:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 10:43:41 GMT]]></title><description><![CDATA[<p>Ich habe auch schon statt der fputc() Schleife versucht Blockweise die Daten in die File zu schreiben, falls jemand denkt, das diese Schleife zuviel Zeit kostet, daran liegt es nicht, glaube ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475699</guid><dc:creator><![CDATA[,.,.,.]]></dc:creator><pubDate>Mon, 17 Mar 2008 10:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 11:15:21 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<p>Es kann immer vorkommen (auch wenn Du 40MB sendest), dass ein Packet mit 1 Byte kommt (und wenn da dann noch 0 drinsteht.. adios...).</p>
<pre><code>if(ivar == 1 &amp;&amp; recvBuff[0] == 0) {
                        fflush(file);
                        fclose(file);
                        break;
                    }
</code></pre>
<p>Deshalb kannst Du das nicht als Abbruchkriterium nehmen.</p>
<ol start="2">
<li></li>
</ol>
<p>Wenn der return Wert von recv() 0 ist, dann wurde die Verbindung geschlossen.<br />
(Sollte mindestens darauf reagiert werden.)</p>
<ol start="3">
<li></li>
</ol>
<p>Wenn ich das korrekt interpretiere, gibt es keine Abbruchbedingung für das ende der Übertragung.<br />
(Du könntest z.B. zuerst die Länge übertragen...)</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475722</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Mon, 17 Mar 2008 11:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 11:27:16 GMT]]></title><description><![CDATA[<p>Wenn der Server RECV_BUF_MAX-Bytes sendet, ist nicht garantiert, daß sie beim Clienten als &quot;Ganzes&quot; ankommen.<br />
Durchaus möglich, daß der Client recv mehrmals aufrufen muß um auf RECV_BUF_MAX zu kommen.<br />
Aber dann springt er aus der Schleife wegen &quot;ivar != RECV_BUF_MAX&quot; und Bytes gehen verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475732</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 17 Mar 2008 11:27:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 11:34:50 GMT]]></title><description><![CDATA[<p>,.,.,,.,. schrieb:</p>
<blockquote>
<p>/*Die 2. Abbruchbedingung, falls der Buffer, in den die recv() Funktion schreibt, nicht vollständig gefüllt wird*/<br />
if (ivar != RECV_BUF_MAX) {<br />
fflush(file);<br />
fclose(file);<br />
break;<br />
}</p>
<p>}[/cpp]</p>
</blockquote>
<p>Hi !<br />
Die 2. Abbruchbedingung kannst du rausschmeissen. Niemand garantiert dir, das der Server immer RECV_BUF_MAX Byte in den Puffer schreibt.<br />
Ebenso kannst du überall das 'fflush(file)' rausschmeissen.</p>
<p>Anstatt mit fputc kannst du effektiver mit fwrite schreiben:</p>
<pre><code class="language-cpp">if ( ivar != fwrite( recvBuff, sizeof(char), ivar, file ))
{
// Fehlerbehandlung.
}
</code></pre>
<p>Der Erfolg der Übertragung hängt noch davon ab, wie du deine Ausgabedatei geöffnet hast, ob im Binär- oder Textmodus. Bei Windows zumindest musst du die Ausgabedatei mit fopen( ..., <strong>&quot;wb&quot;</strong> ) öffnen.<br />
<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/1475740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475740</guid><dc:creator><![CDATA[agga ugga]]></dc:creator><pubDate>Mon, 17 Mar 2008 11:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 11:49:32 GMT]]></title><description><![CDATA[<p>Danke, ich habe auch schon daran gedacht zuerst Informationen über die Größe etc. zu senden.</p>
<p>Was ich jedoch nicht gewusst habe ist, dass es auch möglich sein kann, das ein Packet mit einem einzigen 0 Byte gesendet wird ?!?!</p>
<p>Ich dachte es wird zuerst immer das Array gefüllt, mit 512 Byte, aber wenn das so ist, dann ist mir jetzt einiges klar. Bei *.txt Datein ging die Übertragung nämlich immer Reibungslos, das lag dann wohl daran, das es in Text-datein keine 0 Bytes gibt.</p>
<p>Zu deinen Punkt 3.</p>
<p>Die Abbruchbedingung habe ich so gewählt, dass wenn das Array nicht komplett gefüllt wird, abgebrochen wird, jetzt weiß ich aber auch das es Falsch ist, und zu Problemen führen kann.</p>
<p>Danke für deine Hilfe !!! <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="🙂"
    /> <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>
<p>Ich hoffe es klappt so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475752</guid><dc:creator><![CDATA[,.,..,.,.,]]></dc:creator><pubDate>Mon, 17 Mar 2008 11:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 11:54:38 GMT]]></title><description><![CDATA[<p>Sry die Antwort ober mir wurde erst jetzt abgeschickt.</p>
<p>Danke für die Hilfe !! Ich dachte bis jetzt immer das die Funktion recv() _immer_ den Buffer komplett befüllt.</p>
<p>Danke vielmals!! <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/1475756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475756</guid><dc:creator><![CDATA[,.,.,.,]]></dc:creator><pubDate>Mon, 17 Mar 2008 11:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler bei Datenübertagung (TCP&#x2F;IP) on Mon, 17 Mar 2008 12:35:17 GMT]]></title><description><![CDATA[<p>Hättest du mal die Dokumentation gelesen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475808</guid><dc:creator><![CDATA[pffffff]]></dc:creator><pubDate>Mon, 17 Mar 2008 12:35:17 GMT</pubDate></item></channel></rss>