C# IP im Chat Bannen.

  • Hallo liebe Community.

    Ich habe einen TCP Chat geschrieben, der funktioniert soweit auch ganz gut.
    Nun möchte ich eine Funktion einbauen, die IP´s bannt, indem man diese im Source beim Login abfragt.

    Ich versuche das gerade so, funktioniert aber nicht.

    Zitat


    Fehler 1 Der Operator "==" kann nicht auf Operanden vom Typ "System.Net.IPAddress" und "string" angewendet werden. C:\Users\Dustin\Documents\Visual Studio 2010\Projects\CommandServer\ConsoleServer\Program.cs 71 17 ConsoleServer

    Was mache ich dort falsch? :(

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Das sollte gehen, hab's aber nicht getestet:

    Code
    [COLOR=red]newClientManager.IP == [/COLOR]System.Net.IPAddress.Parse([COLOR=red]"127.0.0.1"[/COLOR])

    lg Ich;

  • Compillen hat funktioniert, leider kann ich mich trotzdem noch verbindem sprich es hat nicht geklappt.

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Probier mal statt 127.0.0.1 deine richtige Netzwerk IP, wenn dein Socket auf 0.0.0.0 listened, dann connectest du mit deiner Netzwerk ip.

    Wenn das auch nicht klappt, lass dir deine IP beim verbinden ausgeben.
    lg Ich;

  • Habe es nun mit der IP "192.168.1.1", "127.0.0.1" und mit meiner richtigen staatlichen IP versucht.
    Dann habe ich mir die IP beim connecten ausgeben lassen, es kam 127.0.0.1 raus.

    Aber keins von dem wird geblockt. :(

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Zitat von ichbinniemand;242921

    so kann es nicht funktionieren


    Haben wir auchschon festgestellt, dass es nicht klappt.
    Weißt du vllt. mehr? :(

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Oh gott das ist anfänger programmierung:

    Thema: Memory Management.

    Beim verwenden einer klasse wird der speicher dafür zu erst resaviert und dann belegt, in der variable wird dann der sogenannte zeiger gespeichert, welcher letztendlich nix anderes ist als die position wo sich diese klasse im speicher befindet.
    Vergleichst 2 klassen vergleichst du nicht ob die strukturen gleich sind oder der datensatz der selbe ist, du vergleichst lediglich ob sie sich an der selben speicherposition befinden. Du hast deine IP klasse newClientManager.IP die sich irgendwo im speicher befindet, und dann erstellst du mit System.Net.IPAddress.Parse("127.0.0.1") erneut eine klasse, die natürlich weil sie neu erstellt wird irgendwo ganz anders befindet. Für den PC sieht es so aus als würde es sich um eine komplett andere klasse handeln, obwohl es für dich ganz logisch aussieht.

    Du kannst auf diese weise nur atomare typen: Integrale, Floats und strings vergleichen. keine klassen, da dann der speicher verglichen wird

    Zitat von Steve Jobs

    Stay hungry - stay foolish.



  • Code
    [COLOR=red]newClientManager.IP.Address == [/COLOR]System.Net.IPAddress.Parse([COLOR=red]"127.0.0.1"[/COLOR]).Address

    So MUSS es einfach gehen. Wenn nicht, ist an einer anderen Stelle der Fehler, hab extra kurz bei mir getestet

    Zitat von ichbinniemand;242921

    so kann es nicht funktionieren


    Stimmt natürlich. Keine Ahnung was ich mir da gedacht habe. :D
    lg Ich;

  • Zitat von ichbinniemand;242925

    Oh gott das ist anfänger programmierung:

    Thema: Memory Management.

    Beim verwenden einer klasse wird der speicher dafür zu erst resaviert und dann belegt, in der variable wird dann der sogenannte zeiger gespeichert, welcher letztendlich nix anderes ist als die position wo sich diese klasse im speicher befindet.
    Vergleichst 2 klassen vergleichst du nicht ob die strukturen gleich sind oder der datensatz der selbe ist, du vergleichst lediglich ob sie sich an der selben speicherposition befinden. Du hast deine IP klasse newClientManager.IP die sich irgendwo im speicher befindet, und dann erstellst du mit System.Net.IPAddress.Parse("127.0.0.1") erneut eine klasse, die natürlich weil sie neu erstellt wird irgendwo ganz anders befindet. Für den PC sieht es so aus als würde es sich um eine komplett andere klasse handeln, obwohl es für dich ganz logisch aussieht.

    Du kannst auf diese weise nur atomare typen: Integrale, Floats und strings vergleichen. keine klassen, da dann der speicher verglichen wird



    Oh Gott ich bin Anfänger in C# ...
    Hat mir leider wenig geholfen..

    Dardan
    Hat funktioniert :)) Danke Dir :D

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Du hast doch vorher schon was in programmieren gemacht oder verwechsel ich da was?

    Also wie gesagt du kannst nichts vergleichen was kein Int, Double, Float, Char, Byte, String, enum, etc ist also alle Objekte fallen weg

    Zitat von Steve Jobs

    Stay hungry - stay foolish.



  • Hallo,
    habe nun die restlichen Tage versuchte den Client disconnecten zu lassen, wenn die IP banned ist, leider habe ich es nicht geschafft.

    Der Code lautet bisher so:

    Die gebannte Verbindung ist immernoch mit dem Server verbunden, wie kann ich die Verbindung beenden, wenn er banned ist?
    Mit newClientmanager.Dissconnect(); habe ich es versucht, scheint aber nicht zu funktionieren, da ich diesen Error bekomme, wenn ich flodde:

    Zitat

    Auf das verworfene Objekt kann nicht zugegriffen werden.
    Objektname: "System.Net.Sockets.Socket".


    Oder ist das normal? Weil eigentlich sollte die Verbindung ja getrennt sein, und kein Error rausspringen :o

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • Socket.Dispose() ? damit wird die Komplette klasse gelöscht und damit hat der client keinen verbindungspunkt mehr und bekommt nen error

    Zitat von Steve Jobs

    Stay hungry - stay foolish.



  • Hab noch eine Frage, versuche gerade eine IP Kickfunktion zu bauen.
    Würd die gerne hier rein bauen:

    Habe es schon öfters ausprobiert, zB. so:

    Funktioniert aber nicht, hab auch schon gegoogelt und so, leider ekin Erfolg gehabt.

    Würde mich freuen wenn mir einer helfen könnte :]

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • 1. verwende doch einen array für die gebannten arrays
    2.

    Zitat

    newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN1).Address


    ist absolut unperformant, da du zu erst die ip adresse parst um sie dann in eine int adresse umzuwandeln, verwende doch einfach

    Zitat

    newClientManager.IP.ToString == IPBANN1


    3. Es gibt sogenannte Code tags hier im forum
    4. versuchs mal mit 3 verschiedenen ips, nicht mit 3 gleichen

    Zitat von Steve Jobs

    Stay hungry - stay foolish.



  • Hier kommts drauf an obs perfomant geregelt werden soll!
    Soll es relativ unperfomant gemacht werden so schreibste die Bans in ne neue Datei. Die wird dann überprüft ob die IP bereits gebannt wurde.

    Ansonsten ist es sehr ratsam wie ichbinniemand schon sagte arrays zu nutzen.

    Da du sowieso an einem Chat arbeitest solltest du evt. darüber nachdenken eine Datenbank einzubauen. Macht bei so einem Projekt nämlich tatsächlich Sinn, sofern man vorhat überhaupt soweit zu gehen.

    Datenbanken kannste eigentlich ja relativ leicht einbinden. Entweder nimmste SQLite oder Mysql. Die entsprechenden Snippets dazu findest ja sowieso schon hier im Forum.


    btt:
    da bans ja unendlich sind lohnt sich ein feldarray nicht. Kannst aber eine List Klasse verwenden

    Das beste für Dauerhafte bans bleibt natürlich die externe Speicherung dieser mit effizienten mitteln. Wo wir wieder bei den Datenbanken wären.


  • So funktioniert das bannen schonmal nicht:

    Zitat

    Fehler 1 Der Operator "==" kann nicht auf Operanden vom Typ "long" und "string" angewendet werden. C:\Users\Dustin\Documents\Visual Studio 2010\Projects\CommandServer\ConsoleServer\Program.cs 80 21 ConsoleServer

    Hab es dann so versucht:

    Konnte aber trotzdem chatten.
    Was nun? :o

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

  • aus
    newClientManager.IP.Address == ipbans[i]
    musst du
    newClientManager.IP.ToString == ipbans[i]
    (ja kein vollständiger satz)
    ailien
    Warum sollte eine Array klasse besser sein als ein normaler array? letztendlich läuft beides aufs gleiche hinaus, nur die klasse nimmt dir ein bisschen arbeit ab

    Zitat von Steve Jobs

    Stay hungry - stay foolish.



  • Zitat

    Fehler 1 Der Operator "==" kann nicht auf Operanden vom Typ "Methodengruppe" und "string" angewendet werden. C:\Users\Dustin\Documents\Visual Studio 2010\Projects\CommandServer\ConsoleServer\Program.cs 80 21 ConsoleServer

    So kommt dieses hier.

    // Fixed
    So muss es sein:
    newClientManager.IP.ToString() == ipbans[i]

    [LEFT][COLOR=Yellow][SIZE=2][FONT=Verdana]mfG.[/FONT][/SIZE][/COLOR]
    [/LEFT]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!