TcpListener



  • Ja aber wie kann ein Clientprogramm mich anwählen, meine IP ist z.B. 192.168.178.29, der Router hat ja eine andere IP. Also wenn der Client meine IP anwählt, dann findet er mich nicht weil meine IP hinter dem Router versteckt ist. Und wenn Client den Router anwählt (keine ahnung ob das klappt), dann weiß der Router ja nicht an welchen Rechner er weiter leiten soll, weil an den Router ja mehrere Rechner angeschlossen sind.

    Und mit Client meine ich keine Webserver oder so, sonder ich erstelle diesen Client selber, das Clientprogramm liegt dann auf einem anderen Rechner und der Rechner ist weit weg 😃 und an das Internet angeschlossen.



  • Ich sag es ungern, aber wenn man sich mit der Netzwerkprogrammierung beschäftigt, sollte man auch etwas Ahnung von Netzwerkgedöns haben. Das fehlt dir anscheinend und steht deinem Vorhaben im Weg. 😉

    Um zu den anderen PC zu gelangen muß erstmal die IP zum Router des PCs bekannt sein. Den Rest macht dann der Router mit NAT/PAT - Verfahren.(Kann man nachgoogln) Das soll heißen, deine beiden Rechner müssen wenn es übers Internet geht mit den externen IPs und Ports deiner Router kommunizieren.
    Damit dein Server lauschen kann, muß natürlich "firewallmäßig" der "Lauschport" bekannt gegeben werden. Sonst lässt sie nichts rein. Also, sowohl im Router prüfen ob er das richtig durchlässt, als auch deine Security-Software auf dem ServerPC. 😉

    Schöne Grüße



  • drndwarp schrieb:

    Ich sag es ungern, aber wenn man sich mit der Netzwerkprogrammierung beschäftigt, sollte man auch etwas Ahnung von Netzwerkgedöns haben.

    naja - wie soll man etwas lernen wenn man es nicht ausprobiert ... gleiches mit dem Rad neu erfinden ... irgend wann gibt es keine Räder mehr - weil keiner, zum Lernen, das Rad neu erfunden hat

    ansonsten NAT und Portweiterleitung wurden ja schon gesagt ... um das Problem mit der IP tot zuschlagen einfach einen Account bei DynNDS (oder anderer Anbieter) anlegen

    hand, mogel



  • Ich meine nicht die Programmierung, ich meine das Grundwissen über Netzwerke. Das sollte vorhanden sein, wenn man dafür was programmieren möchte. 🙄

    Schöne Grüße



  • Hi,

    generell wäre dann wohl auch noch interessant wie die vermeintliche Verbindung hergestellt wird.
    Modem, DSL, BK-Modem, Router
    Bei TCP/IP kann dein Rechner die exIP nicht kennen, denn diese kennt nur der Router, auch die Vermittlung zum Client wurde schon angesprochen -> NAT

    der sicherste Weg ist dynDNS und so könnte man auch die IP abfragen

    nslookup //dein_dnydns_name//.dyndns.org
    echo "127.0.0.1  localhost ip_address" > C:/Windows/System32/Drivers/etc/hosts
    

    oder, du hast eine Fritz-Box, diese kann man direkt abfragen

    #internal IP-address of the fritz-box
    FBIP=192.168.178.1
    
    NETCAT=`which netcat`
    [ -z "$NETCAT" ] && NETCAT=`which nc`
    [ -z "$NETCAT" ] && exit 1
    
    INTERFACE_NS="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1"
    WANIP_NS="urn:schemas-upnp-org:service:WANIPConnection:1"
    
    NS="$WANIP_NS"
    REQUEST="GetExternalIPAddress"
    SED='/^<NewExternalIP/ s,</\?NewExternalIPAddress>,,gp'
    
    BODY="<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
            <s:Body><u:$REQUEST xmlns:u=$NS /></s:Body>
    </s:Envelope>
    "
    
    LENGTH=`echo -n "$BODY" | wc -c`
    
    ( $NETCAT $FBIP 49000 | sed -ne "$SED" ) <<EOF
    POST /upnp/control/WANCommonIFC1 HTTP/1.1
    Content-Type: text/xml; charset="utf-8"
    Connection: close
    HOST: $FBIP:49000
    Content-Length: $LENGTH
    SOAPACTION: "$NS#$REQUEST"
    
    $BODY
    EOF
    

    auch die Firewall und der benutzte Port sollte offen sein.

    mfg



  • Hallo,

    bin zurück, hatte die letzte Woche keine Zeit.

    Danke erstmal für die Antworten. Ich hab mir also NAT und PAT angesehen und weiß wie das jetzt mit der IP Übersetzung theoretisch funktioniert. Drotzdem weiß ich immer noch nicht wie ich auf meine "externe" IP zugreifen kann. Ich hab Fritzbox und da stehen nur die lokalen IP's aller Computer aber nicht die externen für das Internet. Ich kann da nur ein Port freischalten.
    Wie kann ich den jetzt auf meine externe IP zugreifen?

    Mein Ziel ist es ein Programm zu schreiben mit dem ich übers Internet oder lokales Netzwerk mit einem andern Programm (die eine Kopie des ersten Programms ist) komunizieren kann. Ich möchte nicht meinen Rechner im Internet für alle bereit stellen. Der User, der das Programm nutzt, soll also nichts in seinem Router selber einstellen müssen. Das Programm soll erstmal als Chat funtkioniert dann will ich später Dateien versenden können.

    Ist es überhaupt schlau sowas direkt von Rechner zu Rechner zu senden? Man könnte ja von Rechner zu Server und dann zu Rechner senden. Oder ist das aufwändiger? Ich mein wenn die IP nicht so leicht rauszukriegen ist?

    So und zum letzten Code, denn kann ich nicht lesen, welche Sprache ist es? Es sieht nach dem aus was ich brauche, mit Fritzbox und so aber kann leider das nicht verstehen/lesen. 😞



  • ghostboss schrieb:

    Wie kann ich den jetzt auf meine externe IP zugreifen?

    mogel schrieb:

    um das Problem mit der IP tot zuschlagen einfach einen Account bei DynDNS (oder anderer Anbieter) anlegen



  • Oh hab das wohl überlesen 🙄 .

    Aber, wie ich das verstanden habe, regestriere ich damit nur meinen Pc. Das heißt der andere Rechner mit dem gleichen Programm, mit dem ich komunizieren möchte (übers Internet), muss sich ja da auch registrieren sonst weiß ich ja seine IP nicht!



  • ghostboss schrieb:

    Aber, wie ich das verstanden habe, regestriere ich damit nur meinen Pc.

    naja - eigentlich Router

    Das heißt der andere Rechner mit dem gleichen Programm, mit dem ich komunizieren möchte (übers Internet), muss sich ja da auch registrieren sonst weiß ich ja seine IP nicht!

    kommt darauf an wer jetzt der Server ist ... und den spielst ja eigentlich nur Du ... und damit die andere Seite mit Dir kommunizieren kann braucht Sie entweder eine IP oder eine Domain ... die IP ändert sich (im Normalfall) - die Domain (bei DynDNS etc.) nicht ... den Rest findet man mit etwas Mühe selber

    http://de.wikipedia.org/wiki/Dyndns



  • kommt darauf an wer jetzt der Server ist ... und den spielst ja eigentlich nur Du ... und damit die andere Seite mit Dir kommunizieren kann braucht Sie entweder eine IP oder eine Domain ... die IP ändert sich (im Normalfall) - die Domain (bei DynDNS etc.) nicht ...

    Am Anfang bin ich der Server weil ich ja auf meinem PC das Programm teste, später will ich aber nicht das mein PC der Server ist.

    Dann muss ich wohl einen externen Server als "Server" nutzen? Ich hab bei Funpic eine Domain, da kann man .html und .php Dateien hochladen und nutzen. Kann ich denn da, ein von mir mit C++/Cli erstelltes, Programm hochladen und es benutzen? Oder gibts dafür andere externe Rechner die man mieten kann (oder kostenlos), und dann als Server laufen lasen?

    Ja, sorry für die dummen Fragn 😃 .



  • ghostboss schrieb:

    Am Anfang bin ich der Server weil ich ja auf meinem PC das Programm teste, später will ich aber nicht das mein PC der Server ist.
    Dann muss ich wohl einen externen Server als "Server" nutzen?

    ja ... wird nicht anders funktionieren

    Ich hab bei Funpic eine Domain, da kann man .html und .php Dateien hochladen und nutzen. Kann ich denn da, ein von mir mit C++/Cli erstelltes, Programm hochladen und es benutzen?

    wohl eher nicht 🙂 ... würde die Sciherheit der Server gefährden ... meistens ist das BS der Server selber *nix

    Oder gibts dafür andere externe Rechner die man mieten kann (oder kostenlos), und dann als Server laufen lasen?

    schmeißen alle Provider hinterher ... ab ca. 15€ - sofern Du bei Linux als BS bleibst ... nimmst Du Windows kannst Du gleich nochmal ein paar Euros drauf packen



  • Hallo noch mal,

    einen Server mieten werde ich mir wohl nicht weil ich ja nur testen möchte. Mit der IP hab ich das so gelöst oder besser gesagt werde ich das so lösen, dass der Server sich mit meiner Webseite verbindet und so seine IP Adresse bereitstellt (mit Datenbank, PHP und so), ein Client verbindet sich auch mit der Webseite und kriegt auch so die IP des Servers.

    Bevor ich das aber anfagen so richtig zu programmieren habe ich einen Client erstellt. Dieser Client verbindet sich mit der öffentlichen IP des Serverrechners und sendet. Der Server lauscht die locale IP und soll nur empfangen. Das ganze klappt aber nicht. Der Rechner dass das Client Programm hat sendet über Internet und ist ein Windows 7 mit 64 Bit. Das der Rechner mit 64 Bit läuft müsste doch egal sein weil ich ja das mit .NET mache oder?

    Der Server:

    int main(){
    
    	Console::WriteLine("Server srart");
    	String^ text = nullptr;
    	IPAddress^ localAddr = IPAddress::Parse("192.168.178.24");
    	Int32 port = 80;
    	IPEndPoint^ ipEP = gcnew IPEndPoint(localAddr, port);
    
    	TcpListener^ tcpListener = gcnew TcpListener(localAddr, port);
    	tcpListener->Start();
    
    	while(true){
    
    		TcpClient^ tcpClient =  tcpListener->AcceptTcpClient();
    
    		NetworkStream^ stream = tcpClient->GetStream();
    
    		array <Byte> ^longBytes = gcnew array <Byte> (28);
    		stream->Read(longBytes, 0, longBytes->Length);
    
    		Encoding^ utf32 = Encoding::UTF32;
    
    		text = utf32->GetString(longBytes); 
    
    		Console::WriteLine(">> {0}", text);
    
    		for(Int32 i=0; i< longBytes->Length; i++)
    			Console::Write("{0} ", longBytes[i]);
    		Console::WriteLine();
    	}
    
    	return 0;
    }
    

    Der Client:

    Void sendText(String^ text){
    
    	IPAddress^ remotAddr = IPAddress::Parse("79.224.5.160");
    	Int32 port = 80;
    	TcpClient^ client = gcnew TcpClient();
    	client->Connect(remotAddr, port);
    
    	NetworkStream^ stream = client->GetStream();
    
    	Encoding^ utf32 = Encoding::UTF32;
    	array <Byte> ^send = utf32->GetBytes(text);
    
    	stream->Write(send, 0, send->Length);
    
    	stream->Close();
    	client->Close();
    }
    
    int main(){
    
    	String^ text = nullptr;
    	Console::WriteLine("Client start");
    	while(true){
    		text = Console::ReadLine();
    		sendText(text);
    	}
    
    	return 0;
    }
    

    Im lokalen Netzwerk funktioniert das. Wenn das Client Programm aber übers Internet sendet dann kommt ein Fehler.

    Und nochwas. Es gibt ja auch so ein Tool Hamatchi, da kann man ja auch von einem Rechner zum anderen senden.



  • hast Du NAT auf Deinem Router aktiviert?

    die Webseite ist überflüssig wenn Du Dich mal mit DNS bzw. DynDNS auseinander setzt ... außerdem ist die DNS Variante einfacher - da Dein Router die Arbeit erledigt

    http://de.wikipedia.org/wiki/Hamachi#Funktion - nur die erste Zeile ist wichtig



  • Ob ich NAT akriviert habe weiß ich nicht, weil ich diese Einstellung nicht finden kann. Hab FRITZ!Box Fon WLAN 7141 (UI) und das sind meine Einstellungen http://r0m3o.r0.funpic.de/Aufzeichnen.jpg.

    Und bei DynDNS ist es ja so das ich von einem Rechner (Router) die IP "speichere" (bei DynDNS) und das will ich nicht. Das Programm soll ungefähr wie Hamatchi funktionieren. Das fertige Programm soll als Server und als Client arbeiten.

    Programm Funktionsweise:
    Programm start ... "dann wird eine Liste der IP's angezeigt (von der Webseite) mit denen man sich verbinden kann (als Client)" ... oder man macht sein Programm als Server und die IP des Rechner wird in der Datebank der Webseite gespeichert so das andere die das Programm gestartet haben diese IP sehen und sich verbinden können.

    Und der Nutzer des Programm soll selber bei seinem Router nichts einstellen müssen.



  • ghostboss schrieb:

    Ob ich NAT akriviert habe weiß ich nicht,

    dann hast Du es also nicht aktiviert ... kann sein das sich das hinter dem Menüpunkt "Portweiterleitung" oder so versteckt

    Und der Nutzer des Programm soll selber bei seinem Router nichts einstellen müssen.

    sofern der Benutzer als Server fungieren soll, muss es entsprechend NAT aktivieren ... oder Du nutzt dafür einen eigenen Server


Anmelden zum Antworten