Ip2Nation – the c# way

Eine IP-Adressen einem Land programmatisch zuzuweisen ist eigentlich nicht schwer. Im Netz finden sich einige freie Datenbanken, aus denen man die notwendigen Informationen abgreifen kann. Auf www.ip2nation.com findet man z.B. einen MySQL Dump sowie diverse Beispielscripte, um eine Abfrage dieser Art in PHP zu bauen.

Mehr oder weniger problematisch wird das ganze allerdings, wenn man versucht eines der Beispiele von ip2nation für C#.NET umzubauen. Zwar lassen sich die etsprechenden Tabelle und Inhalte recht einfach auch in einen MS SQL Server importieren (lediglich der Datentyp der Spalte ip in der Tabelle ip2nation muß in den Datentyp bigint geändert werden). T-SQL verfügt allerdings nicht über eine INET_ATON-Funktion, wie man sie z.B. von MySQL kennt.

Kurz zum Verständnis: INET_ATON ist eine MySQL Funktion, die eine Ganzzahl zurück gibt, welche den numerischen Wert einer Netzwerk-Adresse darstellt.

Für C# benötigen wir daher zunächst mal ein entsprechendes Äquvalent für die INET_ATON Funktion:


private double DotNetINET_ATON(string RealIP)
{
int x;
string [] arrIPSplit;
double num = 0;
if RealIP == "")
{
return 0;
}
else
{
arrIPSplit = RealIP.Split('.');
for(x = arrIPSplit.Length - 1; x >= 0 ; x --)
{
num += ((int.Parse(arrIPSplit[x])%256) * Math.Pow(256 ,(3 - x )));
}
return num;
}
}

Das SQL Statement kann dann auch schon fast so bleiben wie es im Beispiele von ip2nation angezeigt wird, lediglich das „LIMIT 0,1“ sollte man gegen ein TOP 1 austauschen, da MS SQL diesen Befehl nicht kennt. Im Rahmen einer Stored Procedure würde das Ganze dann etwa so aussehen:


ALTER PROCEDURE GetNation
(
@ip bigint = null
)
AS

SELECT TOP 1
c.country
FROM
ip2nationCountries c,
ip2nation i
WHERE
i.ip < @ip AND c.code = i.country ORDER BY i.ip DESC

Und das war´s eigentlich auch schon. Nun sollte ein einfacher Aufruf DotNetINET_ATON(ip) den numerischen Wert einer Netzwerk-Adresse zurückgeben, die man dann auf die Datenbank bzw. Stored Procedure jagen kann.

Ob der Code richtig arbeitet, kann man übrigends leicht durch die IP 127.0.0.1 feststellen. Hier sollte DotNetINET_ATON als Return-Wert 2130706433 zurückgeben.