Laden...

Tcp Client/Server: Verbindungsprobleme

Erstellt von Bake vor 16 Jahren Letzter Beitrag vor 16 Jahren 10.059 Views
B
Bake Themenstarter:in
35 Beiträge seit 2008
vor 16 Jahren
Tcp Client/Server: Verbindungsprobleme

Hallo!

Ich habe zwei sehr einfache Programme geschrieben, um etwas über die Client/Server Kommunikation per Tcp zu lernen. Über LAN funktioniert auch alles aber sobald ich versuche eine Verbindung zwischen zwei Programmen auf unterschiedlichen Computern über das Internet herzustellen geht nichts mehr.

Ich habe einige Beiträge zu diesem Thema gelesen, konnte aber noch keine Lösung finden. Der entsprechende Port ist "geforwarded" (Ist das nötig?).

Hier die zwei bis aufs Wichigste gekürzten Programme:

Server


using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class server
{
    static void Main()
    {
        TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 56213);
        listener.Start();

        TcpClient client = listener.AcceptTcpClient();

        NetworkStream stream = client.GetStream();

        BinaryReader r = new BinaryReader(stream);

        /*...*/

        client.Close();
        listener.Stop();
    }
}

Client


using System;
using System.Net;
using System.Net.Sockets;
using System.IO;

class client
{
    static void Main()
    {
        TcpClient client = new TcpClient();
        
        Console.Write("Verbindungsversuch...");
        client.Connect("77.183.164.84", 56213);
        Console.Write(" Erfolgreich!");

        NetworkStream stream = client.GetStream();

        BinaryWriter w = new BinaryWriter(stream);

        /*...*/

        client.Close();
    }
}

Danke im Voraus!

185 Beiträge seit 2005
vor 16 Jahren

Hallo,

der Fehler liegt wohl hier:


TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 56213);

Du benützt hier das Loopback-Interface. Du musst die richtige IP-Adrese eintragen

B
Bake Themenstarter:in
35 Beiträge seit 2008
vor 16 Jahren

Genau da muss der Fehler auch liegen. Wenn ich aber an dieser Stelle die richtige IP-Addresse einfach so eintrage:


TcpListener listener = new TcpListener(IPAddress.Parse("77.183.164.84"), 56213);

... gibts eine Fehlermeldung:


SocketException wurde nicht behandelt.
Die angeforderte Adresse ist in diesem Kontext ungültig

Ich habe es auf einem anderen Weg schon geschafft über das Internet etwas auszutauschen:


TcpListener listener = new TcpListener(IPAddress.Parse("0.0.0.0"), 56213);

Dies funktioniert allerdings nur wenn der Port geforwarded ist.

Ich hätte jedoch gerne eine Lösung ohne Port Forwarding. In einem anderen Forum habe ich gelesen, dass eine TCP Verbindung über das Internet ohne Port Forwarding nicht möglich ist. Stimmt das? Ich suche nach einer Lösung die keine speziellen Veränderungen erfordert, also für den Nutzer sehr einfach ist. Irgendwie muss das ja möglich sein, denn andere Programme kommen ja auch ohne Port Forwarding aus.

Soo... Ich weiß jetzt, dass es möglich ist Port Forwarding zu umgehen.
Wenn ich mich nicht irre muss zuerst der Server etwas an den Client senden, weil danach der Client scheinbar nur antwortet und vom Router durchgelassen wird.

185 Beiträge seit 2005
vor 16 Jahren

Das Portforwarding brauchst du immer auf der Seite, die vom Internet aus erreicht werden soll.
Wenn der Client das I-Net über einen Router erreicht, und der Server direkt erreichbar ist, brauchst du das forwarding auf der Clientseite, wenn der Server den Client erreichen soll.
Wenn der Client die Verbindung aufbaut, dann richtet der Router automatisch ein Routing ein, solange die Verbindung besteht. Sonst würde der Client ja nie die Antwort vom Server bekommen.

Welche Adresse trägst du denn am Server ein? Die Clientadresse?

B
Bake Themenstarter:in
35 Beiträge seit 2008
vor 16 Jahren

Ich weiß gerade selber nicht wie ich das genau machen will. Ziel ist es eine TCP (nicht zwingend) Verbindung zwischen zwei Computern über das Internet herzustellen ohne dass Port Forwarding nötig ist. Dabei gibt es noch ein weiteres Problem: Die sich ändernden IP-Addressen der zwei Computer.

Möglich wäre das (denke ich) durch einen "Zwischenserver" mit fester IP-Addresse. Dieser wartet auf Anfragen der zwei Computer und nimmt diese an. Wenn die Verbindung erstmal hergestellt ist kann ich die Daten ohne Probleme verteilen.

Da ich aber keinen Server habe (eigentlich schon aber völlig ungeeignet) suche ich jetzt natürlich nach einer anderen Lösung... Das scheint fast unmöglich zu sein aber soweit ich weiß stellen manche Trojaner (nein ich möchte keinen programmieren) so eine Verbindung ohne zusätzlichen Server her. Ich hatte eigentlich nicht vor mir irgendeinen Code von nem Trojaner zu besorgen um das Programm etwas benutzerfreundlicher zu machen. Mich interessiert die ganze Sache jetzt aber und ich bin für jeden Ansatz dankbar 🙂

185 Beiträge seit 2005
vor 16 Jahren

Das Problem der IP-Adressen kannst du ja einfach mit DynDNS lösen.

Ein Trojaner ist ja schon auf dem Clientsystem wenn er aktiv wird, damit braucht er kein Portforwarding. Das bringt dich nicht weiter.

B
Bake Themenstarter:in
35 Beiträge seit 2008
vor 16 Jahren

Vielen Dank für den Tipp mit DynDNS! 👍

Ein Trojaner ist ja schon auf dem Clientsystem wenn er aktiv wird, damit braucht er kein Portforwarding. Das bringt dich nicht weiter.

Ich meinte Client/Server Trojaner wie zum Beispiel "sub7". Diese brauchen so weit ich weiß keinen weiteren Server mit fester IP-Addresse, kommunizieren aber gegenseitig, nicht nur in eine Richtung (vom Server nach außen). Ich habe eine Vermutung wie das funktionieren könnte aber es ist ja nicht wichtig... Mit DynDNS werde ich schon weiterkommen (hoffe ich).

Muss ich eigentlich wirklich meinen Router verändern (oder Software installieren) damit ich mit DynDNS arbeiten kann?

Ansosten steht ja immer noch ein (V-)Server zur Auswahl. Welche Anforderungen muss ein VServer erfüllen damit ich meine C# Programme darauf testen kann (Ports abfragen etc.)? Muss wirklich nur Windows darauf installiert sein oder braucht es mehr?