none
Bei TCP-Socket nur bestimmte RemoteEndpointIP akzeptieren? RRS feed

  • Frage

  • Hallo Community!

    Im Rahmen meiner Recherche über asynchrone Empfangsvorgänge über TCP bin ich auf die Verwendung von Sockets gestoßen. Ich habe jetzt schon ein asynchrones Empfangsprogramm geschrieben, jedoch würde ich noch eine Einstellung mehr treffen, für die ich im Moment keine Lösung finde:

    private void start_async_rcv()
        {
          IPEndPoint localEP = new IPEndPoint(this.local_ip, this.port);
          Socket listener = new Socket(localEP.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    
          listener.Bind(localEP);
          listener.Listen(1);
          listener.BeginAccept(new AsyncCallback(acceptCallback), listener);
    
        }
    

    Ich würde gerne NUR RemoteEndpoints akzeptieren, die ich vorgebe. Im Moment wartet der ja nur auf "irgendeine" Verbindung, wie ich das sehe.

    Ich habe schon etwas rumprobiert im acceptCallback um die RemotePointIP auszuwerten und dann bei Nicht-Übereinstimmung mit der Vorgabe die Verbindung wieder aufzugeben und neu zu horchen. Aber das gelingt mir im Moment nur mit String-Vergleichen und Parsing, was ja, wie ich schon in einem meiner ersten Fragen hier im Forum gelernt habe, nicht das gelbe vom Ei ist und wie Pfusch am Bau wirkt.

    Ich habe gestern mal die Socket-Member in der Class-Library durchgeschaut, konnte aber nichts zutreffendes finden, auch keine Überladung von BeginAccept() etc...

     

    Könntet ihr mir diesbezüglich Hilfe anbieten?

     

    Vielen Dank und mit freundlichen Grüßen

     

    Nisse

    Mittwoch, 12. Januar 2011 14:31

Antworten

Alle Antworten

  • im acceptCallback um die RemotePointIP auszuwerten und dann bei Nicht-Übereinstimmung mit der Vorgabe die Verbindung wieder aufzugeben und neu zu horchen. Aber das gelingt mir im Moment nur mit String-Vergleichen

    Hallo Nisse

    du meinst wohl RemoteEndPoint
    http://msdn.microsoft.com/de-de/library/system.net.sockets.socket.remoteendpoint.aspx

    den muss man für IP casten, wie:
      IPEndPoint remep = (IPEndPoint)socket.RemoteEndPoint;

    dann hat man Zugriff auf Eigenschaften
    http://msdn.microsoft.com/de-de/library/system.net.ipendpoint_properties.aspx

    wie eben bekanntlich AddressFamily  und IPAddress.
    Dort nützlich, uva:
    Equals
    http://msdn.microsoft.com/de-de/library/ytw09x9b.aspx

    TryParse
    http://msdn.microsoft.com/de-de/library/system.net.ipaddress.tryparse.aspx


    PS:
    Ein 'Filter', das schon vorher bestimmte IPs blockt dürfte nur eine Stufe tiefer (unter Sockets) möglich sein.

    • Als Antwort markiert Nisse Knudsen Mittwoch, 12. Januar 2011 16:22
    Mittwoch, 12. Januar 2011 16:20
  • Servus Thomas!

     

    Ja, ich meine RemoteEndPoint, bin da manchmal etwas flüchtig mit meiner Ausdrucksweise...

    Danke für den Casting-Tipp, deshalb konnte ich gestern beim testen auch nicht - wie im Internet oft beschrieben - die Eigenschaft "Address" aufrufen!

    Ich werde mich dann nachher mal ranmachen und schauen, ob ich mit Equals() weiterkomme, da ich ja mit TryParse wieder über Strings ginge.

     

    Vielen Dank und Grüße

     

    Nisse

    Mittwoch, 12. Januar 2011 16:32
  • Ich werde mich dann nachher mal ranmachen und schauen, ob ich mit Equals() weiterkomme, da ich ja mit TryParse wieder über Strings ginge.
    Nisse,
    das TryParse ist natürlich nur gedacht, um nur als String vorgegebene Adressen  (zB aus deinen Konfigurations-Einstellungen oder Benutzereingaben)  zu parsen (ergibt IPAddress).
    Der Vergleich selber sollte danach schon immer über IPAddress (hier Equals) gehen.
    Mittwoch, 12. Januar 2011 16:41