<?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[packet]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hätte ein paar Fragen zu diesem Code:</p>
<pre><code>//die Struktur die als Parameter übergeben wird

struct CPacket
{
	unsigned short size;
	unsigned short command;
	unsigned short unused;
	unsigned char buffer[ 0x3FA ];  //warum ein char und kein u_short array?
};

//die funktion

void logPack (char *packet)
{
//da packet[0] == size ist, kann ich daraus schließen 
//dass packet[1] == command ist?
unsigned short paksize=(*((unsigned short*)&amp;packet[0])) - 2; //warum -2
int i;

for (i = 0 &amp; ~15; i &lt; paksize; i++) //warum i&amp;~15
{
    if  ((i &amp; 15) == 0) //warum i&amp;15
       printf(&quot;%04x &quot;,i); //was genau bezweckt dieser teil der ausgabe?
    printf((i&lt;0)?&quot;   &quot;:&quot;%02x%c&quot;,(unsigned char)packet[i],((i+1)&amp;15)?' ':'\n');

}
if ((i &amp; 15) != 0)
    printf(&quot;\n&quot;);
}
</code></pre>
<p>Jetzt schon mal ein herlzliches Dankeschön für die Hilfe</p>
<p>lg<br />
lattella</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316409/packet</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 00:10:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316409.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 May 2013 01:58:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to packet on Fri, 03 May 2013 01:58:01 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hätte ein paar Fragen zu diesem Code:</p>
<pre><code>//die Struktur die als Parameter übergeben wird

struct CPacket
{
	unsigned short size;
	unsigned short command;
	unsigned short unused;
	unsigned char buffer[ 0x3FA ];  //warum ein char und kein u_short array?
};

//die funktion

