Portfreigabe oder IP Zugriff funktioniert nicht (Client / Server)

  • C#

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Sekki.

    Portfreigabe oder IP Zugriff funktioniert nicht (Client / Server)

    Guten Tag,

    Nach stundenlanger Suche (wortwörtlich), habe ich absolut keine Lösung für mein Problem gefunden. Ob ich Tomaten auf den Augen habe, lässt sich dann wohl sehen. Bitte nehmt euch meine Signatur zu Herzen, dass würde ich sehr wertschätzen.

    Zum Problem:
    Ich versuche ein Programm zu erstellen, welches mit Server und Client kommuniziert. Soweit, so gut. Der Code, den ich habe, funktioniert und ich kann über 127.0.0.1 und den Port lauschen und auch nach dem lauschen mit dem Client auf den Server, der lauscht, connecten. Nur weiß ich nun nicht, wie ich es hinkriege, dass jemand anderes von Außerhalb auf meine IP lauschen kann.



    Wie ihr auf dem Screenshot seht, ist links mein Server und rechts der Client. Alles funktioniert wunderbar, wie man ebenfalls sehen kann. Die IP ist nur eine Beispiel IP, damit ihr seht, dass es meine Maschinen IP ist (also meine lokale(?) IP). Ich habe nun einen Port über meine FritzBox freigegeben und weiß nun nicht mehr weiter. Der Server lauscht nun den Port, aber wie kann ich meine öffentliche IP benutzen, damit andere darauf lauschen können? Was ich mir im großen und ganzen vorstelle, ist einfach nur: Der Server soll auf eine IP, die ich auf "myip.is" sehen kann, lauscht. Der Port ist im Beispiel 1234, also sage ich mal in dem Fall, dass er auf genau diesen Port lauschen soll. Wie kriege ich das hin? Ich habe meine IP auch mit dem NO-IP Service verknüpft und habe nun eine richtige Domain (xxxx.ddns.net) aber das ist eine andere Geschichte.

    Es wäre super, wenn ihr mir mal wieder helfen könntet und / oder mit auf die Sprünge hilft. Ich habe sämtliche Links durchgelesen, einfach gar nichts funktioniert (außer, ich habe sie nicht verstanden, aber dafür bin ich hier).

    Ich nutze "SimpleTCP" für C#. Hier ist der Code vom Server:
    Spoiler anzeigen

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. using SimpleTCP;
    11. namespace My_Client
    12. {
    13. public partial class ClientForm : Form
    14. {
    15. public ClientForm()
    16. {
    17. InitializeComponent();
    18. }
    19. SimpleTcpClient client;
    20. private void Form1_Load(object sender, EventArgs e)
    21. {
    22. try
    23. {
    24. client = new SimpleTcpClient();
    25. client.StringEncoder = Encoding.UTF8;
    26. client.DataReceived += Client_DataRecieved;
    27. client.Connect(textboxHost.Text, Convert.ToInt32(textboxPort.Text));
    28. client.WriteLineAndGetReply("Someone connected", TimeSpan.FromSeconds(0));
    29. }
    30. catch (Exception ex)
    31. {
    32. MessageBox.Show(ex.ToString());
    33. this.Close();
    34. }
    35. }
    36. private void Client_DataRecieved(object sender, SimpleTCP.Message e)
    37. {
    38. textboxMessages.Invoke((MethodInvoker)delegate ()
    39. {
    40. textboxMessages.Text += e.MessageString.Replace("", "");
    41. });
    42. }
    43. private void Button1_Click(object sender, EventArgs e)
    44. {
    45. client.WriteLineAndGetReply(textboxSend.Text, TimeSpan.FromSeconds(0));
    46. }
    47. }
    48. }


    *Topic verschoben*
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Sekki Kann es sein, dass die Feuerwand das Port blockiert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du brauchst da nichts zu ändern, deine Server Anwendung konfigurierst so das sie auf deiner IP-Adresse + Port lauscht (zb. 192.168.178.52:1234), in der Fritzbox konfigurierst du nun die "Freigabe", was erstens die Firewall so konfiguriert das eingehende Verbindungen zu dem Port 1234 zugelassen werden und zweitens alle eingehenden Datenpakete für den Port 1234 an deine lokale IP-Adresse + Port (192.168.178.52:1234) weitergeleitet werden (nennt sich NAT).
    In der Client Anwendung wird nun deine öffentliche IP-Adresse + Port eingetragen (zb. 123.123.123.123:1234), fertig.

    Anmerkung:
    Damit das funktioniert, darfst du kein Dual Stack Lite haben, das würde dann nur mit deiner IPv6 Adresse funktionieren.
    Wie von @RodFromGermany schon angesprochen, muss die Firewall auf dem der Server läuft so konfiguriert sein das sie Verbindungen über Port 1234 zulässt.

    Frage:
    Was ist eigentlich dein Problem?
    Ich lese nur eine "Erklärung", aber keine Fehlerbeschreibung/Fehlermeldung.

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

    Du sagst, der Server lauscht auf 127.0.0.1. Das ist Localhost. Der Server muss auf 0.0.0.0 (allen verfügbaren Schnittstellen) horchen. Bzw. gibt es IpAddress.Any was das übernimmt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @RodFromGermany
    Ich habe über die Firewall geschaut, der genutzte Port wird mit Sicherheit nicht blockiert. Aber schön, dass du es nochmal erwähnst, ich war mir nicht zu sicher, ob es wirklich daran liegen könnte. Denn meines Wissens werden Ports nicht einfach so blockiert, aber ich weiß da nicht mehr als die Erfahrenen.

    @slice


    Bild A1:


    Und hier ist die Portfreigabe:


    Ich habe mich zudem mal durchgelesen: Ich habe anscheinend Dual Stack Lite(?), da ich eine IPv4 und IPv6 IP Adresse im Router habe. Wenn ich unter Fritzbox -> Zugangsdaten -> IPv6 die Unterstützung deaktiviere, funktioniert das Internet nicht mehr. Ich hoffe, dass ich mich da richtig durchgelesen habe. Was könnte ich in diesem Falle machen? Zu der Firewall: Könntest du mir da vielleicht ein passendes Tutorial schicken? Ich bin mir inzwischen unsicher, ob ich alles richtig gemacht habe.

    Zu deiner Frage, was mein Problem ist: Ich hoffe, dieser Beitrag kann dich da aufklären. Es ist das Portforwarding, denke ich inzwischen

    @SpaceyX
    Ich nutze 127.0.0.1 nur fürs Debuggen.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

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

    Mhh, im Internet liest man schon Sachen, wie 1&1 schaltet nur noch DS-Lite-Anschlüsse und dann wieder das Gegenteil. Was steht denn bei "Internet" -> "Online Monitor". Ich meine, da sollte ersichtlich sein, ob DS-Lite oder DS mit erreichbarer IPV4 geschaltet ist?



    Sieht bei mir so aus. Bevor ich die 4,90€ für echten Dualstack bezahlt habe, stand hier Dual-Stack-Lite.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX

    Sieht bei mir so aus. Bevor ich die 4,90€ für echten Dualstack bezahlt habe, stand hier Dual-Stack-Lite.[/quote]

    So sieht dat bei mir aus. Das heißt wohl.. ich habe DS-Lite, richtig? Hmm.. Das ist wirklich ärgerlich. Gibt es eine Möglichkeit, dennoch irgendwie mein Ziel zu erfüllen?

    Edit: Nachdem ich erfahren habe, dass es so etwas wie "Dual Stack" gibt, habe ich mich mal schlau gemacht. Anscheinend reicht ein Anruf bei 1&1, um echtes Dual Stack ohne Aufpreis aktivieren zu lassen. Wenn ich dies mache, wird meine Portfreigabe dann von außerhalb gesehen? Kann mir das jemand bestätigen?
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

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

    Natürlich geht das auch mit IPv6. Der Server muss eben ein bisschen umgebaut werden.

    C#-Quellcode

    1. private Socket _server;
    2. public Form1()
    3. {
    4. InitializeComponent();
    5. _server = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
    6. _server.Bind(new IPEndPoint(IPAddress.IPv6Any, 8080));
    7. _server.Listen(10);
    8. Task.Run(() =>
    9. {
    10. while(true)
    11. {
    12. Socket client = _server.Accept();
    13. byte[] buffer = new byte[4096];
    14. int r = client.Receive(buffer, SocketFlags.None);
    15. this.textBox1.Invoke(new Action(() =>
    16. {
    17. this.textBox1.Text = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
    18. }));
    19. client.Close();
    20. }
    21. });
    22. }
    23. }


    Man verwendet hier Internetwork.V6 und IpAddress.IPv6Any. Dann ist der Server auch von außen erreichbar. Natürlich gilt das selbe auch für die Clients. Problematisch wird es dann, wenn ein Client keine IPv6-Adresse hat. Wie z. B. im Mobilfunkbereich. Dann ist es nicht möglich, den Sever von außen zu erreichen. Das war auch der Grund, warum ich 4,90€ Euro für Dual-Stack bezahle. Solange IPv6 noch nicht überall Einzug gehalten hat, macht es meiner Meinung nach schon Sinn, beides zu haben.

    Um Deine Frage zu beantworten. Ja, sobald Du einen echten Dual-Stack hast, kannst Du Deinen Server via IPv4 von außen errreichen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX
    Vielen Dank für die ausführliche Antwort. Ich habe mich weiterhin schlau gemacht und eine Portfreigabe für IPv6 ist leider nicht nützlich in meinem Fall. Ich habe mal bei 1&1 angerufen und gefragt, ob sie mir Dual Stack aktivieren können. Ich werde morgen eine Antwort von den Technikern erhalten (die Ahnung haben, der Service war zwar nett aber wusste nichts von einem "echten Dual Stack"). Ich werde den Beitrag auf gelöst stellen, sobald ich zufrieden mit der Antwort bin. :)

    Informationen für zukünftige User:
    - Für 1&1 kann man Dual Stack kostenlos ohne Aufpreis anfordern lassen. Andere Anbieter verlangen ca. 5€ pro Monat.

    Edit: \\ Die Deaktivierung von Dual Stack Lite war erfolgreich und das Programm funktioniert nun einwandfrei.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

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