Mr_T Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Hey leute :new. Ich programmiere sehr gerne abundzu in Visual Basic. Nun bin ich dabei per winsock eine TCP verbindung zwischen 2 rechnern herzustellen. OK, ich versuche es zumindest... DENN: Es klappt nicht. ABER: Das programm funktioniert. Es liegt kein Programmierfehler vor xD. UND: es funktioniert über Hamachi (Online-Netzwerk von Rechnern) VERMUTUNG:... ich besitze einen Fritzbox Router (3131), muss ich da etwas einstellen, dass mein kumpel mit mir connecten kann? Port freigeben etc? über die lokale IP 127.0.0.1 geht es ja... und über hamachi geht es ja auch ohne Probleme... Fehlercode server: 5 Die angeforderte Adresse ist in diesem Kontext ungültig fehlercode client: 5 Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat Hat von euch da einer eine Vermutung oder weiß jemand etwas ganaueres? Danke schon mal an alle die sich die zeitgenommen haben diesen Beitrag zu lesen und evt. antworten Gruß Mr.T Zitieren
Thanks-and-Goodbye Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Sagen dir die Begriffe Routing, NAT und Portweitererleitungen was? Zitieren
Mr_T Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 (bearbeitet) Nö... xD ...aber danke, werde damit mal googeln wenn du hier nicht näher darauf eingehen möchtest Bearbeitet 13. Februar 2009 von Mr_T Zitieren
DocInfra Geschrieben 14. Februar 2009 Geschrieben 14. Februar 2009 Deine privaten IP-Adressen werden hinter der IP maskiert, die dir vom ISP zugewiesen wurde. Das nennt man NAT. Und um Dienste, hinter einem NAT Gateway anzusprechen, bedarf es nun mal Portweiterleitungen. Man muss dem Router sagen, wohin er Verkehr weiterleiten soll, die auf einem bestimmten Port ankommt. Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 Okay danke schonmal. Bei meiner Fritzbox gibt es den Menüpunkt Freigaben(Portfeigabe) wo follgendes steht: Portfreigabe aktiv für [] Bezeichnung [] Protokoll [] von Port [] bis Port [] an IP-Adresse [] an Port [] Was soll ich da nun eintragen und zu welcher IP soll der Server/Client versuchen zu connecten? ich habs mal selbst versucht: Portfreigabe aktiv für [Andere Anwendungen] Bezeichnung [server_Client] Protokoll [TCP] von Port [13000] bis Port [13000] an IP-Adresse [192.168.178.22] an Port [13000] Zitieren
Thanks-and-Goodbye Geschrieben 14. Februar 2009 Geschrieben 14. Februar 2009 Wenn du die Anwendung selber geschrieben hast, musst du doch wissen, auf welchen IP-Ports die läuft. Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 (bearbeitet) Sicherlich Port 13000 Nur ist die IP die ich dort angegeben hab nun auch die zu welcher ich connecten muss? (das müste die Private sein, die die vom Router an die einzelnen PC's vergeben wird) und nicht die "Nomale" jetzt grad: 87.123.114.44 EDIT: Da fällt mir ein das ich ja für Programme wie Hamachi auch keine Portfreigabe verwenden muss... Bearbeitet 14. Februar 2009 von Mr_T Zitieren
Thanks-and-Goodbye Geschrieben 14. Februar 2009 Geschrieben 14. Februar 2009 Da die Portweiterleitung von aussen nach innen geschieht, musst du als Ziel-IP die deines Rechners, auf dem die Software läuft, angeben. Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 Okay danke! Das werd ich dann mal so probieren. ps.: Gibt es irgend welche Risiken? Wenn ich einfach einen Port freigebe, könnte ja jeder darauf zugreifen :confused: Zitieren
Thanks-and-Goodbye Geschrieben 14. Februar 2009 Geschrieben 14. Februar 2009 Jupps... das ist das Risiko jeder Portweiterleitung auf einem Router. Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 (bearbeitet) lol, du hast dein Benutzerbild geändert xD 'Und es so zu verwirklichen wie es z.B. Hamachi macht ist es nicht möglich? EDIT: hab mir nochmal die risiken durchgelesen: http://www.spielerboard.de/showthread.php?t=305326 Nochetwas was ich nicht ganz verstehen: Der Server 'hört ja dem Port zu'. Der Clinet sendet einen stream an den Port. -Also kommt von außen eine Verbindung bzw. kommen daten zum server. soweit, soklar. Warum geht es auch andersherum? :wenn der Server in den stream schreibt erhält es ja ebenfalls der Clinet... OHNE Portfreigabe. Warum? Ich meine das ist doch unsicher für den client... er erhält einfach i-welche daten. ich glaub irgendwas hab ich nich nicht gecheckt... aaaaah es liegt mir auf der Zunge... Bearbeitet 14. Februar 2009 von Mr_T Zitieren
Crash2001 Geschrieben 14. Februar 2009 Geschrieben 14. Februar 2009 Wenn man durch einen NAT-Router von innen eine verbindung nach aussen initialisiert, dann wird der Port vom NAT-Router an den Server mitgegeben, auf dem eine Antwort erwartet wird. Kommt dann auf diesem Port eine Antwort an, so wird sie automatisch an den PC weitergeleitet, der die Anfrage gestellt hat. Dabei muss der interne und der externe Port keinesfalls der gleiche sein, sondern kann auch ein komplett anderer sein. Wenn aber von aussen nach innen die Verbindung initialisiert werden soll, gibt es ja keinen PC, der die Anfrage von innen nach aussen initialisiert und somit wird auch auf keinem Port eine Antwort erwartet. Somit wüsste der NAT-Router nicht, an welchen PC er die Pakete ausliefern soll, wenn er keine feste Portweiterleitung eingerichtet hat für den Port, auf dem er das Paket bekommt. Diese Ports liegen übrigens immer in der Portrange oberhalb Port 1023. Sollte kein Router, sondern nur ein Modem benutzt werden, so kann der Rechner direkt unter seiner externen IP unter allen Ports erreicht werden. Als dritte Möglichkeit kann man auf dem Router noch für einen PC die meist "DMZ" genannte Option einstellen, so dass alle Ports auf diesen Router weitergeleitet werden, abgesehen von den Ports, die durch andere Verbindungen von innen nach aussen durch den NAT-Router als Antwortports "reserviert" wurden. Davon würde ich jedoch definitiv abraten, da dein PC dann, wie wenn du per Modem online bist, nur durch deine Firewall geschützt im Internet steht und somit leichtes Opfer von Angreifern werden kann, da er auf allen Ports direkt angesprochen werden kann. Bei allen drei Varianten muss aber evtl noch der Port in der benutzten Firewall freigeschaltet werden, da das Paket ansonsten einfach dort verworfen wird. Benutzt wird aber zum verbinden von aussen immer die IP, die du vom Provider zugeordnet bekommen hast. Also die WAN IP deines Routers oder Modems. Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 Erstmal :uli ! So. Um mal ein weinig Licht ins dunkel zu bringen poste ich hier mal das Script, denn laut Benutzt wird aber zum verbinden von aussen immer die IP, die du vom Provider zugeordnet bekommen hast. Also die WAN IP deines Routers oder Modems. müsste es mit der WAN IP ja funktionieren. SERVER: Imports System.Net.Sockets Imports System.Text [...] Private SimpleServer As TcpListener Private Client As New TcpClient Private Stream As NetworkStream Dim bytes() As Byte Private Sub OnConnect(ByVal ar As System.IAsyncResult) Client = SimpleServer.EndAcceptTcpClient(ar) Stream = Client.GetStream ReDim bytes(Client.ReceiveBufferSize) Stream.BeginRead(bytes, 0, CInt(Client.ReceiveBufferSize), AddressOf onGetData, New Object) End Sub Private Sub onGetData(ByVal ar As System.IAsyncResult) Dim clientdata As String = Encoding.ASCII.GetString(bytes) MsgBox(clientdata) Stream.BeginRead(bytes, 0, CInt(Client.ReceiveBufferSize), AddressOf onGetData, New Object) End Sub Private Sub Startbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Startbutton.Click SimpleServer = New TcpListener(System.Net.IPAddress.Parse(ipbox.Text), portbox.Text) SimpleServer.Start() SimpleServer.BeginAcceptTcpClient(AddressOf OnConnect, New Object) End Sub CLIENT: Imports System.Net.Sockets Imports System.Text [...] Private SimpleClient As New TcpClient Private Stream As NetworkStream Dim bytes() As Byte Private Sub senttext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles senttext.Click Stream = SimpleClient.GetStream Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(textbox.Text) Stream.Write(sendBytes, 0, sendBytes.Length) ReDim bytes(SimpleClient.ReceiveBufferSize) Stream.BeginRead(bytes, 0, CInt(SimpleClient.ReceiveBufferSize), AddressOf onGetData, New Object) End Sub Private Sub onGetData(ByVal ar As System.IAsyncResult) Dim clientdata As String = Encoding.ASCII.GetString(bytes) MsgBox(clientdata) Stream.BeginRead(bytes, 0, CInt(SimpleClient.ReceiveBufferSize), AddressOf onGetData, New Object) End Sub Private Sub connectbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles connectbutton.Click SimpleClient.Connect(ipbox.Text, portbox.Text) End Sub So. @Crash2001 jetzt müsste doch in die 'ipbox' meine WAN IP rein. Sowohl beim Server als auch beim Client, denn ich will ja den Server aufmachen und der Client soll ja mit mir connecten. Der Port ist ebenfalls der gleiche. Das Problem ist, das ich nun beim eintragen meiner WAN IP beim SERVER diesen Fehler erhalte: Die angeforderte Adresse ist in diesem Kontext ungültig und das dann der Clinet nicht funzt ist klar. Doch was hat nun die Portfreigabe damit zu tun? Angenommen meine WAN IP vom Provider ist 123.123.123.123 und meine Private IP vom Router ist 198.198.198.198 Wenn ich nun auch noch eine Portfreigabe verwende: von Port [13000] bis Port [13000] an IP-Adresse [198.198.198.198] an Port [13000] Und der Server wie auch der Client dem PORT 13000 zugeordnet sind. WELCHE IP muss ich nun beim Server und welche beim Client angeben? Zitieren
Mr_T Geschrieben 14. Februar 2009 Autor Geschrieben 14. Februar 2009 AAAAAAAAAAAAAAAAAAAAAAAAAAAh :upps:upps:upps:upps:upps:upps WIE kann ich nur so BLÖÖÖÖÖD sein, yaaa??? das geht ja garnicht klar xD natürlich!!! der client connecter mit der WAN IP, der Router leitet alles an die Private IP weiter und ZACK es geht. Oh man. :upps:upps:upps Nochmal ein Großes DANKE an alle die mir auf meinem steinigen weg zum erfolg geholfen haben! Zitieren
Crash2001 Geschrieben 15. Februar 2009 Geschrieben 15. Februar 2009 Hmmm... ich weiss zwar nicht, woran es dann jetzt lag, aber da es ja nun anscheinend funzt, ist es ja ok... Kenne mich mit Visual Basic leider nicht so weit aus, dass ich weiss, was da bei dem programm genau gemacht wird... Zitieren
Mr_T Geschrieben 15. Februar 2009 Autor Geschrieben 15. Februar 2009 sehe ich an deine signatur xD da blick ich auch net durch danke für alles ---Closed--- Zitieren
Crash2001 Geschrieben 15. Februar 2009 Geschrieben 15. Februar 2009 Na ist doch ganz einfach. Wenn kein wissen vorhanden, dann benutze die Boardsuche. wenn da kein ergebnis kommt, mache einen thread auf und poste deine Frage. Ansonsten benutze das ergebnis der Suche. Wenn das Wissen vorhanden ist, fang an zu arbeiten. Also Text ist das halt nur was länger und sind ja auf einem Fachinformatikerboard... Zitieren
Mr_T Geschrieben 15. Februar 2009 Autor Geschrieben 15. Februar 2009 In VB: If not kowledge then if search.result.count=0 then post.question else search.result.items.use end if else working.start end if Gruß Mr.T Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.