<?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[Funktionsweise von send() und recv()]]></title><description><![CDATA[<p>Hi Leute,<br />
ich hab ja schon mal ne fragen wegen den 2 Funktionen gestellt hab aber jetzt nochmal ein Problem:</p>
<p>Verbunden --&gt; OK!<br />
Client schickt mit send() 1. msg --&gt; OK alle bytes übertragen<br />
Server empfängt --&gt; OK richtig empfangen<br />
Client schick noch 2. und 3. msg mit send() --&gt; OK<br />
Da bei der 1. msg drin stand wieviel bytes jetzt empfangen werden sollen empfängt der Server nur &quot;x&quot; bytes --&gt; OK<br />
Server wertet das empfangene aus --&gt; OK<br />
Server will das nächste (sprich 3. msg) empfangen was Client geschickt hat --&gt; recv() empfängt nichts</p>
<p>Meine Vermutung:</p>
<p>Wenn ich via send() Daten schick warten die beim Empfänger nicht bis der sie &quot;abholt&quot; oder die Verbindung geschlossen wir sonder halt nur ein paar Millisekunden!</p>
<p>Kann das sein??</p>
<p>Weil meine Konzept wäre jetzt so:</p>
<p>-Server - Client verbunden.<br />
-Client schickt &quot;header&quot; mit größe des nächsten Packets und was er machen will z.B. File downloaden<br />
-Server wertet header aus und empfängt x bytes der z.B. den Dateiname beinhalten --&gt; dauert ja ein bischen<br />
-derweil schickt der Client schon das nächste Packet<br />
-Server will was empfangen kommt aber nichts obwohl der Client was gesendet hat laut return value</p>
<p>Muss sagen ich weiss ned ob das ganz so rüber kommt wie ich das meine aber ich kann meine Problem ned besser erläutern <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>
<p>MFG Ich</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197856/funktionsweise-von-send-und-recv</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 13:54:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197856.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Nov 2007 14:10:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsweise von send() und recv() on Thu, 15 Nov 2007 14:10:21 GMT]]></title><description><![CDATA[<p>Hi Leute,<br />
ich hab ja schon mal ne fragen wegen den 2 Funktionen gestellt hab aber jetzt nochmal ein Problem:</p>
<p>Verbunden --&gt; OK!<br />
Client schickt mit send() 1. msg --&gt; OK alle bytes übertragen<br />
Server empfängt --&gt; OK richtig empfangen<br />
Client schick noch 2. und 3. msg mit send() --&gt; OK<br />
Da bei der 1. msg drin stand wieviel bytes jetzt empfangen werden sollen empfängt der Server nur &quot;x&quot; bytes --&gt; OK<br />
Server wertet das empfangene aus --&gt; OK<br />
Server will das nächste (sprich 3. msg) empfangen was Client geschickt hat --&gt; recv() empfängt nichts</p>
<p>Meine Vermutung:</p>
<p>Wenn ich via send() Daten schick warten die beim Empfänger nicht bis der sie &quot;abholt&quot; oder die Verbindung geschlossen wir sonder halt nur ein paar Millisekunden!</p>
<p>Kann das sein??</p>
<p>Weil meine Konzept wäre jetzt so:</p>
<p>-Server - Client verbunden.<br />
-Client schickt &quot;header&quot; mit größe des nächsten Packets und was er machen will z.B. File downloaden<br />
-Server wertet header aus und empfängt x bytes der z.B. den Dateiname beinhalten --&gt; dauert ja ein bischen<br />
-derweil schickt der Client schon das nächste Packet<br />
-Server will was empfangen kommt aber nichts obwohl der Client was gesendet hat laut return value</p>
<p>Muss sagen ich weiss ned ob das ganz so rüber kommt wie ich das meine aber ich kann meine Problem ned besser erläutern <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>
<p>MFG Ich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1403680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1403680</guid><dc:creator><![CDATA[Vorübergehender Gast]]></dc:creator><pubDate>Thu, 15 Nov 2007 14:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsweise von send() und recv() on Thu, 15 Nov 2007 21:30:56 GMT]]></title><description><![CDATA[<p>Ich weiß nicht, was du mit &quot;msg&quot; und &quot;Packet&quot; meinst. Noch mal im Klartext: Das Schreiben von z.B. 1000 Bytes auf der Sendeseite mit einem Aufruf von send() heißt noch lange nicht, dass du mit einem einzigen!!! recv() auf der Empfangsseite wieder die 1000 Bytes auslesen kannst. Es ist durchaus wahrscheinlich, dass recv() mehrfach aufgerufen werden muß, bis du deine 1000 Bytes wieder zusammen hast.</p>
<p>Auf der Empfangsseite solltest du einen ausreichend großen Puffer bereitstellen und darin alle empfangenen Zeichen sammeln. Dazu rufst du recv() in einer Schleife auf und übergibst dabei als Pufferadresse die Adresse hinter dem letzten empfangenen Zeichen und als Größe den noch verfügbaren Platz im Puffer. Nach jedem Empfang wertest du den Puffer aus, z.B. so: Anzahl empfangener Zeichen größer als Headergröße? Wenn ja, dann Header auswerten, sonst auf weitere Zeichen warten. Wenn der Header ausgewertet werden konnte, alle Zeichen hinter dem Header bis zur im Header übermittelten Dateigröße als Dateiinhalt interpretieren usw.</p>
<p>Rob'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404016</guid><dc:creator><![CDATA[Rob&#x27;]]></dc:creator><pubDate>Thu, 15 Nov 2007 21:30:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsweise von send() und recv() on Thu, 15 Nov 2007 22:07:14 GMT]]></title><description><![CDATA[<p>Wenn du 1000 Bytes los-sendest kommen bei TCP auch 1000 Bytes beim Empfänger an - nur eventuell erst stückweise und/oder mit Verzögerung.</p>
<p>Nehmen wir an der Empfänger kommt mit dem Einlesen nicht mehr hinterher: In dem Falle wird beim Empfänger der Puffer voll-laufen und wird dann alles was weiterhin an TCP-Pakete ankommt wegschmeißen - Der Sender merkt das und drosselt daraufhin seine Sende-Geschwindigkeit, verschickt die nicht angenommenen Pakete aber nochmal.<br />
Sofern die Leitung also hinreichend stabil ist, geht nichts verloren - Schlimmstenfalls wird bei einer bescheidenen Leitung die Verbindung getrennt - In dem Falle wird recv() / send() allerdings ne Fehlermeldung zurückliefern.</p>
<p>Die von Rob' erwähnte Fallstricke, das recv() nicht unbedingt den angegeben buffer mit einem Schlag komplett füllt, sondern nur die ersten 12 Bytes z.B. reinpackt (siehe Rückgabewert von recv()) gilt übrigens analog auch für send()!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404030</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Thu, 15 Nov 2007 22:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsweise von send() und recv() on Fri, 16 Nov 2007 07:27:52 GMT]]></title><description><![CDATA[<p>Hi erstmal danke für die Antworten <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>Rob' schrieb:</p>
<blockquote>
<p>Noch mal im Klartext: Das Schreiben von z.B. 1000 Bytes auf der Sendeseite mit einem Aufruf von send() heißt noch lange nicht, dass du mit einem einzigen!!! recv() auf der Empfangsseite wieder die 1000 Bytes auslesen kannst. Es ist durchaus wahrscheinlich, dass recv() mehrfach aufgerufen werden muß, bis du deine 1000 Bytes wieder zusammen hast.</p>
</blockquote>
<p>Ja wurde mir schon erklärt und des wegen hab ich auch 2 Funktionen gescheiben:</p>
<pre><code class="language-cpp">send bzw recv _whole_msg(SOCKET sock, int msg_len, char *msg_str, int msg_str_len) //int msg_str_len ist aber nur bei recv dabei
</code></pre>
<p>Und noch eine:</p>
<pre><code class="language-cpp">recv_header(SOCKET sock, char *header_str)
//liest solange vom socket bis header end zeiche '-' kommt oder MAX_HEADER_LEN erreicht wurde
</code></pre>
<p>OK noch ein Versuch das Problem zu erklären:</p>
<p>1. [Server] -- [Client] verbunden --&gt; OK;<br />
2.[Client] schickt mit send_whole_msg() den header --&gt; alles übertragen<br />
3.[Server] empfängt header via recv_header() --&gt; erfolgreich übertragen<br />
4.[Server] Wertet header aus um entsprechende Funktion auszuführen --&gt; OK<br />
5.[Client] schickt derweil bytes die zum header gehört --&gt; alles übertragen<br />
6.[Client] schickt nächsten header um zu sagen ob alles ok ist --&gt; alles übertragen<br />
[Server] will X bytes(anzahl die in header drin stand) empfangen kommt aber nichts</p>
<p>Jetzt kommt der Trick:</p>
<p>wenn ich z.B. die Funktion getche() zwischen 5. und 6. einbau und ein paar Sekunden warte bis ich ne Taste drück Funktionierts wunderbar <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>Kann mir einer sagen warum??</p>
<p>Danke Ich</p>
<p>PS: wenn ich die Funktionen mal schreiben soll sagt bescheid!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404090</guid><dc:creator><![CDATA[Vorübergehender Gast]]></dc:creator><pubDate>Fri, 16 Nov 2007 07:27:52 GMT</pubDate></item></channel></rss>