<?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[ICMP Header Probleme]]></title><description><![CDATA[<p>Ich baue gerade in mein Netzwerkmodul eine Ping-Funktion ein auf Basis von<br />
<a href="http://www.c-worker.ch/tuts/raw_icmp.php" rel="nofollow">http://www.c-worker.ch/tuts/raw_icmp.php</a></p>
<p>Problem ist, dass ich nicht C nutze. Also ich habe das ganze in meiner Sprache nachgebastelt und konnte nun die meisten Fehlerquellen ausschließen. Der Echo Request wird richtig gesendet usw. und dann bleibt er bei recvfrom stehen, wartet das Timeout ab und dann kommt SOCKET_ERROR mit WSAGetLastError() = 0.</p>
<p>Ich denke, das Problem liegt bei ICMP genauer bei der Checksum. So sieht der Buffer aus, den ich versende:<br />
<a href="http://vertex.dreamfall.at/icmp.gif" rel="nofollow">http://vertex.dreamfall.at/icmp.gif</a></p>
<p>Bzw. nochmal alles unter der Lupe:</p>
<pre><code>08 00 34 1B DC 07 00 00 05 46 B2 00 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00

Type      = 0x08 -&gt; ECHO_REPLY
Code      = 0x00
Checksum  = 0x341B
ID        = 0xDC07 -&gt; CurrentProcessId()
Sequency  = 0x0000
Timestamp = 0x0546 -&gt; GetTickCount()
Data      = 0xB20048656C6C6F2C20776F726C642100 -&gt; &quot;Hello, world!&quot;
</code></pre>
<p>Die Prüfsumme wird so berechnet:<br />
<a href="http://eth0.graegert.com/index.php?page=96#ICMP%20Header%20Checksum" rel="nofollow">http://eth0.graegert.com/index.php?page=96#ICMP Header Checksum</a></p>
<p>Das habe ich nochmal manuell gemacht:<br />
Checksum Feld zu 0x0000 setzen, Einer-Komplement bilden:</p>
<pre><code>08 00 -&gt; F7 FF -&gt;  63487
00 00 -&gt; FF FF -&gt;  65535
DC 07 -&gt; 23 F8 -&gt;   9208
00 00 -&gt; FF FF -&gt;  65535
05 46 -&gt; FA B9 -&gt;  64185
B2 00 -&gt; 4D FF -&gt;  19967
48 65 -&gt; B7 9A -&gt;  47002
6C 6C -&gt; 93 93 -&gt;  37779
6F 2C -&gt; 90 D3 -&gt;  37075
20 77 -&gt; DF 88 -&gt;  57224
6F 72 -&gt; 90 8D -&gt;  37005
6C 64 -&gt; 93 9B -&gt;  37787
21 00 -&gt; DE FF -&gt;  57087
</code></pre>
<p>Die ganzen Komplemente nun zusammenaddieren ergibt 598876 dezimal bzw. 10010010001101011100 binär. Die letzten 16 Bit herausfiltern damit das in ein Short passt: 0010001101011100 und dann davon das Einer-Komplement bilden:<br />
1101110010100011 ergibt 0xDCA3 was von 0x341B abweicht.</p>
<p>Setze ich 0xDCA3 als Checksumme geht es übrigens auch nicht. Also habe ich mich vllt. auch hier verrechnet.</p>
<p>Kann mir jemand mit dem C Code die Prüfsumme berechnen? Ist der Header überhaupt richtig aufgebaut?</p>
<p>mfg olli</p>
<p>Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping <a href="http://google.de" rel="nofollow">google.de</a> bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181914/icmp-header-probleme</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 03:34:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181914.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 May 2007 18:34:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ICMP Header Probleme on Fri, 18 May 2007 19:24:33 GMT]]></title><description><![CDATA[<p>Ich baue gerade in mein Netzwerkmodul eine Ping-Funktion ein auf Basis von<br />
<a href="http://www.c-worker.ch/tuts/raw_icmp.php" rel="nofollow">http://www.c-worker.ch/tuts/raw_icmp.php</a></p>
<p>Problem ist, dass ich nicht C nutze. Also ich habe das ganze in meiner Sprache nachgebastelt und konnte nun die meisten Fehlerquellen ausschließen. Der Echo Request wird richtig gesendet usw. und dann bleibt er bei recvfrom stehen, wartet das Timeout ab und dann kommt SOCKET_ERROR mit WSAGetLastError() = 0.</p>
<p>Ich denke, das Problem liegt bei ICMP genauer bei der Checksum. So sieht der Buffer aus, den ich versende:<br />
<a href="http://vertex.dreamfall.at/icmp.gif" rel="nofollow">http://vertex.dreamfall.at/icmp.gif</a></p>
<p>Bzw. nochmal alles unter der Lupe:</p>
<pre><code>08 00 34 1B DC 07 00 00 05 46 B2 00 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00

Type      = 0x08 -&gt; ECHO_REPLY
Code      = 0x00
Checksum  = 0x341B
ID        = 0xDC07 -&gt; CurrentProcessId()
Sequency  = 0x0000
Timestamp = 0x0546 -&gt; GetTickCount()
Data      = 0xB20048656C6C6F2C20776F726C642100 -&gt; &quot;Hello, world!&quot;
</code></pre>
<p>Die Prüfsumme wird so berechnet:<br />
<a href="http://eth0.graegert.com/index.php?page=96#ICMP%20Header%20Checksum" rel="nofollow">http://eth0.graegert.com/index.php?page=96#ICMP Header Checksum</a></p>
<p>Das habe ich nochmal manuell gemacht:<br />
Checksum Feld zu 0x0000 setzen, Einer-Komplement bilden:</p>
<pre><code>08 00 -&gt; F7 FF -&gt;  63487
00 00 -&gt; FF FF -&gt;  65535
DC 07 -&gt; 23 F8 -&gt;   9208
00 00 -&gt; FF FF -&gt;  65535
05 46 -&gt; FA B9 -&gt;  64185
B2 00 -&gt; 4D FF -&gt;  19967
48 65 -&gt; B7 9A -&gt;  47002
6C 6C -&gt; 93 93 -&gt;  37779
6F 2C -&gt; 90 D3 -&gt;  37075
20 77 -&gt; DF 88 -&gt;  57224
6F 72 -&gt; 90 8D -&gt;  37005
6C 64 -&gt; 93 9B -&gt;  37787
21 00 -&gt; DE FF -&gt;  57087
</code></pre>
<p>Die ganzen Komplemente nun zusammenaddieren ergibt 598876 dezimal bzw. 10010010001101011100 binär. Die letzten 16 Bit herausfiltern damit das in ein Short passt: 0010001101011100 und dann davon das Einer-Komplement bilden:<br />
1101110010100011 ergibt 0xDCA3 was von 0x341B abweicht.</p>
<p>Setze ich 0xDCA3 als Checksumme geht es übrigens auch nicht. Also habe ich mich vllt. auch hier verrechnet.</p>
<p>Kann mir jemand mit dem C Code die Prüfsumme berechnen? Ist der Header überhaupt richtig aufgebaut?</p>
<p>mfg olli</p>
<p>Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping <a href="http://google.de" rel="nofollow">google.de</a> bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1287609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1287609</guid><dc:creator><![CDATA[Vertex]]></dc:creator><pubDate>Fri, 18 May 2007 19:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to ICMP Header Probleme on Fri, 18 May 2007 20:04:21 GMT]]></title><description><![CDATA[<p>Vertex schrieb:</p>
<blockquote>
<p>Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping <a href="http://google.de" rel="nofollow">google.de</a> bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.</p>
</blockquote>
<p>dann schau dir mal an, was wireshark zu deinen paketen sagt.<br />
wireshark erkennt auch falsche prüfsummen...<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1287650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1287650</guid><dc:creator><![CDATA[pale dog]]></dc:creator><pubDate>Fri, 18 May 2007 20:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to ICMP Header Probleme on Fri, 18 May 2007 20:48:53 GMT]]></title><description><![CDATA[<p>Hehe, ja, auf die Idee hätte ich wohl kommen müssen ^^ Wireshark hat es angezeigt &quot;Checksum: 0xca14 [incorrect, should be 0x14ca]&quot; es lag also an der Byteorder. Hatte zudem den Pointer immer mit Buffer :+ 2 erhöht dabei hätte es Buffer :+ 1 sein müssen(ich war von 2 ausgegangen, da er ja immer um 2 Byte verschoben werden musste)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1287675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1287675</guid><dc:creator><![CDATA[Vertex]]></dc:creator><pubDate>Fri, 18 May 2007 20:48:53 GMT</pubDate></item></channel></rss>