<?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[Problem mit send() und recv()]]></title><description><![CDATA[<p>Hi Leute,<br />
ich hab jetzt damit angefangen mich ein bischen in das Thema &quot;C + Netzwerk&quot; einzulesen.<br />
Ich hab dazu die Tutorials auf <a href="http://www.c-worker.ch" rel="nofollow">www.c-worker.ch</a> durchgelesen und probiert, klappt alles einwandfrei.</p>
<p>Jetzt bin ich auf die Idee gekommen mir einen kleinen &quot;File Server&quot; zu schreiben in der Konsole.</p>
<p>Soweit so gut. Server ist &quot;fertig&quot;</p>
<p>Hab jetzt auch angefangen mit dem Client.</p>
<p>Da tritt aber ein probelm auf</p>
<p>ist meine hauptteil meiner sende funktion vom server:</p>
<pre><code class="language-cpp">send(user, OK, strlen(OK), 0);

        while(ftell(file_to_send) != file_len)
        {

            read_from_file = fread(msg, 1, MAX_MSG_LEN, file_to_send);

            sended = send(user, msg, read_from_file, 0);

            while(read_from_file != sended)
            {
                sended += tmp;
                tmp = send(user, &amp;msg[sended], strlen(&amp;msg[sended]), 0);
            }
            tmp = 0;

        }
        send(user, END_OF_SEND, strlen(END_OF_SEND), 0);
</code></pre>
<p>ein teil meiner empfangs funktion:</p>
<pre><code class="language-cpp">result = recv(down_sock, msg, strlen(order), 0);

        if(result &gt; 0 &amp;&amp; strcmp(msg, OK) == 0)
        {

            while(result != 0 &amp;&amp; strcmp(msg, END_OF_SEND) != 0 )
            {

                result = recv(down_sock, msg, MAX_MSG_LEN, 0);

                if(file != NULL)
                    fwrite(msg, 1, result, file);

                else
                    fwrite(msg, 1, result, stdout);

            }
        }
</code></pre>
<p>Die 2 defines:</p>
<pre><code class="language-cpp">#define END_OF_SEND &quot;__END__&quot;
#define OK &quot;__OK__&quot;
</code></pre>
<p>Jetzt zum Problem:</p>
<p>alles klar Server sendet &quot;OK&quot;<br />
Client empfängt &quot;OK&quot;<br />
Server sendet die datei<br />
Client empfängt aber auf einmal (datei + &quot;END_OF_SEND&quot;)<br />
und somit ist der vergleich<br />
msg,END_OF_SEND nicht 0<br />
und er wartet nochmal das was gesendet wird</p>
<p>meine vermutung das ich recv() funktion vom client zu langsam ist!<br />
Aber kann das sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    />?</p>
<p>Danke schon im VoRrAuS<br />
Schönen abend noch</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197099/problem-mit-send-und-recv</link><generator>RSS for Node</generator><lastBuildDate>Sat, 02 May 2026 02:59:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197099.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Nov 2007 15:59:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit send() und recv() on Tue, 06 Nov 2007 15:59:04 GMT]]></title><description><![CDATA[<p>Hi Leute,<br />
ich hab jetzt damit angefangen mich ein bischen in das Thema &quot;C + Netzwerk&quot; einzulesen.<br />
Ich hab dazu die Tutorials auf <a href="http://www.c-worker.ch" rel="nofollow">www.c-worker.ch</a> durchgelesen und probiert, klappt alles einwandfrei.</p>
<p>Jetzt bin ich auf die Idee gekommen mir einen kleinen &quot;File Server&quot; zu schreiben in der Konsole.</p>
<p>Soweit so gut. Server ist &quot;fertig&quot;</p>
<p>Hab jetzt auch angefangen mit dem Client.</p>
<p>Da tritt aber ein probelm auf</p>
<p>ist meine hauptteil meiner sende funktion vom server:</p>
<pre><code class="language-cpp">send(user, OK, strlen(OK), 0);

        while(ftell(file_to_send) != file_len)
        {

            read_from_file = fread(msg, 1, MAX_MSG_LEN, file_to_send);

            sended = send(user, msg, read_from_file, 0);

            while(read_from_file != sended)
            {
                sended += tmp;
                tmp = send(user, &amp;msg[sended], strlen(&amp;msg[sended]), 0);
            }
            tmp = 0;

        }
        send(user, END_OF_SEND, strlen(END_OF_SEND), 0);
</code></pre>
<p>ein teil meiner empfangs funktion:</p>
<pre><code class="language-cpp">result = recv(down_sock, msg, strlen(order), 0);

        if(result &gt; 0 &amp;&amp; strcmp(msg, OK) == 0)
        {

            while(result != 0 &amp;&amp; strcmp(msg, END_OF_SEND) != 0 )
            {

                result = recv(down_sock, msg, MAX_MSG_LEN, 0);

                if(file != NULL)
                    fwrite(msg, 1, result, file);

                else
                    fwrite(msg, 1, result, stdout);

            }
        }
</code></pre>
<p>Die 2 defines:</p>
<pre><code class="language-cpp">#define END_OF_SEND &quot;__END__&quot;
#define OK &quot;__OK__&quot;
</code></pre>
<p>Jetzt zum Problem:</p>
<p>alles klar Server sendet &quot;OK&quot;<br />
Client empfängt &quot;OK&quot;<br />
Server sendet die datei<br />
Client empfängt aber auf einmal (datei + &quot;END_OF_SEND&quot;)<br />
und somit ist der vergleich<br />
msg,END_OF_SEND nicht 0<br />
und er wartet nochmal das was gesendet wird</p>
<p>meine vermutung das ich recv() funktion vom client zu langsam ist!<br />
Aber kann das sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    />?</p>
<p>Danke schon im VoRrAuS<br />
Schönen abend noch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398776</guid><dc:creator><![CDATA[Vorrübergehender Gast]]></dc:creator><pubDate>Tue, 06 Nov 2007 15:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit send() und recv() on Tue, 06 Nov 2007 16:09:55 GMT]]></title><description><![CDATA[<p>Doch das kann sein...</p>
<p>Eine Idee wäre, das du immer wieder recv() aufrufst und das ganze an einen String anhängst.<br />
Nach jedem aufruf von recv() durchsuchst du den String nach dem &quot;Ende&quot;-Zeichen.<br />
Alles bis zum &quot;Ende&quot;-Zeichen ist eine Nachricht.</p>
<p>Wenn der Server z.B. das hier sendet:</p>
<p>Message1<br />
Ende<br />
Message2<br />
Ende</p>
<p>kann es sein das der Client beim recv z.b. Das bekommt:<br />
Message1EndeMessage2</p>
<p>und beim nächsten aufruf dann nur Ende</p>
<p>Oder eben nur eine Teil der Nachricht beim ersten aufruf von recv() beim Client angekommen ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398782</guid><dc:creator><![CDATA[Der_Knob]]></dc:creator><pubDate>Tue, 06 Nov 2007 16:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit send() und recv() on Tue, 06 Nov 2007 21:41:16 GMT]]></title><description><![CDATA[<p>send() und recv() arbeiten nicht telegrammorientiert. Mit diesen Befehlen schreibst du nur in die betriebssysteminternen Puffer bzw. liest aus diesen Puffern. Das Betriebssystem kümmert sich dann darum, dass alles, was in diesem Puffer landet, beim Empfänger ankommt, und zwar in der richtigen Reihenfolge. Auf Paketgrößen, Geschwindigkeit usw. hast du als Anwender keinen Einfluß.</p>
<p>Für deine Zwecke mußt du jedes empfangene Paket prüfen, ob das Endekennzeichen darin enthalten ist, wobei das Endekennzeichen nicht am Anfang des Paketes stehen muß. Voraussetzung ist, deine Dateien enthalten niemals das Endekennzeichen selbst. Ansonsten mußt du dir ein anderes Protokoll ausdenken, z.B. ganz am Anfang die Dateigröße übertragen und auf der Empfangsseite dann die Anzahl der empfangenen Zeichen mitzählen.</p>
<p>Rob'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398919</guid><dc:creator><![CDATA[Rob&#x27;]]></dc:creator><pubDate>Tue, 06 Nov 2007 21:41:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit send() und recv() on Wed, 07 Nov 2007 12:46:08 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht wieso das immer zu solcher Verwirrung führt. Bei einer Datei erwartet ja auch keiner dass er bei Read genau eine &quot;Message&quot; zurückbekommt die als ganzes mittels Write geschrieben wurde.</p>
<p>Liegt vielleicht an den etwas unglücklich gewählten Regeln für blocking IO bei Sockets (=dass nicht immer soviel gelesen wird wie man angibt sonder min. 1 Byte bis max. das was man angegeben hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399014</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 07 Nov 2007 12:46:08 GMT</pubDate></item></channel></rss>