<?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[Buffer unbekannter Größe mit void anhängen]]></title><description><![CDATA[<p>Hi!<br />
Ich habe da ein Netzwerk Problem.</p>
<p>Ich schreibe gerade einen Chatclient für's <a href="http://Battle.net" rel="nofollow">Battle.net</a>. Um die Daten die ich verschicke und empfange übersichtlicher zu haben, habe ich mir Klassen gemacht.<br />
Das sieht einmal so aus:</p>
<pre><code class="language-cpp">class CBNCS
{
public:
	BYTE    MessageStart; //Immer 0xFF!
	BYTE	MessageID; //Die ID halt
	WORD	MessageLength; //Die gesamte Datenlänge inkl. header
	void	*Data; //Die Daten die dann kommen
};
</code></pre>
<p>Das ist der Header des Protokolls mit dem das <a href="http://Battle.net" rel="nofollow">Battle.net</a> kommuniziert. Dieser muss immer in diesem Format versendet werden.<br />
Data ist dann die eigentliche Nachricht, die ich verschicke. Meistens ist das noch eine weitere komplette klasse die ich da drann hänge. An sich funktioniert das auch, allerdings steht vor den eigentlichen Daten, die in der Klasse enthalten sind, die Adresse der Klasse im Buffer. Da die Daten vom Server dann nichtmehr richtig interpretiert werden können, werde ich natürlich gekickt.</p>
<p>Ich weise das Ganze so zu:</p>
<pre><code class="language-cpp">BNCS.Data = &amp;AuthInfo; //AuthInfo ist eine Variable einer Klasse!
</code></pre>
<p>Verschickt wird das Ganze so:</p>
<pre><code class="language-cpp">rc = send(s,(char *)&amp;BNCS,(sizeof AuthInfo)+4,0); //+4 wegen header
</code></pre>
<p>Wie kriege ich diese Adresse vom Anfang des Buffers weg?</p>
<p>Das Problem ist wie gesagt, dass ich nicht weiß wie groß Data ist. Natürlich könnte ich 1000 mal Copy und Paste machen, dann geht es auch, aber da gibt es doch bestimmt eine konfortablere art!?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126828/buffer-unbekannter-größe-mit-void-anhängen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 16:09:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126828.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Nov 2005 21:29:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Buffer unbekannter Größe mit void anhängen on Fri, 18 Nov 2005 21:29:07 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich habe da ein Netzwerk Problem.</p>
<p>Ich schreibe gerade einen Chatclient für's <a href="http://Battle.net" rel="nofollow">Battle.net</a>. Um die Daten die ich verschicke und empfange übersichtlicher zu haben, habe ich mir Klassen gemacht.<br />
Das sieht einmal so aus:</p>
<pre><code class="language-cpp">class CBNCS
{
public:
	BYTE    MessageStart; //Immer 0xFF!
	BYTE	MessageID; //Die ID halt
	WORD	MessageLength; //Die gesamte Datenlänge inkl. header
	void	*Data; //Die Daten die dann kommen
};
</code></pre>
<p>Das ist der Header des Protokolls mit dem das <a href="http://Battle.net" rel="nofollow">Battle.net</a> kommuniziert. Dieser muss immer in diesem Format versendet werden.<br />
Data ist dann die eigentliche Nachricht, die ich verschicke. Meistens ist das noch eine weitere komplette klasse die ich da drann hänge. An sich funktioniert das auch, allerdings steht vor den eigentlichen Daten, die in der Klasse enthalten sind, die Adresse der Klasse im Buffer. Da die Daten vom Server dann nichtmehr richtig interpretiert werden können, werde ich natürlich gekickt.</p>
<p>Ich weise das Ganze so zu:</p>
<pre><code class="language-cpp">BNCS.Data = &amp;AuthInfo; //AuthInfo ist eine Variable einer Klasse!
</code></pre>
<p>Verschickt wird das Ganze so:</p>
<pre><code class="language-cpp">rc = send(s,(char *)&amp;BNCS,(sizeof AuthInfo)+4,0); //+4 wegen header
</code></pre>
<p>Wie kriege ich diese Adresse vom Anfang des Buffers weg?</p>
<p>Das Problem ist wie gesagt, dass ich nicht weiß wie groß Data ist. Natürlich könnte ich 1000 mal Copy und Paste machen, dann geht es auch, aber da gibt es doch bestimmt eine konfortablere art!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921047</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Fri, 18 Nov 2005 21:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Buffer unbekannter Größe mit void anhängen on Fri, 18 Nov 2005 23:36:58 GMT]]></title><description><![CDATA[<p>Du kannst natürlich nicht direkt Objekt-Instanzen verschicken, dondern eben Daten, die du dann auf Client-Seite evtl. wieder entsprechend zurückcasten kannst. Du musst also dafür sorgen, dass die Daten im Speicher direkt hintereinander stehen. Mit Pointern geht das so nicht - du kannst aber auch die Daten in zwei Schritten (also zweimal send) verschicken...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921118</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Fri, 18 Nov 2005 23:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to Buffer unbekannter Größe mit void anhängen on Sat, 19 Nov 2005 07:10:43 GMT]]></title><description><![CDATA[<p>Du solltest beachten, dass man keine Strukturen oder Klassen über das Netz senden kann; sondern immer nur bytes (eines nach dem anderen).<br />
Auch wird meistens eine etwas andere Byte-Order verwendet als bei Intel-Prozessoren üblich (Network-Byte-Order entspricht meistens dem Motorola-Format: Also das höchtse (MSB) Byte zu erst und als letzten das niedrigste Byte (LSB)).<br />
Siehe auch: Windows Sockets: Byte Ordering: <a href="http://msdn.microsoft.com/library/en-us/vccore/html/_core_windows_sockets.3a_.byte_ordering.asp" rel="nofollow">http://msdn.microsoft.com/library/en-us/vccore/html/_core_windows_sockets.3a_.byte_ordering.asp</a></p>
<p>Dein Problem lässt sich eigentlich mit einer Basisklasse und mehreren abgeleiteten Klassen lösen:<br />
Die Basisklasse enthält den Header (der ja immer benötigt wird):</p>
<pre><code class="language-cpp">class Base
{
  virtual void Send(...);
};
</code></pre>
<p>In einer abgeleiteten Klasse überschreibst Du jetzt die Send um noch mehr Daten anzufügen:</p>
<pre><code class="language-cpp">class MoreData : public Base
{
  virtual void Send(...)
  {
    Base::Send(); // schicke zuerst mal den Header
   // Sende jetzt noch weitere Daten
  }
};
</code></pre>
<p>usw....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921168</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sat, 19 Nov 2005 07:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Buffer unbekannter Größe mit void anhängen on Sat, 19 Nov 2005 09:09:57 GMT]]></title><description><![CDATA[<p>Oder du legst dir einen Zwischenpuffer mit der Größe x+4 an, in den du hintereinander weg erst die Header-Elemente und dann die Daten packst - den kannst du dann am Stück verschicken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921181</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 19 Nov 2005 09:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Buffer unbekannter Größe mit void anhängen on Sat, 19 Nov 2005 11:20:21 GMT]]></title><description><![CDATA[<p>Nur um nicht den Eindruck zu erwecken das mehrere send(...) aufrufen auch automatisch in mehrere TCP-Pakete münden... das ist natürlich nicht der Fall, da der TCP-Layer das ganze optimiert und auch zusammenfasst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/921243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/921243</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sat, 19 Nov 2005 11:20:21 GMT</pubDate></item></channel></rss>