Tach auch,
Inet_Addr meldet bei Delphi 7 beim Ergebnistyp cardinal eine Bereichsüberschreitung wenn die IP größer als xxx.xxx.xxx.127 ist.
Sehe ich das richtig ?
Folgendes Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var s,s1,s2 : string; c1 : int64; c2 :cardinal; begin s:=Edit1.Text; c1 := Inet_Addr(PChar(s)); c2 := Inet_Addr(PChar(s)); s1 := IntToHex(c1, 10); s2 := IntToHex(c2, 8); ... end; |
Im o.g. Beispiel ergibt die IP s:='192.168.1.2' die Hex-Ausgabe c1:=0201A8C0 also 02.01.A8.C0 in Dezimal 2.1.168.192
Die IP-Adresse 192.168.1.2 beginnt also mit dem Low-Byte! In vielen Postings im Forum wird es übrigens (mit cardinal) anderherum umgerechnet.
Das hat zur Konsequenz, dass ein cardinal-Typ bei 192.168.2.127 mit dem Ergebnis 7F01A8C0 korrekt arbeitet, aber bei 192.168.2.128 (=8001A8C0) einen Bereichsfehler ergibt da Inet_Addr ein negatives Ergebnis zurückgibt. Was in cardinal nicht definiert ist.
Der Typ int64 (in c1) gibt bei 192.168.2.128 den Wert (..FF)8001A8C0.
Also ist hier ein typecast mit
Delphi-Quelltext
1: 2:
| c2 := cardinal(Inet_Addr(PChar(s))); |
angesagt.
Eine Subtraktion von 192.168.2.128 - 192.168.2.127 ergibt somit Hex 1000000 was nach Wandlung in IP (inet_ntoa) wiederum dez 1 gibt.
Dann ist die IP im IP-Header als 32-Bit Adresse mit führendem Low-Bit? Im Wireshark ist sie jedenfalls mit führendem Lo-Byte zu sehen. Also sozusagen mit der 192. beginnend.
Oder ist da etwas falsch?