Heimnetzwerke - WIFI, LAN, Router und Co 16.535 Themen, 81.366 Beiträge

Chat über WLAN, Delphi (C++Builder)

Mdl / 8 Antworten / Baumansicht Nickles

Nachdem ich ein Weilchen gesucht habe, habe ich eine Anleitung zum 'Bau eines Chat-Programms' oder genauer eines Servers und eines Clients gefunden (www.veerle-en-geert.be/delphi/ebooks/Delphi%206%20-%20Wie%20baue%20ich%20mir%20einen%20Chat.pdf) und es hat lokal auf meinem Rechner erstmal prima funktioniert:

Es werden zwei Programme erstellt. Der Server, über den sämtliche Kommunikation läuft und der sämtliche Eingaben des (bzw. natürlich der) Clients empfängt und weiterleitet. So habe ich zu Testzwecken auf meinem einen Rechner zwei Clients laufen lassen,die über den Server (oder genauer: dessen lokale TCP/IP (192.168,....)) miteinander prima kommunzieren können. Intern wird dies über die Typen TClientSocket und TServerSocket bewerkstelligt. Eigentlich musste man nur darauf achten, dass die Ports identisch sind.

Nach der ersten Freude, bin draufgekommen, dass es sich bei der TCP/IP-Adresse, über die der Chat läuft und die im Programm ermittelt wird um eine lokale Adresse handelt (192.168,...). Da ich letztlich aber mit Personen chatten will, die sich nicht im LAN befinden, wollte ich es jetzt global ausweiten.

Wenn ich jetzt statt der lokalen IP-Adresse des Servers die globle angebe z.B. (85.181.14.109) funktioniert keinerlei Kommunikation mehr und nach einer gewissen Zeit erscheint eine entspr. Timeout-Exception.

Bin jetzt ratlos, wo ich ansetzen kann! Interessant ist vielleicht, dass beim Typen TClientSocket eine Eigenschaft existiert, in die man die TCP/IP-Adresse schreibt ('Host'), (anhand derer ja auch gesehen werden kann, ob ein lokaler oder globaler Zugriff erwünscht ist), bevor man den Zustand des ClientSockets aktiv setzt. Bei TServerSocket gibt es keine solche Eigenschaft. Woher soll der Socket wissen, woher der Zugriff erfolgt? Oder ist er bei TServerSocket immer lokal und es gibt eine andere Klasse, die für globale Zugriffe zuständig ist? Oder es ist egal, die Hauptsache ist, dass die Ports übereinstimmen?

Ok, kann mir jemand einen Tipp geben, in welcher Richtung ich weiter suchen kann oder durch welche Typen ich TClientSocket und TServerSocket ersetzen kann, um nicht auf LAN beschränkt zu sein?

Herzlichen Dank!!

Mdl

P.S. Sowohl ein Netzwerk, als auch ein Programmierproblem

bei Antwort benachrichtigen
shrek3 Mdl „Chat über WLAN, Delphi (C++Builder)“
Optionen

Programmiertechnisch werde ich dir nicht helfen können - netzwerktechnisch vielleicht.

Hast du die Ports in dem Router auf die interne IP des Servers freigegeben, damit der Server Anfragen des externen Clients entgegennehmen kann?

Gruß
Shrek3

Fatal ist mir um das Lumpenpack, das, um Herzen zu rühren, den Patriotismus trägt zur Schau, mit all seinen Geschwüren. Heinrich Heine
bei Antwort benachrichtigen
Mdl shrek3 „Programmiertechnisch werde ich dir nicht helfen können - ...“
Optionen

Hallo Shreck3,

Programmiertechnisch werde ich dir nicht helfen können - netzwerktechnisch vielleicht.

Definitiv! Es funktioniert!! Vielen Dank!

An den Router hatte ich gar nicht gedacht.

Ziemlich viele Wahlmöglichkeiten bei der Fritz!Box:

Eingestellt habe ich erstmal den HTTP-Server, der von sich aus den Port 80 freigibt.

Und das hat auf Anhieb funktionert.

Dann habe ich mit der Alternative 'Andere Anwendungen' gespielt, hatte aber damit keinen Erfolg (weder mit Port 1234, noch 5678).

Ist die Freigabe des HTTP-Servers die ideale Wahl?

Als jemand, der nur sehr rudimentäres Netzwerk-Wissen hat frage ich mich jetzt etwas, wie gefahrlos die Freigabe des HTTP-Servers/Port 80 am Router ist und was man tun kann, um diesen offenen Port zu schützen (und vielleicht nur meinem Chat-Server zur Verfügung zu stellen).  

Nochmals danke,

Mdl

bei Antwort benachrichtigen
shrek3 Mdl „Hallo Shreck3, Definitiv! Es funktioniert!! Vielen Dank! An ...“
Optionen

