<?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[Stack-Überlauf bei TClientSocket]]></title><description><![CDATA[<p>Hi</p>
<p>Also ich habe einen TClientSocket auf dem ich eine Datei empfange!</p>
<p>Das klappt auch ganz gut nur wenn die Datei zu gross ist bekomme ich einen Stack Überlauf:</p>
<blockquote>
<p>..Exccption der Klasse EStackOverflow aufgetreten.Medlung: 'Stack-Überlauf'.</p>
</blockquote>
<p>Mein Source:</p>
<pre><code class="language-cpp">void __fastcall TForm1::SocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString mComp = Socket-&gt;ReceiveText();
  AnsiString mSend;
  AnsiString mGet;
  int laenge;
  if(!GetFileData)
  {
    //Wenn keine Dateidaten erwartet werden
    ...
  }
  else
  {
    //Dateidaten werden erwartet
    //Prüfen ob Noch RestDaten da sind...
    if(SaveMessagePart.Length() &gt; 0)
    {
      //Wenn noch Restdaten da sind diese in mComp einfügen
      mComp = SaveMessagePart + mComp;
      SaveMessagePart = &quot;&quot;;
    }
    while(CompFileData &gt; CountFileData &amp;&amp; mComp.Length() &gt; 0)
    {
      sGetFile.put(mComp[1]);
      CountFileData++;
      mComp.Delete(1,1);
    }
    SaveMessagePart = mComp;  // Den Rest (z.B. nächster Befehl) abspeichern
    if(CountFileData &gt;= CompFileData)
    {
      GetFileData = false;
    }
    SocketRead(Sender,Socket);  // Damit Daten in SaveMessagePart verarbeitet werden auch wenn kein neues OnRead kommt
  }
}
</code></pre>
<p>Meine Vermutung ist, dass sich wärend des durchlaufens auf dem Socket soviele daten ansammeln, dass er probleme hat diese in den AnsiString zu packen! Weil der Fehler erst beim 2. Durchlauf auftritt! Kann das sein?</p>
<p>Würde das auslesen der Daten aus dem Stream hier abhilfe schaffen oder nicht? Habe keine Lust die Ganze Methode umzuschreiben wenn es garnicht daran liegt!</p>
<p>THX</p>
<p>Dagsta</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/106714/stack-überlauf-bei-tclientsocket</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 05:34:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/106714.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Apr 2005 20:14:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stack-Überlauf bei TClientSocket on Tue, 12 Apr 2005 20:14:09 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Also ich habe einen TClientSocket auf dem ich eine Datei empfange!</p>
<p>Das klappt auch ganz gut nur wenn die Datei zu gross ist bekomme ich einen Stack Überlauf:</p>
<blockquote>
<p>..Exccption der Klasse EStackOverflow aufgetreten.Medlung: 'Stack-Überlauf'.</p>
</blockquote>
<p>Mein Source:</p>
<pre><code class="language-cpp">void __fastcall TForm1::SocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString mComp = Socket-&gt;ReceiveText();
  AnsiString mSend;
  AnsiString mGet;
  int laenge;
  if(!GetFileData)
  {
    //Wenn keine Dateidaten erwartet werden
    ...
  }
  else
  {
    //Dateidaten werden erwartet
    //Prüfen ob Noch RestDaten da sind...
    if(SaveMessagePart.Length() &gt; 0)
    {
      //Wenn noch Restdaten da sind diese in mComp einfügen
      mComp = SaveMessagePart + mComp;
      SaveMessagePart = &quot;&quot;;
    }
    while(CompFileData &gt; CountFileData &amp;&amp; mComp.Length() &gt; 0)
    {
      sGetFile.put(mComp[1]);
      CountFileData++;
      mComp.Delete(1,1);
    }
    SaveMessagePart = mComp;  // Den Rest (z.B. nächster Befehl) abspeichern
    if(CountFileData &gt;= CompFileData)
    {
      GetFileData = false;
    }
    SocketRead(Sender,Socket);  // Damit Daten in SaveMessagePart verarbeitet werden auch wenn kein neues OnRead kommt
  }
}
</code></pre>
<p>Meine Vermutung ist, dass sich wärend des durchlaufens auf dem Socket soviele daten ansammeln, dass er probleme hat diese in den AnsiString zu packen! Weil der Fehler erst beim 2. Durchlauf auftritt! Kann das sein?</p>
<p>Würde das auslesen der Daten aus dem Stream hier abhilfe schaffen oder nicht? Habe keine Lust die Ganze Methode umzuschreiben wenn es garnicht daran liegt!</p>
<p>THX</p>
<p>Dagsta</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765131</guid><dc:creator><![CDATA[dagsta]]></dc:creator><pubDate>Tue, 12 Apr 2005 20:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Überlauf bei TClientSocket on Tue, 12 Apr 2005 20:31:32 GMT]]></title><description><![CDATA[<p>Steppe mal einfach mit dem Debugger durch und dir fällt was auf...</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765138</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Tue, 12 Apr 2005 20:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Überlauf bei TClientSocket on Tue, 12 Apr 2005 21:23:55 GMT]]></title><description><![CDATA[<p>So bin jetzt doch wieder auf die 1. Variante umgestiegen aber prüfe jetzt ob überhaupt noch Restdaten da sind bevor ich die Funktion erneut aufrufe und siehe da es klappt!</p>
<p>THX</p>
<p>--------------------------------------------------------------------------</p>
<p>Ja mir fällt was auf!</p>
<p>Wenn ich debugge tritt der Fehler garnicht erst auf!</p>
<p>Dann wird die datei ordentlich übertragen!</p>
<p>Habe noch was am Code verändert:</p>
<pre><code class="language-cpp">AnsiString mComp;
  AnsiString mSend;
  AnsiString mGet;
  int laenge;
  //Wenn keine Dateidaten erwartet werden (sonst ormatierungsfehler)
  if(!GetFileData)
  {
    ...
  }
  else
  {
    //Dateidaten werden erwartet
    //Prüfen ob Noch RestDaten da sind...
    puffer[383] = '\0';

    while(CountFileData &lt; CompFileData &amp;&amp; Socket-&gt;ReceiveLength() &gt; 0 &amp;&amp; Socket-&gt;ReceiveBuf(&amp;puffer, 383) &gt; -1)
    {
      mComp = AnsiString(puffer);
      if(SaveMessagePart.Length() &gt; 0)
      {
        //Wenn noch Restdaten da sind diese in mComp einfügen
        mComp = SaveMessagePart + mComp;
        SaveMessagePart = &quot;&quot;;
      }
      while(CompFileData &gt; CountFileData &amp;&amp; mComp.Length() &gt; 0)
      {
        sGetFile.put(mComp[1]);
        CountFileData++;
        mComp.Delete(1,1);
      }
      SaveMessagePart = mComp;
    }
    if(CountFileData &gt;= CompFileData)
    {
      GetFileData = false;
    }
    SocketRead(Sender,Socket);
  }
}
</code></pre>
<p>Und der Fehler tritt wenn ich es so durchlaufen lasse weiterhin auf und zwar bei</p>
<pre><code class="language-cpp">while(CountFileData &lt; CompFileData &amp;&amp; Socket-&gt;ReceiveLength() &gt; 0 &amp;&amp; Socket-&gt;ReceiveBuf(&amp;puffer, 383) &gt; -1)
</code></pre>
<p>Aber wenn ich gebugge und meinen Finger auf F9 halte (die Datei ist 600Kb also dauert das ne weile) dann tritt der Fehler garnicht erst auf!</p>
<p>Jemand ne Idee?</p>
<p>THX</p>
<p>Dagsta</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765160</guid><dc:creator><![CDATA[dagsta]]></dc:creator><pubDate>Tue, 12 Apr 2005 21:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Überlauf bei TClientSocket on Wed, 13 Apr 2005 05:34:39 GMT]]></title><description><![CDATA[<p>Du überträgst eine Datei und empfängst sie in einem AnsiString? Normalerweise würde man bei Dateien einen <strong>Stream</strong> (File- oder MemoryStream) nutzen, anstatt den Inhalt der Datei in einen AnsiString zu packen.</p>
<p>Zumindest wäre das meine Idee und wenn ich mich nicht irre, auch die von einigen anderen hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765255</guid><dc:creator><![CDATA[PuppetMaster2k]]></dc:creator><pubDate>Wed, 13 Apr 2005 05:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Überlauf bei TClientSocket on Wed, 13 Apr 2005 06:53:40 GMT]]></title><description><![CDATA[<p>dagsta schrieb:</p>
<blockquote>
<p>Ja mir fällt was auf!</p>
<p>Wenn ich debugge tritt der Fehler garnicht erst auf!</p>
</blockquote>
<p>Doch... aber VIIIEEEL später... Wie soll jemals aus deiner Funktion herausgesprungen werden, wenn du kurz vor dem Sprung eine Rekursion machst?</p>
<p>Übrigens sind Schleifen in Events eigentlich eher nicht wirklich brauchbar... Das Event wird ja mehrfach aufgerufen. Also wieso nicht damit eine &quot;implizite Schleife&quot; bauen?</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/765292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/765292</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Wed, 13 Apr 2005 06:53:40 GMT</pubDate></item></channel></rss>