void logPack (char *packet)
{
//da packet[0] == size ist, kann ich daraus schließen 
//dass packet[1] == command ist?
unsigned short paksize=(*((unsigned short*)&amp;packet[0])) - 2; //warum -2
int i;

for (i = 0 &amp; ~15; i &lt; paksize; i++) //warum i&amp;~15
{
    if  ((i &amp; 15) == 0) //warum i&amp;15
       printf(&quot;%04x &quot;,i); //was genau bezweckt dieser teil der ausgabe?
    printf((i&lt;0)?&quot;   &quot;:&quot;%02x%c&quot;,(unsigned char)packet[i],((i+1)&amp;15)?' ':'\n');

}
if ((i &amp; 15) != 0)
    printf(&quot;\n&quot;);
}
</code></pre>
<p>Jetzt schon mal ein herlzliches Dankeschön für die Hilfe</p>
<p>lg<br />
lattella</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2320528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2320528</guid><dc:creator><![CDATA[lattella]]></dc:creator><pubDate>Fri, 03 May 2013 01:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to packet on Fri, 03 May 2013 02:21:36 GMT]]></title><description><![CDATA[<p>Der Code soll solche Hexdumps ins Logfile schreiben.<br />
<a href="http://www.pacificsimplicity.ca/node/90" rel="nofollow">http://www.pacificsimplicity.ca/node/90</a></p>
<pre><code>void logPack (char *packet)
{
//da packet[0] == size ist, kann ich daraus schließen
//dass packet[1] == command ist?

//weiß keiner so genau- vielleicht wird 
//die logPack nur mit dem buffer eines Pakets aufgerufen?

unsigned short paksize=(*((unsigned short*)&amp;packet[0])) - 2; //warum -2
//Typisch wäre am Ende des Pakets eine Checksumme, die hier keiner 
//loggen wollte. 
int i;

for (i = 0 &amp; ~15; i &lt; paksize; i++) //warum i&amp;~15
//Das &amp;~15 stammt aus alten Überlegungen und ist in dieser Version deplaziert. 
{
    if  ((i &amp; 15) == 0) //warum i&amp;15
//Ist gleich zu ((i %16) == 0)
//Alle 16 Bytes soll ein Zeilenumbruch gemacht werden für den 
//hübschen Hexdump
       printf(&quot;%04x &quot;,i); //was genau bezweckt dieser teil der ausgabe?
//Adresse ausgeben. Sozusagen die Zeilennummer. Genau wie im Link von mir. 
//Vierstellig hex. 

    printf((i&lt;0)?&quot;   &quot;:&quot;%02x%c&quot;,(unsigned char)packet[i],((i+1)&amp;15)?' ':'\n');
//gamecoder mit sockenschuss. 
    printf(&quot;%02x&quot;,(unsigned char)packet[i]);
    if((i&amp;15)==15)
       putch('\n');
}
//und zum Abschluss noch einen Zeilenumbruch, falls mitten in der Zeile 
//aufgehört wurde. 
if ((i &amp; 15) != 0)
    printf(&quot;\n&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2320530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2320530</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 03 May 2013 02:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to packet on Fri, 03 May 2013 03:25:21 GMT]]></title><description><![CDATA[<p>Danke für Link, Antwort und Mühe!</p>
<blockquote>
<p>void logPack (char *packet)<br />
{<br />
//da packet[0] == size ist, kann ich daraus schließen<br />
//dass packet[1] == command ist?</p>
<p>//weiß keiner so genau- vielleicht wird<br />
//die logPack nur mit dem buffer eines Pakets aufgerufen?</p>
</blockquote>
<pre><code>//using ASIO lib
int cpaksize=6;
int cpakrecv=0;
char cbuf[0x800];

if (!isActive) {
			clientsock = accept( listenersock, NULL, NULL );
			if(!connecttorealserver(getrealhost(), getrealport())) return false;
		}

		FD_ZERO( &amp;fds );
		FD_SET(serversock, &amp;fds);
		FD_SET(clientsock, &amp;fds);

		activity = select(0, &amp;fds, NULL, NULL, NULL);

		if (FD_ISSET(clientsock, &amp;fds)){
			int recvsize = recv( clientsock, &amp;cbuf[cpakrecv], cpaksize-cpakrecv, 0 );

			cpakrecv += recvsize;

			if (cpakrecv==6) {
				cpaksize = *(unsigned short*)&amp;cbuf[0];
			}
			if(cpakrecv==cpaksize) {
				CPacket* pak = (CPacket*)cbuf;
				logPack((char*) pak);
</code></pre>
<p>Aus diesem Code schließe ich dass logPack pro Packet einmal aufgerufen wird</p>
<blockquote>
<p>unsigned short paksize=(<em>((unsigned short</em>)&amp;packet[0])) - 2; //warum -2<br />
//Typisch wäre am Ende des Pakets eine Checksumme, die hier keiner<br />
//loggen wollte.</p>
</blockquote>
<p>Gut zu wissen Danke</p>
<blockquote>
<p>for (i = 0 &amp; ~15; i &lt; paksize; i++) //warum i&amp;~15<br />
//Das &amp;~15 stammt aus alten Überlegungen und ist in dieser Version deplaziert.</p>
</blockquote>
<p>Was wäre eine aktuelle Alternative?</p>
<blockquote>
<p>{<br />
if ((i &amp; 15) == 0) //warum i&amp;15<br />
//Ist gleich zu ((i %16) == 0)<br />
//Alle 16 Bytes soll ein Zeilenumbruch gemacht werden für den<br />
//hübschen Hexdump</p>
</blockquote>
<p>Gut zu wissen, darf ich davon ausgehen dass i&amp;15 schneller ist, da es sich um eine Addition handelt?</p>
<blockquote>
<p>printf(&quot;%04x &quot;,i); //was genau bezweckt dieser teil der ausgabe?<br />
//Adresse ausgeben. Sozusagen die Zeilennummer. Genau wie im Link von mir.<br />
//Vierstellig hex.</p>
</blockquote>
<p>Danke, anscheinend war ich blind</p>
<blockquote>
<p>printf((i&lt;0)?&quot; &quot;:&quot;%02x%c&quot;,(unsigned char)packet[i],((i+1)&amp;15)?' ':'\n');<br />
//gamecoder mit sockenschuss.</p>
</blockquote>
<p>An so jemanden habe ich auch gedacht</p>
<blockquote>
<p>printf(&quot;%02x&quot;,(unsigned char)packet[i]);<br />
if((i&amp;15)==15)<br />
putch('\n');<br />
}<br />
//und zum Abschluss noch einen Zeilenumbruch, falls mitten in der Zeile<br />
//aufgehört wurde.<br />
if ((i &amp; 15) != 0)<br />
printf(&quot;\n&quot;);<br />
}</p>
</blockquote>
<p>Und gleich noch ein Frage:</p>
<p>Warum wird in der struct ein u_char statt eines u_short Arrays verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2320532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2320532</guid><dc:creator><![CDATA[lattella]]></dc:creator><pubDate>Fri, 03 May 2013 03:25:21 GMT</pubDate></item><item><title><![CDATA[Reply to packet on Fri, 03 May 2013 05:24:48 GMT]]></title><description><![CDATA[<p>lattella schrieb:</p>
<blockquote>
<blockquote>
<p>for (i = 0 &amp; ~15; i &lt; paksize; i++) //warum i&amp;~15<br />
//Das &amp;~15 stammt aus alten Überlegungen und ist in dieser Version deplaziert.</p>
</blockquote>
<p>Was wäre eine aktuelle Alternative?</p>
</blockquote>
<p>for(i=0;...</p>
<blockquote>
<p>{<br />
if ((i &amp; 15) == 0) //warum i&amp;15<br />
//Ist gleich zu ((i %16) == 0)<br />
//Alle 16 Bytes soll ein Zeilenumbruch gemacht werden für den<br />
//hübschen Hexdump</p>
</blockquote>
<p>Gut zu wissen, darf ich davon ausgehen dass i&amp;15 schneller ist, da es sich um eine Addition handelt?<br />
[/quote]<br />
Es handelt sich bei &amp; um bitweises AND, während % eine Division ist.<br />
Solche trivialen Optimierungen hat der Compiler aber auch selber zu schaffen, dafür verschandelt man seinen Code schon lange nicht mehr.</p>
<blockquote>
<p>Warum wird in der struct ein u_char statt eines u_short Arrays verwendet?</p>
</blockquote>
<p>Warum nicht? char ist für Nutzdaten doch recht naheliegend.</p>
<p>Hier mal ein Beispiel für was in so Paketen drin sein kann. Am Beispiel von Ultima-Online. <a href="http://docs.polserver.com/packets/index.php?ShowAll=1&amp;Sort=" rel="nofollow">http://docs.polserver.com/packets/index.php?ShowAll=1&amp;Sort=</a></p>
<pre><code>struct CPacket //MS-Namenskonvention für Klassen übernommen. Komisch. 
//struct um anzudeuten, daß sie recht dumm bleibt? Nee, gell? 
//Vielleicht ist der ganze Code nur C und kein C++?
{
    unsigned short size;//uint16_t war gemeint
//Er hat sich entschieden, generell zuerst die Paketgröße zu schicken. Bei 
//Ultima-Online ist die meistens im command gegeben. 
//Das Extra-Schicken erlaubt es, recht bequem, sowas wie Verschlüsselung, 
//Checksummen, Speicherallikation, zu erledigen, ohne genauer ins Paket schauen 
//zu müssen. 
    unsigned short command;//Ebenfalls uint16_t
    unsigned short unused;//Was er damit wohl vorhat?
    unsigned char buffer[ 0x3FA ];//Und hier die Nutzdaten. 
//Kann alles sein, eine Zeile im Chat, ein gesprochener Zauber, 
//ein Schwerthieb, Logindaten, ein Ping-Paket, alles Mögliche halt. 
//Aha, 0x3FA ist hex für 1024-2-2-2. 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2320538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2320538</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 03 May 2013 05:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to packet on Sun, 05 May 2013 03:13:39 GMT]]></title><description><![CDATA[<p>υund nochmals Danke, gefolgt von neuen Fragen:</p>
<p>Hat folgender Code die gleiche funktionalität, bzw ist er halbwegs akzeptable?</p>
<pre><code>int i;

for (i = 0; i &lt; paksize; i++)
{
    if  ((i % 16) == 0) 
       printf(&quot;%04x &quot;,i);
	if (i&lt;0)
		printf(&quot;  &quot;);
	else
		printf(&quot;%02x&quot;,(unsigned char)packet[i]);
	if ((i+1) %16)
		printf(&quot;  &quot;);
	else
		putch('\n'); 

}
if ((i &amp; 15) != 0)
    printf(&quot;\n&quot;);
</code></pre>
<blockquote>
<p>//Vielleicht ist der ganze Code nur C und kein C++?</p>
</blockquote>
<p>Bis auf die verwendung der Boost library ist der Code in C geschrieben, da stimme ich dir zu, mit OOP hat das nicht viel zu tun</p>
<blockquote>
<p>unsigned short size;//uint16_t war gemeint<br />
//Er hat sich entschieden, generell zuerst die Paketgröße zu schicken. Bei<br />
//Ultima-Online ist die meistens im command gegeben.<br />
//Das Extra-Schicken erlaubt es, recht bequem, sowas wie Verschlüsselung,<br />
//Checksummen, Speicherallikation, zu erledigen, ohne genauer ins Paket schauen<br />
//zu müssen.</p>
</blockquote>
<p>Würde die Verwendung eines uint16_t etwas verändern?</p>
<p><strong>Danke für deine Hilfe</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2320685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2320685</guid><dc:creator><![CDATA[lattella]]></dc:creator><pubDate>Sun, 05 May 2013 03:13:39 GMT</pubDate></item></channel></rss>