TcpListener



  • 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