Laden...

UDP - Peer 2 Peer

Erstellt von PirateKing17 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.737 Views
P
PirateKing17 Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren
UDP - Peer 2 Peer

Hallo,
ich wollte einen kleinen p2p chat machen und habe deshalb einiges gelsesen. Z.B. dass das per udp ganz gut geht, wenn beide gleichzeitig an die andere Ip senden. Denn dann denkt der Router das sei eine Antwort auf das eben losgeschickte Packet.

Bei mir funktioniert es. Ich bekomme alle Nachrichten von mienem Freund. (Bei einem Port Check hies es, dass port 200 nicht offen ist) Doch mein freund sieht keine Nachrichten von mir.

Am Anfang vom Quellcode ist auchnoch ein UPNP Port öffner. Aber ich glaube der funktioniert ech nicht. Er basiert auf der TCMPort Mapper.dll


class Program
    {

//Nutzername und IP des Gegenüber wird noch hard-gecoded
        static string targetIP = "109.193.125.114";
        static string name = "Moritz";
        static int port = 200;

        static void Main(string[] args)
        {
            //open Port (TCMPortMapper.dll) Ich glaube nicht, dass der geht,
            PortMapper.SharedInstance.Start();
            PortMapping pm = new PortMapping((ushort)port, (ushort)port, PortMappingTransportProtocol.UDP);
            PortMapper.SharedInstance.AddPortMapping(pm);


            IPEndPoint target = new IPEndPoint(IPAddress.Parse(targetIP), port);

            // Einen neuen Thread für den Empfang eingehender Nachrichten erstellen.
            Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
            receiveThread.IsBackground = true;
            receiveThread.Start();

            UdpClient client = new UdpClient();

            try
            {
                string text;
                do
                {
                    text = Console.ReadLine();

                    // Den Text zum Remote-Client senden.
                    if (text != "")
                    {

                        // Daten mit der UTF8-Kodierung in das Binärformat kodieren.
                        byte[] data = Encoding.UTF8.GetBytes(name + ": " + text);

                        // Den Text zum Remote-Client senden.
                        client.Send(data, data.Length, target);
                    }
                } while (text != "");
            }
            catch (Exception err)
            {
                Console.WriteLine(err.ToString());
            }

            Console.ReadLine();
        }

        private static void ReceiveData()
        {
            UdpClient client = new UdpClient(port);
            while (true)
            {
                try
                {
                    // Bytes empfangen.
                    IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, port);
                    byte[] data = client.Receive(ref anyIP);

                    // Bytes mit der UTF8-Kodierung in das Textformat kodieren.
                    string text = Encoding.UTF8.GetString(data);

                    // Den abgerufenen Text anzeigen.
                    Console.WriteLine("<< " + text);
                }
                catch (Exception err)
                {
                    Console.WriteLine(err.ToString());
                }
            }
        }
    }

Hat jemand damit Erfahrung?
Ist das die richtige Vorgehensweise?
Liegt es an meinem Router? Oder der des Freundes?
Was würdet ihr mir empfehlen? Oder ist da einfach ein Fehler drin?

Wäre sehr dankbar wenn ihr mir helfen könntet!

Super Blog!
http://mos-universe.org

C
1.214 Beiträge seit 2006
vor 12 Jahren

Sorry, aber ich hab nicht das Gefühl, dass du genau verstehst, wovon du redest. Generell ist es dir schon klar, aber nicht in der erforderlichen Tiefe und du hast wohl auch keine Ahnung, wie das testen kannst.

Z.B. dass das per udp ganz gut geht, wenn beide gleichzeitig an die andere Ip senden. Denn dann denkt der Router das sei eine Antwort auf das eben losgeschickte Packet.

Das ist viel zu schwammig formuliert. Die Technik nennt sich UDP hole punching. Such bitte danach und lies dich ein. Wenn du das verstanden hättest, hättest du das nicht so salopp formuliert.

