Direkt über zwei IP´s komunizieren(Internet)

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Paul-Jeschke.

    Direkt über zwei IP´s komunizieren(Internet)

    Hi Leute,

    also ich habe vor für meine Freunde ein kleines Chatprogramm schreiben. Dies soll sowohl im Lokalen Netzwerk als auch im Internet Funktionieren.
    Ich persönlich habe noch nicht soviel Erfahrung mit Netzwerkprogrammierung.
    Mein Programm funktioniert bis jetzt im Lokalen Netzwerk schon ganz gut. Wenn ich nun aber meinem Kumpel der 20km weit entfernt sitzt sage er soll mir ne Nachricht an meine IP senden dann kommt nix an :O
    Bitte Helft mir!!!

    Kommen wir nun zum Quellcode meine Programms:
    Also fangen wir mit dem Aufrufen der IP´s an.
    Die Lokale IP frag ich über DNS.GetHostName ab.
    Hier der Code dazu:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Ermittelt Lokale Ip
    3. ''' </summary>
    4. ''' <returns>Gibt Netztwerk-IP als String zurück</returns>
    5. ''' <remarks></remarks>
    6. Function NetworkIP() As StringDim LocalHostName As String = Dns.GetHostName()
    7. Dim ipEnter As IPHostEntry = Dns.GetHostByName(LocalHostName)
    8. Dim IpAdd() As IPAddress = ipEnter.AddressList
    9. Return IpAdd(0).ToString
    10. End Function


    So da funktioniert perfekt.
    Jetzt noch die Internet IP. Diese Rufe ich über einen externen Server auf.

    VB.NET-Quellcode

    1. Dim Uri As New Uri("http://service.jan-welker.de/myip.ashx")
    2.  
    3. ''' <summary>
    4. ''' Ermittelt die Internet Ip vom PC sofern eine Vorhanden ist und gibt sie als String weiter.
    5. ''' Ist der Pc nicht mit dem Internet verbunden gibt sie "No Internet conection" wieder.
    6. ''' </summary>
    7. ''' <returns>Internet-IP als String</returns>
    8. ''' <remarks></remarks>
    9. Function Ip_ermitteln() As String
    10. Try
    11. Dim Web_Request As HttpWebRequest = HttpWebRequest.Create(Uri)
    12. Dim Web_Response As HttpWebResponse = Web_Request.GetResponse
    13. Dim ResStream As System.IO.Stream = Web_Response.GetResponseStream
    14. Dim ResStreamReader As New StreamReader(ResStream, Encoding.UTF8)
    15.  
    16. Dim IP As String = ResStreamReader.ReadToEndResStream.Close()
    17. Web_Response.Close()
    18. Return IP
    19. Catch ex As Exception
    20. Return "No Internet conection"
    21. End Try
    22. End Function

    Auch das funktioniert soweit ganz gut.

    So und jetzt kommt mein Problem:

    VB.NET-Quellcode

    1. Dim Lauscher As TcpListener
    2. Dim Client As TcpClient
    3. ''' <summary>
    4. ''' Startet das Lauschen auf einem bestimmten Port und verarbeitet die IP´s
    5. ''' </summary>
    6. ''' <param name="Ip_Ziel">Ip des Ziel Computers</param>
    7. ''' <param name="Port">Port der auf dem Zielrechner abgehorcht wird</param>
    8. ''' <remarks></remarks>
    9. Sub New_Chat(ByVal Ip_Ziel As String, ByVal Port As Integer)
    10. Lauscher = New TcpListener(Port)
    11. Dim Tread_lausche As New Thread(New ThreadStart(AddressOf belauschen))
    12. Lauscher.Start()Tread_lausche.Start()
    13.  
    14. End Sub
    15. ''' <summary>
    16. ''' Sendet die Nachrichten an die Ziel IP
    17. ''' </summary>
    18. ''' <param name="Message">Die zu schickende Nachricht</param>
    19. ''' <param name="IP_ziel">Ip des Ziel PC´s</param>
    20. ''' <param name="Name">Name des Senders</param>
    21. ''' <param name="Port">Port auf dem gesendet wird</param>
    22. ''' <remarks></remarks>
    23. Sub Senden(ByVal Message As String, ByVal IP_ziel As String, ByVal Name As String, Optional ByVal Port As Integer = 55)
    24. 1:
    25. Try
    26. Client = New TcpClient(IP_ziel, Port)
    27. Dim writer As New StreamWriter(Client.GetStream())writer.Write(Name & "| " & Message)
    28. writer.Flush()
    29. Catch ex As ExceptionMsgBox(ex.Message)
    30. GoTo 1
    31. End Try
    32.  
    33.  
    34.  
    35. End Sub
    36. ''' <summary>
    37. ''' lauscht solang auf einem Port bis das Programm beendet wird
    38. ''' wenn nachricht eintrifft gibt die Funktion sie als String wieder
    39. ''' </summary>
    40. ''' <returns>Empfange nachricht</returns>
    41. ''' <remarks></remarks>
    42. Function belauschen() As String
    43.  
    44. Do
    45. If Lauscher.Pending = True ThenClient = Lauscher.AcceptTcpClient()
    46. Dim Eintreffende_Message As String = NothingDim reader As New StreamReader(Client.GetStream)
    47. Try
    48. While reader.Peek > 1
    49. Eintreffende_Message += Convert.ToChar(reader.Read()).ToString
    50. End While
    51. Dim pos As Integer = InStr(Eintreffende_Message, "|")
    52. Dim senderIP As String = Mid(Eintreffende_Message, 1, pos - 1)
    53. Dim message As String = Mid(Eintreffende_Message, pos + 1)
    54. Return senderIP & " | " & message & vbCrLf
    55. Catch ex As Exception
    56. MsgBox("Die nachricht konnte nicht empfangen werden da: " & ex.Message)
    57. End Try
    58. Else
    59. Return Nothing
    60. End If
    61. Loop
    62.  End Function


    Dieser Code Funktioniert perfekt im Lokalen Netzwerk.
    Aber sobald man eine Nachricht über Internet verschickt kommt diese nicht an :(
    kann mir bitte sagen was ich da genau falsch mache!
    Für Hilfe währ ich sehr dankbar.
    Wer sich den gesamten Quellcode anschauen möchte der Findet diesen Im anhang.

    *Topic verschoben*
    Dateien
    • Chat.zip

      (196,43 kB, 118 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Paul-Jeschke“ ()

    Seine Firewall bzw. sein Router blockt Verbindungsanfragen.
    Kurz: Du kannst eine Verbindung nach außen herstellen jedoch nicht jemand von außen nach innen. Somit will sich einer von euch immer verbinden während der andere es immer blockt. Einer von euch muss die Ports am Router und eventuell auch in der Firewall freischalten.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Achso hab ich vergessen zu erwähnen Ports sind alle die benötigt werden offen ;)
    ich hatte auch schon ein Programm geschrieben das alle Ports gleichzeitig bombardiert(im Bereich von 0 - 10000) mit anfragen ob diese doch so freundlich währen die Nachricht durch zulassen. Gebracht hat dies es allerdings nicht(leider)
    und wie gesagt im lokalen Netzwerk funktioniert es perfekt nur im inet nicht.
    ok ik bin iwi zu blöd den code einzurücken :O
    also nimm doch bitte die angefügte Datei das steht alles ordentlich drin ;)
    jo gudd aber ich hab mich heut erst angemeldet weil ik wirklich am ende mit meinem Latein wahr und bin noch nicht ganz flüssig mit dem Editor Werkzeug hier bei VB-Paradise also bitte ich vielmals um Entschuldigung das mein code nicht ganz so sauber ist ;)

    Paul-Jeschke schrieb:

    Ports sind alle die benötigt werden offen
    Ist auf dem Router auch das entsprechende Port-Forwarding eingestellt?
    Es hilft noch nichts, wenn der Router den Port nur öffnet, er muss die Anfrage auch an den entsprechenden Rechner weiterleiten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ok ums mal kurz zu sagen ich hab jetzt noch nicht soviel wissen über Netzwerke. Ich hab mir mit diesem Projekt das ziel gesetzt Netzwerkprogrammierung zu verstehen und zu beherrschen.
    Also nochmal zurück auf null.
    1. Frage:
    Was ist Port-Forwarding und wie stellt man es ein?
    2. Frage:
    Wie machen das z.b. Webseiten brauchen doch nicht auch jedes Mal ein wegweißer der ihnen sagt welcher Rechner im Router-Netzwerk sie nun angesprochen hat?
    3.Frage:
    Wie kann man zwei IP-Adressen kombinieren??
    Ich muss ja erst zu Router gehen und dann und dann zum Rechner aber wie macht man dies??

    Paul-Jeschke schrieb:

    Was ist Port-Forwarding und wie stellt man es ein?
    Portweiterleitung
    Port-Forwarding benötig man für eingehende Verbindungen.
    Wie man das konfiguriert hängt vom Router ab und steht in dessen Handbuch.

    Paul-Jeschke schrieb:

    Wie machen das z.b. Webseiten
    Ein Webserver ist auf Port 80 freigeschaltet. Alle Clients verbinden sich auf diesen Port.
    Der Webserver baut keine aktiven Verbindungen zum Client-PC auf. Deshalb muss auf Client-Seite nichts konfiguriert werden.
    Die Firewall/der Router vor dem Webserver hat natürlich auch Portforwarding aktiv. Aber das konfiguriert der Netzwerk-Administrator auf Serverseite.

    Paul-Jeschke schrieb:

    Wie kann man zwei IP-Adressen kombinieren?
    Zumindest einer der beiden Clients muss als Server agieren und eingehende Verbindungen erlauben.
    Für diesen muss eine Router-Freischaltung erfolgen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    ok ersten und zweitens hab ik halbwegs begriffen.
    aber das mit dem Server check ich noch nicht ganz :O
    der Server müsste doch dann auf dem router liegen wenn man so pauschal nicht zwei IP´s miteinander kombinieren kann. Und dieser müsste die Daten ja dann weiter versenden richtig oder bin ik grad voll falsch?
    Wenn der Server auf dem Router liegen würde, müsste man keine Port-Forwarding aktivieren.
    Da aber genau das nicht der Fall ist, muss der Router wissen, auf welchen Rechner er die eingehenden Verbindungen weiterleiten soll.

    z.B.: alle von extern eingehenden Verbindungen auf Port 2345 bitte weiterleiten an die (interne) Adresse 192.168.1.123 an Port 1234

    Zusätzlich kommt noch die Stolperfalle, dass sich bei "normalen" Provider-Verträgen deine externe Adresse der Internetverbindung permanent ändert.
    Da der Client die aber beim Verbindungsaufbau angeben musst, muss er vorher wissen wie die gerade lautet.
    Um das Problem zu lösen, gibt's das Thema DynDNS, aber das googelst du am besten, wenn du den Rest verstanden hast.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    gut danke und muss man das am Router einstellen oder kann man auch einfach ein Mitbringsel an seine Daten anfügen die dem Router sagen da hin diese Post bitte.
    Ich mein Skype schafft das ja och iwi und ich würde sowat gerne machen ;)
    nur wie gesagt so großes wissen über Netzwerke hab ich nicht.
    Ich meine ich weis gut mit dem Netzwerk und Freigabe Center umzugehen aber das wahr es dann och schon fast ;)
    und einen eigenen Router hab ich nicht das heist platz zu ausprobieren habe ich nicht. Und der Kumpel mit dem ich immer gugge ob es funst hat vom proggen glei ma gar kein plan und deswegen kann ich ihn och nicht zu texten. Was ich suche ist ein weck der möglichst human und verdamm einfach ist.
    das heist idealer weise kommt nur die Meldung von da Win-Firewall und das wars.
    Ich hab mir mit diesem Projekt das ziel gesetzt Netzwerkprogrammierung zu verstehen


    Und was genau tust du dafür ?
    Du scheinst ja überhaupt keinen Plan zu haben. Wirklich nichtmal die grundlegensten Basics.
    Es gibt zu diesen Themen zig Dokumentationen usw. ganz einfach zu finden und zu lesen.
    Das ist meine Signatur und sie wird wunderbar sein!

    Paul-Jeschke schrieb:

    Skype schafft das ja och iwi
    Skype verwendet dafür einen ganz cleveren Algorithmus namens Hole-Punching.
    Aber auch das ist nur möglich, weil der initiale Verbindungsaufbau über einen zentralen Server geht.
    Dieses Thema solltest du erst mal ganz weit weg schieben, bevor du dich in Netzwerkprogrammierung nicht komplett als Profi fühlst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ja hab mir auch ein paar gelesen sonst wär ich net soweit gekommen und wie gesagt lokal funst es perfekt.
    Und in diese paar Code Zeilen habe ich jetzt schon 3 Monate reingesteckt.
    und so viel Code ist das nicht da habe ich schon wesentliche größere Projekte in einem Monat fertig gehabt.
    so aber mein Problem besteht immer noch bitte mal eine Lösungs Ansatz iwas was zum denken anregt.


    @petaod
    ok danke also lieber iwi mein Kumpel erklären wie man seinem Router beibringt Daten an die richtige Adresse zu schicken ok
    oder geht das mit dem Hinweis für den Router vielleicht???? (sorry aber die frage interessiert mich brennend)