Laden...

Peer To Peer über Internet

Erstellt von Crone vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.433 Views
C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 10 Jahren
Peer To Peer über Internet

Guten Abend zusammen,

Ich hab mir eine Applikation geschrieben die eine Peer to Peer Verbindung aufbauen soll.

Die Applikation baut als erstes eine Verbindung zum Server auf und hollt sich dort eine Liste aller Clients mit den zugehörigen IP´s

Jede Applikation die zum Server Connected start auch ein TcpListener um anfragen anderer Clients entgegen zunehmen.

Nur wenn ich eine Verbindung zu einen anderen Client aufbauen möchte funktioniert dies nicht: ... Client ist angeblich nicht erreichbar...

So nun hab ich mir gedacht ich erstell mir eben eine kleine Applikation zum testen... diese sieht folgendermaßen aus:

static void Main(string[] args)
        {
            if (Console.ReadLine() == "start")
            {
                try
                {
                    TcpClient client = new TcpClient("IPADRESSE", 1338);
                    if (client.Connected)
                        Console.WriteLine("connected");
                    else
                        Console.WriteLine("no connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                new Thread(start).Start();
            }
            Console.WriteLine("bitte warten");
            Console.ReadKey();
        }
        static void start()
        {
            TcpListener listener = new TcpListener(GetIpAdresse(Dns.GetHostName()), 1338);
            listener.Start();
                try
                {
                    TcpClient client = listener.AcceptTcpClient();
                    Console.WriteLine("neuer Client: " + IPAddress.Parse(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString()).ToString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
   
        }

        private static IPAddress GetIpAdresse(string hostName)
        {
            IPAddress ipAdresse = null;
            IPAddress[] ipAdressen = Dns.GetHostEntry(hostName).AddressList;
            foreach (IPAddress ip in ipAdressen)
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    ipAdresse = ip; break;
                }
            if (ipAdresse == null)
                throw new Exception("Keine IPV4-IP auflösbar.");
            return ipAdresse;
        }

Bei der Ip Adresse hab ich die Ip Adresse eingetragen die ich zurück bekomme bei wieistmeineip.de

auch hier bekomme ich die Fehlermeldung das der Client nicht erreichbar ist...

Leider sind die Bespiele immer nur auf LAN bezogen und wenn jemand die gleiche frage stellt wie ich sie grade stelle kamen leider immer Antworten wie "such dir ne fertige Lösung...".

Ich hoffe ihr könnte mir den entscheidenden Tipp geben warum mein Programm nicht funktioniert... ich weiß jedenfalls das es was mit der IP zu tun hat aber was?

Ich geh einfach mal davon aus das der Router nicht weiß zu welchen Client im Lan die anfrage weitergeleitet werden soll. Wenn ja wie behebe ich dieses Problem.

Mit freundlichen Grüßen
Marcel

Real programmers don't comment their code - it was hard to write, it should be hard to understand.

C
1.214 Beiträge seit 2006
vor 10 Jahren

NAT? Port forwarding?

849 Beiträge seit 2006
vor 10 Jahren

Das schaut mir fast wie hole punching aus. Eine Ip reicht hier halt nicht.

1.346 Beiträge seit 2008
vor 10 Jahren

Suche mal nach Udp Hole Punching. Aber auch hier darfst du nicht darauf vertrauen, dass es immer funktioniert. Wenn der NAT Typ des Routers Strikt ist funktioniert das nicht, und du brauchst einen Server in der Mitte.

LG pdelvo

C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 10 Jahren

Okay nach ein bisschen googlen bin ich genau so Ratlos wie vorher den ich kann keinen User der die Applikation installiert und womöglich nicht mal Zugriff auf den Router hat nicht zumuten im Router einzustellen das ein bestimmter Port zu einen bestimmten PC weitergeleitet wird... Gibt es keine Möglichkeit irgendwie dem Router durch den Programm zu sagen wohin man Verbinden möchte?

Es gibt schließlich noch andere Peer To Peer Programm die auch funktionieren ohne das der User irgendwas am Router umstellen muss.

Die einzigen weiteren Vorschläge die ich bisher gelesen habe waren auch immer
Port-Forwarding
Server über den Kommuniziert wird ... welches aber nicht mehr P2P wäre.
Verbinden beider netzt mittels VPN

alles ist für den End User aber nicht wirklich sinnvoll... mit Ausnahme das alles über ein Server Kommuniziert, jedoch hat man dort das Problem das man immer einen bzw. mehrere Server am laufen haben muss um die Funktionsfähigkeit des Programms zu gewährleisten... deshalb auch P2P da ich bei einen Server der nur IP´s weitergebe nicht viel Traffic hab der die Leitung extrem auslastet.

P.S. UDP Hole Punching hab ich grad eben auch schon mal gelesen ich werde mir das mal genauer anschauen 😃

Danke jedenfalls für euere Antworten.

Real programmers don't comment their code - it was hard to write, it should be hard to understand.

3.825 Beiträge seit 2006
vor 10 Jahren

Es gibt schließlich noch andere Peer To Peer Programm die auch funktionieren ohne das der User irgendwas am Router umstellen muss.

Ich kenne keine Peer-To-Peer-Programme, die ohne Server funktionieren, die funktionieren ohne dass man Router / Firewall entsprechend konfiguriert.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 10 Jahren

Ein Server zur Vermittlung der Ip´s muss natürlich gegeben... Es gibt z.B. einige Games die Peer To Peer funktioniert, desweiteren funktionieren viel Tausch-Börsen mit Peer To Peer Programmen wie z.B. emule

Aber UDP Hole Punching hat super funktioniert.

Danke

Real programmers don't comment their code - it was hard to write, it should be hard to understand.

1.346 Beiträge seit 2008
vor 10 Jahren

Du brauchst aber auf jedenfall die Möglichkeit als Fallback eine verbindung über einen Server laufen zu lassen. Mein alter Router z.B. ar vom NAT Typ Strikt, und da kannst du Hole Punching vergessen.

LG pdelvo