Am Anfang vom Quellcode ist auchnoch ein UPNP Port öffner. Aber ich glaube der funktioniert ech nicht.

Du glaubst? Warum überprüfst du das nicht? Das kannst du doch überprüfen. Ist auf dem Router überhaupt UPNP aktiviert? Werden richtige Pakete geschickt, ist der Port danach offen?

In deinem Code sehe ich jetzt nichts, was direkt mit UDP hole punching zu tun hätte. Habs aber nur überflogen von dem her würde ich für die Aussage nicht die Hand ins Feuer legen. Ich würde aber vermuten, dass es bei dir geht, weil dein Netzwerk entsprechend eingerichtet ist, oder du zuerst sendest, oder sowas. Das ist aber auch nicht schwer rauszufinden. Du kannst bei dir sniffen und bei deinem Freund sniffen, und die Ergebnisse mit dem Vergleichen, was du erwartest, und wenn irgendwas nicht passt, dann weißt du, wo du den Fehler zu suchen hast.

1.346 Beiträge seit 2008
vor 12 Jahren

vorallem braucht man kein hole punch wenn man den port mit upnp aufbekommt. wenn das nicht geht und man holepunch versucht funktioniert das aber auch nicht mit jedem router. ich zB habe einen, der auf strict eingestellt ist. der lässt nichts durch was nicht von da kommt wo er es erwartet

P
PirateKing17 Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

Danke für die beiden Antworten!

Das die Technik hole punching heisst und z.B. von skype verwendet wird wusste ich. Und ich weiss auch wie es funtkioniert. Ich bin mir zimlich sicher, dass meine aussage richtig war (wenn auch sehr kurz gefasst). Das habe ich aber nicht einprogrammiert. Ich dachte man könnte das ja auch von hand machen:

Freund sendet nachricht, diese wird verworfen, dann sende ich nachricht -> verbindung steht.
So wie ich das sehe, kommt aber gleich die erste Nachricht von meinem Freund an. (Also ist irgendwas ganz seltsam.)

Sollte UPNP denn eigentlich funktionieren? Oder ist das bei eh fast jedem Router ausgestellt? Denn dann kann ich das eh vergessen.

Gibt es eine andere / bessere Möglichkeit als das Hole Punching mit UDP?
Vill ganz anderes Protokoll?

Wie würdet ihr das denn umsetzen?

Super Blog!
http://mos-universe.org

C
1.214 Beiträge seit 2006
vor 12 Jahren

Sollte UPNP denn eigentlich funktionieren? Oder ist das bei eh fast jedem Router ausgestellt?

Das ist unterschiedlich. Ich hatte es tatsächlich eine Weile lang aktiviert gehabt, weil ich keine anderen Möglichkeit hatte, den Router zu steuern (es ging nicht um die Freigabe von Ports). Aber es ist natürlich eine ziemlich krasse Sicherheitslücke. Erst neulich wurde entdeckt, dass sich viele Router über UPNP von außen übers Internet ohne Anmeldung (kann UPNP ja eh nicht) umkonfigurieren lassen. Von dem her sollte man das eher abschalten.

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

mit UDP Hole Punching hat das hier gar nichts zu tun.
Damit bezeichnet man eine Technik, die einem OHNE offene Ports oder UPNP erlaubt, Direktverbindungen zwischen 2 Clients aufzubauen, indem ein gemeinsamer Server, mit dem beide Clients verbunden sind, die Verbindung vermittelt.

Ich vermute, dass bei Deinem Problem einfach an der Gegenstelle (bei Deinem Freund) UPNP nicht aktiviert/eingeschaltet ist. Möglicherweise läuft einfach der UPNP-Dienst nicht?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

P
157 Beiträge seit 2010
vor 12 Jahren

Soweit ich weiß ist UPNP sowie so bei den meisten deaktiviert.
Außerdem gibt es noch die möglichkeit das die Router UPNP garnicht unterstützen.
Ich würde daher Hole Punching verwenden. Ist einfach zu implementieren und funktioniert meistens ohne probleme

