<?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[Stackoverflow Java-Applet an C++-Server]]></title><description><![CDATA[<p>Hallo!<br />
ich habe einen minimalen Server gebaut, der HTTP-Responses kann, mehr erst mal nicht. Ich habe ihn mit dem Client Firefox erfolgreich getestet. Sobald aber ein Java-Applet mir Daten senden will (die ich mit recv auffange), wird eine Exception geworfen: &quot;Stack around the variable 'c' was corrupted.&quot;</p>
<p>Der Visual Studio Debugger sagt, hier:</p>
<pre><code class="language-cpp">bool tcp_server::recv_from(const int sock, std::string &amp;s) {
    char c[500];
    int len = ::recv(sock, c, 499, 0);
    c[len] = '\0';
    s = c;
    return true;
}
</code></pre>
<p>Nun kann man maximal 499 Bytes empfangen, das letzte ist für die Nullterminierung. Bei der Zuweisung s = c (s ist ein std::string) wird die Exception von der CRT geworfen. Im C-Array sind 512 (!) Elemente zu sehen, allesamt ASCII-Müll.<br />
Das JavaApplet sendet eigentlich nur so:</p>
<pre><code class="language-java">try
  {
   Socket skt = new Socket(&quot;90.136.135.38&quot;, 80);
   BufferedReader in = new BufferedReader(new
   InputStreamReader(skt.getInputStream()));
   System.out.print(&quot;Received string: '&quot;);
   while (!in.ready()) {}
   PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
   out.print(&quot;Hallo Wie gehts denn so \0&quot;);
   System.out.println(in.readLine()); // Read one line and output it
   System.out.print(&quot;'\n&quot;);
   in.close();
  }
  catch(Exception e)
  {
   System.out.print(&quot;Whoops! It didn't work!\n&quot;);
  }
</code></pre>
<p>Anmerkung: Nicht mein Code. <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>Ist der Fehler im Java-Code zu finden? Clients, die mit C(++) gemacht sind, laufen einwandfrei, u.a. auch IE und Firefox, bei Java kackt's irgendwie ab. <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/250418/stackoverflow-java-applet-an-c-server</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 00:28:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250418.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Sep 2009 17:21:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Thu, 17 Sep 2009 17:21:47 GMT]]></title><description><![CDATA[<p>Hallo!<br />
ich habe einen minimalen Server gebaut, der HTTP-Responses kann, mehr erst mal nicht. Ich habe ihn mit dem Client Firefox erfolgreich getestet. Sobald aber ein Java-Applet mir Daten senden will (die ich mit recv auffange), wird eine Exception geworfen: &quot;Stack around the variable 'c' was corrupted.&quot;</p>
<p>Der Visual Studio Debugger sagt, hier:</p>
<pre><code class="language-cpp">bool tcp_server::recv_from(const int sock, std::string &amp;s) {
    char c[500];
    int len = ::recv(sock, c, 499, 0);
    c[len] = '\0';
    s = c;
    return true;
}
</code></pre>
<p>Nun kann man maximal 499 Bytes empfangen, das letzte ist für die Nullterminierung. Bei der Zuweisung s = c (s ist ein std::string) wird die Exception von der CRT geworfen. Im C-Array sind 512 (!) Elemente zu sehen, allesamt ASCII-Müll.<br />
Das JavaApplet sendet eigentlich nur so:</p>
<pre><code class="language-java">try
  {
   Socket skt = new Socket(&quot;90.136.135.38&quot;, 80);
   BufferedReader in = new BufferedReader(new
   InputStreamReader(skt.getInputStream()));
   System.out.print(&quot;Received string: '&quot;);
   while (!in.ready()) {}
   PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
   out.print(&quot;Hallo Wie gehts denn so \0&quot;);
   System.out.println(in.readLine()); // Read one line and output it
   System.out.print(&quot;'\n&quot;);
   in.close();
  }
  catch(Exception e)
  {
   System.out.print(&quot;Whoops! It didn't work!\n&quot;);
  }
</code></pre>
<p>Anmerkung: Nicht mein Code. <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>Ist der Fehler im Java-Code zu finden? Clients, die mit C(++) gemacht sind, laufen einwandfrei, u.a. auch IE und Firefox, bei Java kackt's irgendwie ab. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1780648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780648</guid><dc:creator><![CDATA[Sock0r]]></dc:creator><pubDate>Thu, 17 Sep 2009 17:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Thu, 17 Sep 2009 17:31:32 GMT]]></title><description><![CDATA[<p>Sock0r schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool tcp_server::recv_from(const int sock, std::string &amp;s) {
    char c[500];
    int len = ::recv(sock, c, 499, 0);
    c[len] = '\0';
    s = c;
    return true;
}
</code></pre>
</blockquote>
<p>der code ist nicht von dir?</p>
<p>nullterminierung brauchst du nicht</p>
<pre><code class="language-cpp">const size_t RECV_LENGTH = 500;
void tcp_server::recv_from(const int sock, std::string &amp;s)
{
    char c[RECV_LENGTH];
    int len = ::recv(sock, c, RECV_LENGTH, 0);
    if(len &gt;= 0)
      s.append(c, c+len);
    else
      //disc oder so -&gt; exception
}
</code></pre>
<p>-&gt;</p>
<pre><code class="language-cpp">const size_t RECV_LENGTH = 500;
std::string tcp_server::recv_from(const int sock)
{
    char c[RECV_LENGTH];
    int len = ::recv(sock, c, RECV_LENGTH, 0);
    if(len &lt; 1)
      //disconnect oder so -&gt; exception
    return std::string(c, c+len);
}
</code></pre>
<p>und wenn ich schon mal dabei bin, deinen Code zu kritisieren:<br />
std::vector wäre hier imho sehr viel logischer als std::string.<br />
Und seit wann schreibt man int statt SOCKET?</p>
<pre><code class="language-cpp">const size_t RECV_LENGTH = 500;
std::vector&lt;char&gt; tcp_server::recv_from(SOCKET sock)
{
    char c[RECV_LENGTH];
    int len = ::recv(sock, c, RECV_LENGTH, 0);
    if(len &lt; 1)
      //disconnect oder so -&gt; exception
    return std::vector&lt;char&gt;(c, c+len);
}
</code></pre>
<p>kein Plan, ob da der Fehler lag - aber kann mir gut vorstellen, dass es bei nem disconnect gekracht hat, weil c[-1] nicht so gut ist^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780659</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 17 Sep 2009 17:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Fri, 18 Sep 2009 11:39:16 GMT]]></title><description><![CDATA[<p>Das ist ein keep-alive-Socket. Getrennt wird da nix. Wo der Unterschied zwischen String und Vector&lt;char&gt; ist, ist mir so nicht klar. Und ehrlich gesagt sendet man Bytes, also chars, da ist ein std::string, der c_str() anbietet, wesentlich praktischer.<br />
SOCKET schreibe ich nicht. Wieso auch? Unter Win mag das üblich sein, in Linux eher nicht, dort nutzte ich eher int. Und es ist doch eh nurn typedef...</p>
<p>Aber Ursache war's auch nicht. Ach, Java stinkt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780957</guid><dc:creator><![CDATA[Sock0r]]></dc:creator><pubDate>Fri, 18 Sep 2009 11:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Fri, 18 Sep 2009 12:21:13 GMT]]></title><description><![CDATA[<p>imho ist es nicht gerade naheliegende, z.bsp. binäre daten in nem string zu speichern...<br />
c_str() nützt dir genau so viel, wie &amp;vector[0]<br />
die länge musst du trotzdem angeben, da binäre daten ja öfters mal ne 0 enthalten...<br />
und c_str() impliziert imho, dass die länge über strlen() festgestellt werden kann - bei &amp;vector[0] ist klar, dass man noch ne länge braucht...</p>
<p>btw: mal den debugger genutzt und geguckt, was genau passiert?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780976</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 18 Sep 2009 12:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Fri, 18 Sep 2009 20:02:49 GMT]]></title><description><![CDATA[<p>Gibt es denn einen Unterschied zwischen BYTE* und CHAR*? Der kann zwischen std::string und std::vector&lt;char&gt; ja auch nicht so groß sein, oder?</p>
<p>Der Debugger macht das, was ich oben geschrieben habe. In Zeile &quot;s = c&quot; meldet er die oben genannte Fehlermeldung, die Inhalte des char-Arrays sind allesamt der gleiche ASCII-Schrott und der Index, den mir der Debugger anzeigt, geht bis 512.</p>
<p>Das String-Terminierungszeichen muss ich aber angeben. Ein Test mit Firefox zeigt mir sonst in den nichtbelegten Bytes undefinierten ASCII-Müll. Wo soll das Zeichen auch herkommen? Mit ASCII-zeichen gehts, aber Java-Requests bringen Stack-Overflow. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1781221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781221</guid><dc:creator><![CDATA[Sock0r]]></dc:creator><pubDate>Fri, 18 Sep 2009 20:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Stackoverflow Java-Applet an C++-Server on Sat, 19 Sep 2009 14:28:01 GMT]]></title><description><![CDATA[<p>BYTE wird nen typedef auf nen unsigned char sein und iwo tief in der windows.h zu finden sein - vermut ich mal^^</p>
<p>Nein - zwischen std::string und std::vector&lt;char&gt; sollte es (meistens) keinen Unterschied geben - abgesehen von nem Overhead von paar Byte bei string und die Millionen Funktionen, die string bietet die du nicht brauchst...</p>
<p>&quot;der Index, den mir der Debugger anzeigt, geht bis 512&quot;<br />
das hat nichts zu sagen<br />
&quot;allesamt der gleiche ASCII-Schrott&quot;<br />
ist normal - im debug-mode initialisiert MSVC(ich nehm mal an, du nutzt den^^) alle variablen mit 0xc[...]c - hab gerad nachgeguckt, sollte -52 entsprechen...</p>
<p>&quot;Das String-Terminierungszeichen muss ich aber angeben.&quot;<br />
Es ist doch ne recv-Fkt - und keine Ausgabe-Fkt!?</p>
<p>Naja - Fehler kann ich jedenfalls keine sehen - was anderes als &quot;nutz den Debugger&quot; kann ich dir auch nicht sagen : D</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781436</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 19 Sep 2009 14:28:01 GMT</pubDate></item></channel></rss>