C# IP im Chat Bannen.

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 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.

      Quellcode

      1. private void CreateNewClientManager(Socket socket)
      2. {
      3. ClientManager newClientManager = new ClientManager(socket);
      4. newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      5. newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);
      6. if ([COLOR=red]newClientManager.IP == "127.0.0.1"[/COLOR])
      7. {
      8. //this.CheckForAbnormalDC(newClientManager);
      9. //this.clients.Add(newClientManager);
      10. //this.UpdateConsole("Connected.", newClientManager.IP, newClientManager.Port);
      11. }
      12. else
      13. {
      14. this.CheckForAbnormalDC(newClientManager);
      15. this.clients.Add(newClientManager);
      16. this.UpdateConsole("Connected.", newClientManager.IP, newClientManager.Port);
      17. }
      18. }
      Alles anzeigen



      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? :(
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • 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
    • Quellcode

      1. [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

      ichbinniemand;242921 schrieb:

      so kann es nicht funktionieren

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

      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
    • 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:

      private void CreateNewClientManagerAndIPBann(Socket socket)
      {
      ClientManager newClientManager = new ClientManager(socket);
      newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);

      // IP Bann
      string IPBANN1 = "127.0.0.1";

      if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN1).Address)
      {
      //Client disconnecten.
      }
      else
      {
      this.CheckForAbnormalDC(newClientManager);
      this.clients.Add(newClientManager);
      this.UpdateConsole("Verbunden:", newClientManager.IP, newClientManager.Port);
      }
      }
      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:
      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
    • Hab noch eine Frage, versuche gerade eine IP Kickfunktion zu bauen.
      Würd die gerne hier rein bauen:

      private void CreateNewClientManagerAndIPBann(Socket socket)
      {
      ClientManager newClientManager = new ClientManager(socket);
      newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);

      // IP Bann
      string IPBANN1 = "127.0.0.0";
      string IPBANN2 = "127.0.0.0";
      string IPBANN3 = "127.0.0.0";

      if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN1).Address)
      {
      //Client disconnecten.
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN1 + " hat sich versucht zu verbinden!");
      }

      else if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN2).Address)
      {
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN2 + " hat sich versucht zu verbinden!");

      }
      else if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN3).Address)
      {
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN3 + " hat sich versucht zu verbinden!");

      }

      // IP Bann Ende
      else
      {
      this.CheckForAbnormalDC(newClientManager);
      this.clients.Add(newClientManager);
      this.UpdateConsole("Verbunden:", newClientManager.IP, newClientManager.Port);
      }
      }
      Habe es schon öfters ausprobiert, zB. so:

      private void CreateNewClientManagerAndIPBann(Socket socket)
      {
      ClientManager newClientManager = new ClientManager(socket);
      newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);

      // IP Bann
      string IPBANN1 = "127.0.0.0";
      string IPBANN2 = "127.0.0.0";
      string IPBANN3 = "127.0.0.0";

      if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN1).Address)
      {
      //Client disconnecten.
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN1 + " hat sich versucht zu verbinden!");
      }

      else if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN2).Address)
      {
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN2 + " hat sich versucht zu verbinden!");

      }
      else if (newClientManager.IP.Address == System.Net.IPAddress.Parse(IPBANN3).Address)
      {
      socket.Dispose();
      Console.WriteLine("[" + DateTime.Now + "]" + "Die IP: " + IPBANN3 + " hat sich versucht zu verbinden!");

      }

      else if (Console.ReadLine() == newClientManager.IP.Address == System.Net.IPAddress.Parse(Console.ReadLine())

      {
      socket.Dispose();
      }

      // IP Bann Ende
      else
      {
      this.CheckForAbnormalDC(newClientManager);
      this.clients.Add(newClientManager);
      this.UpdateConsole("Verbunden:", newClientManager.IP, newClientManager.Port);
      }
      }


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

      Würde mich freuen wenn mir einer helfen könnte :]
    • 1. verwende doch einen array für die gebannten arrays
      2.
      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
      newClientManager.IP.ToString == IPBANN1

      3. Es gibt sogenannte Code tags hier im forum
      4. versuchs mal mit 3 verschiedenen ips, nicht mit 3 gleichen
    • 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

      Quellcode

      1. List<string> ipbans = new List<string>();
      2. //neuer ip ban:
      3. string iptoban = "127.0.0.1"; //<-- da entsprechend variabeln einsetezn
      4. ipbans.Add(iptoban);
      5. //methode zur Überprüfung auf ban mit einer einfachen schleife
      6. for (int i = 0; i < ipbans.Count; i++)
      7. {
      8. if (newClientManager.IP.ToString == ipbans[i])
      9. {
      10. //hier dann entsprechend methode zum bannen aufrufen
      11. break; //<-- break steht hier damit die schleife hier abbricht und nicht die restlichen bans durchsucht da ein ban ja bereits gefunden wurde.
      12. }
      13. }
      Alles anzeigen
      Das beste für Dauerhafte bans bleibt natürlich die externe Speicherung dieser mit effizienten mitteln. Wo wir wieder bei den Datenbanken wären.

    • private void CreateNewClientManagerAndIPBann(Socket socket)
      {
      List<string> ipbans = new List<string>();

      //neuer IP Bannn
      string iptoban = "127.0.0.1";
      ipbans.Add(iptoban);

      ClientManager newClientManager = new ClientManager(socket);
      newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);

      //Überprüfungsmethode
      for (int i = 0; i < ipbans.Count; i++)
      {
      if (newClientManager.IP.Address == ipbans)
      {
      socket.Dispose();
      break;
      }
      else
      {
      this.CheckForAbnormalDC(newClientManager);
      this.clients.Add(newClientManager);
      this.UpdateConsole("Connected.", newClientManager.IP, newClientManager.Port);
      }
      }
      }

      So funktioniert das bannen schonmal nicht:
      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:

      private void CreateNewClientManagerAndIPBann(Socket socket)
      {
      List<string> ipbans = new List<string>();

      //neuer IP Bannn
      string iptoban = "127.0.0.1";
      ipbans.Add(iptoban);

      ClientManager newClientManager = new ClientManager(socket);
      newClientManager.CommandReceived += new CommandReceivedEventHandler(CommandReceived);
      newClientManager.Disconnected += new DisconnectedEventHandler(ClientDisconnected);

      //Überprüfungsmethode
      for (int i = 0; i < ipbans.Count; i++)
      {
      if (newClientManager.IP.Address == iptoban[i])
      {
      socket.Dispose();
      break;
      }
      else
      {
      this.CheckForAbnormalDC(newClientManager);
      this.clients.Add(newClientManager);
      this.UpdateConsole("Connected.", newClientManager.IP, newClientManager.Port);
      }
      }
      }


      Konnte aber trotzdem chatten.
      Was nun? :o