Es sollte auch möglich sein, den Kontakt zum Chat-Server auch auf anderen Ports herzustellen. Voraussetzung dafür ist natürlich, dass die Chat-Software auf dem Server entsprechend konfiguriert ist und keine Firewall (z.B. die Windows-Firewall auf dem Chat-Server) dieses unterbindet.

Versuche es mal so:

Entferne den "HTTP-Server" und "My Chat" und gehe dann auf "Neue Portfreigabe" (siehe dein zweites Bild im vorigen Posting).

Wähle dann "Andere Anwendungen" aus und orientiere dich am beigefügten Screenshot.
(Anmerkung: Ich weiß natürlich nicht, welches deine Chat-Ports sind - 1234 und 5678 habe ich deinem Screenshot entnommen.)

Wiederhole das mit dem anderen Port (5678).

Auf diese Weise stellst du sicher, dass nur auf den beiden Ports eine Weiterleitung auf Port 80 stattfindet.

Gruß
Shrek3

Fatal ist mir um das Lumpenpack, das, um Herzen zu rühren, den Patriotismus trägt zur Schau, mit all seinen Geschwüren. Heinrich Heine
bei Antwort benachrichtigen
Mdl shrek3 „Es sollte auch möglich sein, den Kontakt zum Chat-Server ...“
Optionen

Hallo Shreck3,

danke für die Info. Da ich den Source-Code selbst erstelle, kann ich die Port-Nummern selbst definieren.

Bis jetzt habe ich ja alles auf einem Computer und mit einem Netz getestet. Jetzt wollte ich es mal mit zwischen zwei Netzen wählen. Dazu sollte der eine Computer meine bisherige DSL-Leitung mit der Fritz!Box verwenden, der andere sich über einen Hotspot meines Androids-Internetzugang einwählen.

Das hat leider NICHT geklappt.

Ich habe alle denkbaren Kombinationen ausprobiert. U.a. dass der Server via Fritz!Box Internetzugang hatte und der Client über den Hotspot.

Bei ausschließlicher Nutzung des Hotspot-Zugangs: Während der Zugriff über die LAN-IP funktionierte, scheiterte der Zugriff über WLAN-IP (auch wenn Client und Server auf nur einem Computer liefen). Also wohl wieder das Portfreigabeproblem... Aber kann man denn auf einem Android-Hotspot Ports freigeben? Ich habe keine entspr. Optionen gefunden und auch keine Lösungen im Internet...

Ich vermutle mal, dass sowohl die Ports für die Server- als auch der Client-Verbindung freigeschaltet werden müssen, denn der Server kommuniziert ja auch mit dem Client. 

Könnte man evtl. zwei Drahtlosnetzwerkverbindungen (mit versch.IP-Adressen) auf der Fritz!Box simulieren? Vermutlich keine sinnvolle Idee, da dann ja trotzdem beide Zugänge in die eine IP-Adresse, mit der die Box mit dem Provider verbunden ist, 'übersetzt' werden. D.h. selbst wenn der Test damit funktionieren sollte, ist das noch keine Garantie, dass es mit zwei echten unterschiedlichen IP-Adressen funktioniert.

Vermutlich werde ich das mit zwei echten DSL-Modems testen müssen, deren Ports ich auch freigeben kann...

Viele Grüße,

Mdl

bei Antwort benachrichtigen
Borlander Mdl „Hallo Shreck3, danke für die Info. Da ich den Source-Code ...“
Optionen
Das hat leider NICHT geklappt.

Du hast dabei berücksichtigt, dass sich die externe IP Deines DSL-Anshlussess ändert? Und Du hast eine Portweiterleitung in der FritzbBox definiert die z.B. Port 57.000 auf Port 57.000 mit der IP im LAN auf der der Server läuft definiert?

Bei ausschließlicher Nutzung des Hotspot-Zugangs: Während der Zugriff über die LAN-IP funktionierte, scheiterte der Zugriff über WLAN-IP (auch wenn Client und Server auf nur einem Computer liefen).

An die veränderte IP-Adresse des Client gedacht? Lokal auf einem Computer kann das definitiv kein NAT-Problem sein und müsste immer laufen. Zwischen zwei Computern hängt es davon ab ob die sich gegenseitig im WLAN überhaupt zu sehen bekommen. Router/APs können so konfiguriert werden, dass die Clients nicht untereinander kommunizieren können, sondern nur Zugriff aufs Internet bekommen.

Aber kann man denn auf einem Android-Hotspot Ports freigeben?

Würde bei Mobilfunkzugängen nichts bringen. Da setzen die ISP/Mobilfunkanbieter bereits NAT ein (d.h. Du hast keine externe IP-Adresse exklusiv für Dich), auf dessen Konfiguration Du keinen Einfluss nehmen kannst.

