<?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[Prüfsumme berechnen bei raw-Socket]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Ich versuche mit dem untenstehenden Programm die Prüfsumme für den IP-Header zu berechnen. Ich bekomme zwar eine Summe, aber wenn ich mit einem Packet-Sniffer mir ein Packet herausfiltere und bei mir die gleichen Einstellungen mache, dann bekomme ich eine andere Prüfsumme <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>Ich hoffe, dass mir jemand helfen kann!</p>
<p>Vielen Dank!</p>
<p>Gruß<br />
Philipp</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;stdio.h&gt;

typedef struct iphdr {
	unsigned int h_len:4;				// Länge des IP-Anfangsblocks
	unsigned int version:4;				// Version
	unsigned char tos;					// Art des Dienstes
	unsigned short total_len;			// Gesamtlänge
	unsigned short ident;				// Kennung
	unsigned short frag_and_flags;		// Fragment-Offset und Markierungen
	unsigned char  ttl;					// TTL
	unsigned char proto;				// Protokoll
	unsigned short checksum;			// Header-Prüfsumme

	unsigned int sourceIP;				// Quell-IP-Adresse
	unsigned int destIP;				// Ziel-IP-Adresse

}IpHeader;

unsigned short checksum(unsigned short *, int);

int main ()
{
	IpHeader		*iphdr;
	unsigned short	        summe = 0;
	char			buffer[100];

	iphdr = (IpHeader *)buffer;

		memset(iphdr,0,sizeof(struct iphdr)); // Alles auf 0 setzen

	iphdr-&gt;version			= 4;
	iphdr-&gt;h_len			= 5;
	iphdr-&gt;tos				= 0;
	iphdr-&gt;total_len		= htons(60);
	iphdr-&gt;ident			= 1602;
	iphdr-&gt;frag_and_flags	= 0;
	iphdr-&gt;ttl				= 128;
	iphdr-&gt;proto			= 1;
	iphdr-&gt;checksum			= 0;
	iphdr-&gt;sourceIP			= inet_addr(&quot;192.168.0.4&quot;);
	iphdr-&gt;destIP			= inet_addr(&quot;192.168.0.1&quot;);

	iphdr-&gt;checksum			= checksum((unsigned short*) iphdr, sizeof(struct iphdr));

	printf(&quot;Checksum: %d\n&quot;, iphdr-&gt;checksum);

	return 0;
}

unsigned short checksum(unsigned short *buffer, int size)
{
	unsigned long csum=0;

	while(size &gt; 1) 
	{
		csum += *buffer++;
		size -= sizeof(unsigned short);
	}

	if(size) 
	{
		csum += *(unsigned short *)buffer;
	}

	csum = (csum &gt;&gt; 16) + (csum &amp; 0xffff);
	csum += (csum &gt;&gt;16);
	return (unsigned short)(~csum);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/68911/prüfsumme-berechnen-bei-raw-socket</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 20:31:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/68911.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Mar 2004 17:30:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Prüfsumme berechnen bei raw-Socket on Mon, 22 Mar 2004 17:31:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Problem. Ich versuche mit dem untenstehenden Programm die Prüfsumme für den IP-Header zu berechnen. Ich bekomme zwar eine Summe, aber wenn ich mit einem Packet-Sniffer mir ein Packet herausfiltere und bei mir die gleichen Einstellungen mache, dann bekomme ich eine andere Prüfsumme <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>Ich hoffe, dass mir jemand helfen kann!</p>
<p>Vielen Dank!</p>
<p>Gruß<br />
Philipp</p>
<pre><code class="language-cpp">#include &lt;winsock2.h&gt;
#include &lt;stdio.h&gt;

typedef struct iphdr {
	unsigned int h_len:4;				// Länge des IP-Anfangsblocks
	unsigned int version:4;				// Version
	unsigned char tos;					// Art des Dienstes
	unsigned short total_len;			// Gesamtlänge
	unsigned short ident;				// Kennung
	unsigned short frag_and_flags;		// Fragment-Offset und Markierungen
	unsigned char  ttl;					// TTL
	unsigned char proto;				// Protokoll
	unsigned short checksum;			// Header-Prüfsumme

	unsigned int sourceIP;				// Quell-IP-Adresse
	unsigned int destIP;				// Ziel-IP-Adresse

}IpHeader;

unsigned short checksum(unsigned short *, int);

int main ()
{
	IpHeader		*iphdr;
	unsigned short	        summe = 0;
	char			buffer[100];

	iphdr = (IpHeader *)buffer;

		memset(iphdr,0,sizeof(struct iphdr)); // Alles auf 0 setzen

	iphdr-&gt;version			= 4;
	iphdr-&gt;h_len			= 5;
	iphdr-&gt;tos				= 0;
	iphdr-&gt;total_len		= htons(60);
	iphdr-&gt;ident			= 1602;
	iphdr-&gt;frag_and_flags	= 0;
	iphdr-&gt;ttl				= 128;
	iphdr-&gt;proto			= 1;
	iphdr-&gt;checksum			= 0;
	iphdr-&gt;sourceIP			= inet_addr(&quot;192.168.0.4&quot;);
	iphdr-&gt;destIP			= inet_addr(&quot;192.168.0.1&quot;);

	iphdr-&gt;checksum			= checksum((unsigned short*) iphdr, sizeof(struct iphdr));

	printf(&quot;Checksum: %d\n&quot;, iphdr-&gt;checksum);

	return 0;
}

unsigned short checksum(unsigned short *buffer, int size)
{
	unsigned long csum=0;

	while(size &gt; 1) 
	{
		csum += *buffer++;
		size -= sizeof(unsigned short);
	}

	if(size) 
	{
		csum += *(unsigned short *)buffer;
	}

	csum = (csum &gt;&gt; 16) + (csum &amp; 0xffff);
	csum += (csum &gt;&gt;16);
	return (unsigned short)(~csum);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/486308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/486308</guid><dc:creator><![CDATA[PhilippSt]]></dc:creator><pubDate>Mon, 22 Mar 2004 17:31:39 GMT</pubDate></item></channel></rss>