IP Adresse in INT ändern
undso
- java
0 MudGuard0 undso0 Sven Rautenberg0 undso0 Sven Rautenberg0 undso
0 Daniel Thoma
0 Sven Rautenberg
Hi Forum,
ich bräuchte die IP Adresse als Zahl, weiß aber gerade nicht, ob ich das Replacezeugs richtig mache und wie ich das ganze in ein INT gleich umwandeln kann:
int zahl= request.getRemoteAddr().replaceAll(".", "")
Grüße
Hi,
ich bräuchte die IP Adresse als Zahl, weiß aber gerade nicht, ob ich das Replacezeugs richtig mache und wie ich das ganze in ein INT gleich umwandeln kann:
int zahl= request.getRemoteAddr().replaceAll(".", "")
Daß das nicht funktionieren kann, siehst Du an diesem Beispiel:
12.3.4.5 -> 12345
1.23.4.5 -> 12345
ErsterTeil * 16777216 + ZweiterTeil * 65536 + DritterTeil * 256 + VierterTeil
(16777216 = 256^3, 65536 = 256^2)
cu,
Andreas
hi,
danke für die schnelle antworten.
ja ihr habt beide recht. vorallem auf die problematik von Andreas habe ich nicht gedacht.
Ich wollte beim registrieren eine IP sperren, damit man nicht hintereinander gleich zweimal zwei registrierungen auslöst.
Hatte da ein Script/Funktion, wo man aber nur INT und Long für eine Sperrung übergeben, deshalb hatte ich mir überlegen, dass ich die IP nehme, alle Punkte entferne und diesen Vorgang für 5 min sperre.
D.h., ich muss entweder die Funktion umschreiben, dass er auch ein String empfängt (Also die richtige IP) oder ich lege die gesperrte IP's mit Timestamp in die Datenbank, welches ich mir aber aus Perfomancegründen ersparen wollte, immerwieder Zugriffe auf die DB zu machen.
Grüße
Moin!
Hatte da ein Script/Funktion, wo man aber nur INT und Long für eine Sperrung übergeben, deshalb hatte ich mir überlegen, dass ich die IP nehme, alle Punkte entferne und diesen Vorgang für 5 min sperre.
Da Java keine vorzeichenlosen Zahlen kennt, und das Handhaben vorzeichenbehafteter INTs eventuell etwas heikel sein könnte (da habe ich aber keine Erfahrungen - in PHP wär's mir heikel), verbleibt ja sowieso nur long.
String an den Punkten splitten, Einzelteile multiplizieren je nach Position, und addieren - fertig ist die "binäre" IP-Darstellung (im Gegensatz zu dotted-quad).
D.h., ich muss entweder die Funktion umschreiben, dass er auch ein String empfängt (Also die richtige IP) oder ich lege die gesperrte IP's mit Timestamp in die Datenbank, welches ich mir aber aus Perfomancegründen ersparen wollte, immerwieder Zugriffe auf die DB zu machen.
Mache dir um die Performance genau in dem Moment Gedanken, wo sie sich fehlend bemerkbar macht - nicht vorher. Vermutlich willst du gerade Probleme lösen oder umgehen, die nie relevant werden, mit einem riesigen Aufwand, der nicht gerechtfertigt ist.
- Sven Rautenberg
Hi Sven,
Mache dir um die Performance genau in dem Moment Gedanken, wo sie sich fehlend bemerkbar macht - nicht vorher. Vermutlich willst du gerade Probleme lösen oder umgehen, die nie relevant werden, mit einem riesigen Aufwand, der nicht gerechtfertigt ist.
ja genau, hier hast du eigentlich recht. Mir wurde eben von Freunden ans Herz gelegt, so wenige DB-Abfragen wie möglich zu machen und den die DB an sich nicht zuzumüllen, deshalb schrecke ich da wahrscheinlich unberechtigt zu schnell ab ;)
Grüße
Moin!
Mache dir um die Performance genau in dem Moment Gedanken, wo sie sich fehlend bemerkbar macht - nicht vorher. Vermutlich willst du gerade Probleme lösen oder umgehen, die nie relevant werden, mit einem riesigen Aufwand, der nicht gerechtfertigt ist.
ja genau, hier hast du eigentlich recht. Mir wurde eben von Freunden ans Herz gelegt, so wenige DB-Abfragen wie möglich zu machen und den die DB an sich nicht zuzumüllen, deshalb schrecke ich da wahrscheinlich unberechtigt zu schnell ab ;)
Es gibt natürlich gewisse Dinge, die man lassen sollte. Der Klassiker: Eine DB-Abfrage mit potentiell tausend Ergebniszeilen machen, und dann für jede dieser Zeilen in einer Schleife nochmal eine neue, einzelne Abfrage in einer anderen Tabelle machen. Für sowas wurden JOINs erfunden. :)
Und selbstverständlich wird eine Datenbanktabelle für so ein Sperrvorhaben ab einer gewissen Menge an Anfragen zum Engpaß. Soweit muß es aber erst einmal kommen. Und das dann zu umgehen erfordert dann auch etwas mehr an Fachwissen.
Siehe dieses Forum: Weil die Datenhaltung in XML-Dateien zu unperformat wurde, wird der aktive Teil des Forums jetzt komplett im RAM gehalten. Hatte seinerzeit einen riesigen Neuentwicklungsaufwand mit sich gebracht - der hat sich aber nur deswegen gelohnt, weil das Performanceproblem real war, nicht nur potentiell.
- Sven Rautenberg
Hi,
Es gibt natürlich gewisse Dinge, die man lassen sollte. Der Klassiker: Eine DB-Abfrage mit potentiell tausend Ergebniszeilen machen, und dann für jede dieser Zeilen in einer Schleife nochmal eine neue, einzelne Abfrage in einer anderen Tabelle machen. Für sowas wurden JOINs erfunden. :)
Ja, das ist jetzt auch Extremfall, welches man nie und nimmer machen darf ;)
Und selbstverständlich wird eine Datenbanktabelle für so ein Sperrvorhaben ab einer gewissen Menge an Anfragen zum Engpaß. Soweit muß es aber erst einmal kommen. Und das dann zu umgehen erfordert dann auch etwas mehr an Fachwissen.
Bis zu diesem Zeitpunkt muss ich entweder sehr sehr viel lernen oder Experten heranziehen. Wie aber schon erwähnt, soweit muss man es erst einmal bringen ;) So grob denke ich, dass es kritisch wird, wenn gleichzeitig zwischen 500-1000 USer Online sind. Das wird man aber so pauschal nicht sagen können.
Siehe dieses Forum: Weil die Datenhaltung in XML-Dateien zu unperformat wurde, wird der aktive Teil des Forums jetzt komplett im RAM gehalten. Hatte seinerzeit einen riesigen Neuentwicklungsaufwand mit sich gebracht - der hat sich aber nur deswegen gelohnt, weil das Performanceproblem real war, nicht nur potentiell.
Ich schaue dann, dass ich die Programmierung vorantreibe, anstatt mich über Perfomance und Kleinigkeiten Gedanken mache. Erst wenn real Probleme auftreten, kann man der Sache bewusst rangehen.
Viele Grüße und vielen Dank für die nette Erklärung und Aufmunterung...
P.S. ich hatte vor kurzem noch ein anderes Problem, worauf ich leider nocht keine antort erhalten habe:
http://forum.de.selfhtml.org/?t=166515&m=1085967
Hätte mir jemand eventuell Tipps wie ich die Abfrage realisieren muss? Bzw. auf was ich zugreifen kann.
Vielleicht konnte ich mein Problem auch nicht gut schildern.
Hallo Sven,
Da Java keine vorzeichenlosen Zahlen kennt, und das Handhaben vorzeichenbehafteter INTs eventuell etwas heikel sein könnte (da habe ich aber keine Erfahrungen - in PHP wär's mir heikel), verbleibt ja sowieso nur long.
So lang man nur mit Bit-Operatoren rumspielt, sollte das kein Problem sein. Da interessiert einen ja nicht, wie Zahlen binär codiert werden.
Einzig beim right-shift sollte man wohl den Operator >>> verwenden, der das Vorzeichen nicht berücksichtigt.
Grüße
Daniel
Moin!
ich bräuchte die IP Adresse als Zahl
Definiere "Zahl".
IP-Adressen kann man, da es sich (zumindest bei IPv4) technisch nur um 4 Bytes handelt, natürlich auch in eine vorzeichenlose 32-Bit-Ganzzahl umrechnen.
Das geht aber sicher anders, als du es hier versuchst. :)
Die Frage wäre ja zuerst mal: Warum eine Zahl? Und angesichts der Tatsache, dass IPv6 auch demnächst irgendwann relevant wird: Wie gehst du damit dann um, wenn Netzwerkadressen nicht mehr nur 32 Bit lang sind, sondern 128 Bit? :)
- Sven Rautenberg