Ich vermutle mal, dass sowohl die Ports für die Server- als auch der Client-Verbindung freigeschaltet werden müssen, denn der Server kommuniziert ja auch mit dem Client. 

Für den Client ist keine besondere Konfiguration erforderlich. Ausgehende Verbindungen sind bei NAT kein Problem.

Vermutlich werde ich das mit zwei echten DSL-Modems testen müssen, deren Ports ich auch freigeben kann...

Bei Reinen Modems hättest Du überhaupt kein Port-Freigabe, weil da kein NAT drin steckt. Da erreicht alles was von außen kommt ungefiltert den Computer der die Verbindung aufbaut. Incl. Dinge wie Zugriffsversuche auf Dateifreigaben oder die Ausnutzung möglicher Sicherheitslücken in Systemdiensten wie die Vergangen eindrucksvoll gezeigt hat.

Gruß
Borlander

bei Antwort benachrichtigen
Mdl Borlander „Du hast dabei berücksichtigt, dass sich die externe IP ...“
Optionen

Hallo Borlander,

danke für die Antworten und Nachfragen...

Das mit der nicht-exklusiven IP-Adresse bei Mobilfunkverbindungen ist ja interessant.

Ich sag mal, wie ich im Prg. die akt. WLAN-Adresse ermittle: Auslesen des Inhalts der Adresse http://iplookup.flashfxp.com.

Die Idee ist, diese gefundenen Server-IP-Adresse dann in einem fest-definierten FTP-File abzulegen, wo der Client sie auslesen kann und weiss, mit welcher Server-IP er sich verbinden kann.

Wenn ich es richtig verstehe baut der Client dann einfach eine Verbindung auf, indem er versucht mit der Server-IP + Port eine solche herzustellen. Mittels dieser Verbindung können dann Server+Client miteinander (in beiden Richtungen) kommunizieren.

Auf die anderen Punkte werde ich gerne zurückkommen, wenn ich die Möglichkeit habe, mich über zwei 'Standard-DSL'-Verbindungen parallel mit dem Internet zu verbinden...

Viele Grüße,

Mdl

bei Antwort benachrichtigen
Borlander Mdl „Chat über WLAN, Delphi (C++Builder)“
Optionen
Wenn ich jetzt statt der lokalen IP-Adresse des Servers die globle angebe z.B. (85.181.14.109) funktioniert keinerlei Kommunikation mehr und nach einer gewissen Zeit erscheint eine entspr. Timeout-Exception.

Gehe ich recht in der Annahme, dass der Computer mit dem Server läuft hinter einem NAT-Router hängt und keine eigene externe IP-Adresse hat unter der er erreichbar ist? Da käme dann die bereits von Shrek angesprochene Port-Weiterleitung ins spiel.

Bei TServerSocket gibt es keine solche Eigenschaft. Woher soll der Socket wissen, woher der Zugriff erfolgt?

Muss er nicht. Der lauchst auf dem Port und wartet darauf, dass sich ein Client mit beliebiger IP-Adresse verbindet. Eine Unterscheidung zwischen lokalen und globalen IP-Adressen gibt es auch gar nicht.

Gruß
Borlander

bei Antwort benachrichtigen
Mdl Borlander „Gehe ich recht in der Annahme, dass der Computer mit dem ...“
Optionen

Danke für die Infos...

Gehe ich recht in der Annahme, dass der Computer mit dem Server läuft hinter einem NAT-Router hängt und keine eigene externe IP-Adresse hat unter der er erreichbar ist? Da käme dann die bereits von Shrek angesprochene Port-Weiterleitung ins spiel.

Vermutlich ja: Mein Comp. auf dem der Chat-Server läuft, ist drahtlos mit meinem Fritz!-Router verbunden. Mit jedem Neustart von diesem bekomme er eine andere IP-Adresse zugewiesen.

Muss er nicht. Der lauchst auf dem Port und wartet darauf, dass sich ein Client mit beliebiger IP-Adresse verbindet. Eine Unterscheidung zwischen lokalen und globalen IP-Adressen gibt es auch gar nicht.

Ok. Vermutlich können damit auch nicht zwei Prg. gleichzeitig einen bestimmten Port abfragen, denn wie sollen sie dann unterscheiden können, für wen die Daten gedacht sind.

Interessant, dass ich dann bei der Wahl der HTTP-Server-Portfreigabe keine Port-Wahlmöglichkeit habe (siehe Bilder bei der Antwort auf Shreck): Port 80 ist da von Haus aus fest eingestellt. Mit dieser Wahl könnte ich also keine zwei Serverprogramme gleichzeitig auf einem Comp. laufen lassen.

Viele Grüße,

Mdl

bei Antwort benachrichtigen