C
1.214 Beiträge seit 2006
vor 12 Jahren

indem ein gemeinsamer Server, mit dem beide Clients verbunden sind, die Verbindung vermittelt.

Richtig. Den gemeinsamen Server braucht man zwar nicht unbedingt, aber irgendwie müssen die Clients die Source Ports der Gegenstelle kennen, die dynamisch vergeben werden. Von dem her hat dein Code nichts mit UDP Hole Punching zu tun.

P
PirateKing17 Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

Gut. Dann werde ich es so versuchen:

Da ich und mein freund die software eh nahezu gleichzeitig starten und wir die IP des anderen kennen lasse ich den vermittelnden server jetzt einmal weg.

Dann spammen wir einfach gegenseitig uns auf den gleichen Port UDP an die jeweils andere IP packete. Sobald einer ein Packet bekommt spammt er weiter die meldung "habe packet erhalten". Wenn jetzt der andere diese meldung beckommt schickt er auch die Meldung "habe packet erhalten" und beide hören auf. Jetzt steht die Verbindung.

Stimmt das vom Prinzip so?
Kann man jetzt auch ein paar minuten Warten und kann dann wieder nachrichten senden? Oder muss man durchweg etwas senden damit der Router den Port für Antworten offen hält?

Super Blog!
http://mos-universe.org

C
1.214 Beiträge seit 2006
vor 12 Jahren

Stimmt das vom Prinzip so?

Nein. Ich hab doch gleich vorgeschlagen, du sollst dich in das Thema einlesen und nicht raten 😉
Die IP reicht nicht. Du schickst ein Paket raus. Das hat eine Target IP, Target Port, Source IP, Source Port. Source IP ist die lokale IP Adresse von deiner Netzwerkkarte, der Source Port wird dynamisch vom Betriebssystem vergeben. Jetzt kommt das Paket bei deinem Router an und er ändert das Paket. Neue Source IP, neuer Source Port. Jetzt muss dein Freund seine Pakete an den Source Port schicken, den dein Router vergeben hat. Den kann er nicht wissen, und du genauso wenig. Dafür brauchst du den Zwischenserver, den beide kennen. Wenn dein Freund die Paketen nicht an den Port schickt, den der Router dieser Verbindung zugewiesen hat, dann wird der Router den auch nicht durchlassen.

P
PirateKing17 Themenstarter:in
4 Beiträge seit 2011
vor 12 Jahren

Okay vielen Dank!
Dann weiss ich jetzt schonmal, dass ich nichts weiss... der erste Schritt.
Habt ihr irgendwelche Quellen für mich wo ich das nachlesen kann? Habe bei google noch nicht sehr viel in C# über udp hole punching gesehen.

Werde aber trozdem weiter suchen.

Super Blog!
http://mos-universe.org

C
252 Beiträge seit 2007
vor 12 Jahren

vorallem braucht man kein hole punch wenn man den port mit upnp aufbekommt. wenn das nicht geht und man holepunch versucht funktioniert das aber auch nicht mit jedem router. ich zB habe einen, der auf strict eingestellt ist. der lässt nichts durch was nicht von da kommt wo er es erwartet

Soweit ich weiß funktioniert Hole Punching immer. Oder funktioniert bei dir Skype und Teamviewer nich?

1.346 Beiträge seit 2008
vor 12 Jahren

Nein. Es funktioniert nicht, wenn der NAT Typ des Routers Strict ist. Dann nimmt er keine Udp Packete einer anderen IP, und einem anderem Port an, als die, zu denen er sie gesendet hat. Dann kannst du von dem anderen Rechner so viele Packete schicken wie du willst. Der Router blockiert sie. Teamviewer, Skype und co. leiten den Traffic dann über einen Server. Das ist dann entsprechend langsam. In Skype erscheint dann zB bei einem Filetransver dieses Schnecken-Symbol und es gibt im Tooltip den Hinweis darauf.