TcpListener
-
Hallo,
muss ich nicht damit alle Verbindungen auf Port 80 empfangen? Ich dachte mir wenn ich einen Browser aufmache (Startseite: google) dann wird ja was gesendet.
Int32 port = 80; TcpListener^ tcpListener = gcnew TcpListener(IPAddress::Any, port); tcpListener->Start(); while(true){ TcpClient^ tcpClient = tcpListener->AcceptTcpClient(); // bleibt hier stehen NetworkStream^ stream = tcpClient->GetStream(); array <Byte> ^longBytes = gcnew array <Byte> (3000); stream->Read(longBytes, 0, longBytes->Length); text = Text::Encoding::ASCII->GetString(longBytes); Console::WriteLine(text); }
Das klappt aber nicht.
-
was tippst Du in den Browser ein?
-
Wieso, ist doch egal.
Wenn ich meinen Browser starte, z.B. IE, dann wählt er sofort Google an, d.h. ich bin dann auf der Google Seite.
Als nächstes schreibe ich in das Googleeingabefeld irgendwas rein . . . beim Programm tut sich nichts, dann gebe ich was in die Adressleiste was ein . . . es tut sich immer noch nichts. Der Browser springt aber von Seite zur Seite.
-
muss ich nicht damit alle Verbindungen auf Port 80 empfangen
Nein. Nur dijenigen, die an den entsprechendne Endpoint gerichtet sind.
Ich denke Du verstehst nicht ganz was der TcpListener mach.
Suchst Du sowas wie ein Sniffer?
Simon
-
Suchst Du sowas wie ein Sniffer?
Nein. Das sind meine ersten Schritte richtung Netzwerkporgrammierung
.
Hab mal zwei Programme geschrieben (abgeschrieben u. verändert), mit TcpClient und TcpListener, das erste Programm sendet und das zweite empfängt. Das klappt aber nur wenn die Programme auf gleichem PC laufen. Mein Ziel währe wenn ich über LAN oder WAN von einem Programm zum nächsten senden kann.
-
ghostboss schrieb:
Wieso, ist doch egal.
nein ist es nicht
Wenn ich meinen Browser starte, z.B. IE, dann wählt er sofort Google an, d.h. ich bin dann auf der Google Seite.
Als nächstes schreibe ich in das Googleeingabefeld irgendwas rein . . . beim Programm tut sich nichts, dann gebe ich was in die Adressleiste was ein . . . es tut sich immer noch nichts. Der Browser springt aber von Seite zur Seite.weil Du nämlich hier dem Browser sagst "rufe Google auf", "mache dies und das" ... aber nicht "rufe den lokalen Server auf" ... tipp mal 127.0.0.1 in den Browser ... dann sollte auch auf der Console was auftauchen
ghostboss schrieb:
Suchst Du sowas wie ein Sniffer?
Nein. Das sind meine ersten Schritte richtung Netzwerkporgrammierung
.
juhu - Du wirst noch öfter Fragen
Hab mal zwei Programme geschrieben (abgeschrieben u. verändert), mit TcpClient und TcpListener, das erste Programm sendet und das zweite empfängt. Das klappt aber nur wenn die Programme auf gleichem PC laufen. Mein Ziel währe wenn ich über LAN oder WAN von einem Programm zum nächsten senden kann.
da dürfte die Firewall dazwischen funken ... alternativ lauscht Du mit dem Server nur auf localhost oder der Client verbindet sich nur auf localhost ... das kann man aber ohne Code nicht sagen
hand, mogel
-
Hallo nochmal
.
So, hab jetzt nochmal zwei Programme erstellt "Server" und "Client".
Das Senden funktioniert auch aber nicht ganz. Wenn ich "abc" sende dann kommt auch "abc" an aber, wenn ich "c", "d" oder einige andere Buchstaben sende dann kommt nichts bzw. leere Bytes an. Weiß einer warum, ich versuche aber das als UTF32 zu senden.Und dann zweite Frage.
Das senden funktioniert nur zuhause. Das Serverprogramm ist auf meinem Laptop. Auf dem Laptop hab ich "Microsoft Virtual PC" (hat auch eine IP), da habe ich Clientprogramm gestartet und das senden geht. Hab dann auf einem anderen PC das an den Router angeschlossen ist das Clientprogramm gestartet und das sende klappt da auch. Hab dann meinem Bruder das Clientprogramm gesendet (nach Stuttgart, bin in der nähe von Osnabrück), die Verbindung wird auf jeden Fall über's Internet aufgebaut und es klappt nicht. Er konnte ein oder zwei mal was eingeben und dann kam ein Fehler, "Das Programm hat Fehler ... muss beenden werden" oder so.Warscheinlich deswegen, weil meine IP Adresse nicht im Internet beckannt ist sondern nur die des Routers.
Wenn ich dem Clientprogramm die Router IP gebe dann kann ich auch was senden, zumindes läuft das programm, aber wenn ich dem Serverprogramm die IP des Router gebe dann kommt da eine Ausnahme "System.Net.Sockets.SocketException".Wie mach ich das jetzt, wie kann das Clientprogramm das Serverprogramm anwählern?
Hier sind die Programme zum testen oder so:
Serverprogramm:
#using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::Collections; int main(){ Console::WriteLine("Server srart"); String^ text = nullptr; IPAddress^ localAddr = IPAddress::Parse("xxx.xxx.xxx.xx"); // hier kommt die IP des Host also meines Laptops Int32 port = 80; IPEndPoint^ ipEP = gcnew IPEndPoint(localAddr, port); TcpListener^ tcpListener = gcnew TcpListener(ipEP); tcpListener->Start(); while(true){ TcpClient^ tcpClient = tcpListener->AcceptTcpClient(); NetworkStream^ stream = tcpClient->GetStream(); array <Byte> ^longBytes = gcnew array <Byte> (30); stream->Read(longBytes, 0, longBytes->Length); text = Text::Encoding::ASCII->GetString(longBytes); text = text->Trim(0); Console::WriteLine(">> {0}", text); text = nullptr; for(Int32 i=0; i< longBytes->Length; i++) text += longBytes[i] + " "; Console::WriteLine(">> {0}\n", text); } return 0; }
Clientprogramm:
#using <System.dll> using namespace System; using namespace System::Text; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; using namespace System::Collections; Void sendText(String^ text){ IPAddress^ remotAddr = IPAddress::Parse("xxx.xxx.xxx.xx"); // hier kommt die IP des Host, also die gleiche wie beim Server Int32 port = 80; TcpClient^ client = gcnew TcpClient(); client->Connect(remotAddr, port); NetworkStream^ stream = client->GetStream(); array <Byte> ^send = Text::ASCIIEncoding::ASCII->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; }
Dann eine Frage zum Port:
Kann ich mir eigentlich ein Port ausdenken z.B. 31 oder 550. Ich weiß das einige Port Nummern schon vergeben sind z.B. 80 für HTTP und dass die Grenze bei 65535 liegt, aber was heißt das überhaupt. Meine Programme senden z.B. auf Port 80.
-
Hallo,
ich sitze schon seit zwei Tage an dem Problem und komme nicht weiter.
Wie kann ich mich zu einem entfernten PC verbinden?
Die Sache ist die dass der entfernte PC an ein Router angeschlossen ist. Soll ich etwa die Router IP anwählen, also mit TcpCLient, und dann noch die IP des PC's. Und mit welchen Socket mach ich das? Mit dem gleichen mit den ich auch den Router angewählt habe oder mit einem neuen?
Mit Dns::GetHostName() bekomme ich ja die IP des Rechners. Und wie kriege ich die IP des Router?
-
Der Computer hat die gleiche IP für dich wie der Router. Du musst das so sehen das du ja über den Router ins Internet gehst. Wenn du jetzt eine Seite aufrufst leitet der Router den Befehl an den Server weiter. Der Server z.b. Google gibt dann die Daten wieder zurück wobei er nur die IP vom Router hat. Dein Router empfängt diese und leitet sie an den Rechner weiter welcher den HTTP-Request gesendet hat.
Ich hoffe das war halbwegs verständlich und ich hoffe das mir kein Fehler unterlaufen ist.
-
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 -> NATder 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
-
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