TcpClient und TcpServer haben keine Verbindung


-H-T-P-

Mitglied
Nach einiger Zeit mach ich mal wieder mit meinen "Projekt" weiter. ;)

Folgendes Problem:
TcpClient und TcpServer haben keine Verbindung.

Genauer:
Ich habe 2 Programme geschrieben. Jedes davon hat einen Client und Server, damit sie Befehle austauschen können.
Die Programme habe ich 2 Ports für das Senden und Empfangen zugewiesen.
Das klappt wunderbar im Heimnetzwerk, aber wenn das 2.Programm in einem anderen Netzwerk ist, dann ist sense.

Könnte es sein das die Router-Firewall schuld ist? Denn die Windows Firewall, sowie alle AntiViren-Software mit Firewall ist ausgeschaltet!


Liegt es daran, oder an was anderes?
Habt ihr eine Idee wie man den Fehler umgehen kann?

Das Projekt ist sehr umfangreich und hat sehr viel Zeit in Anspruch genommen, wäre sehr schade wenn jetzt Schluss ist. :(
 

Turri

Erfahrenes Mitglied
Hallo,

wenn zwischen deinen 2 Netzwerken ein Router ist,
dann müssen natürlich die Ports im Router/Firewall auch freigegeben sein.

MfG Turri
 

-H-T-P-

Mitglied
...dann müssen natürlich die Ports im Router/Firewall auch freigegeben sein.
Also doch die Firewall im Router :mad:
Ist aber blöd jeden zu sagen, der dein Programm benutzt, dass er diese und jene Ports in der Router-Firewall öffnen soll.
Und dann gibt es immer wieder solche Leute: "Ports........Hä?........Wasn des?"
Und nach der Erkärung:"Aber da darf ich doch nichts dran ändern, vielleicht geht das dann nicht mehr..." oder "Du willst doch nicht etwa in meinen Computer rumschnüffeln..." usw.
(Bisschen übertrieben ;) )

Man kann das zwar mit der Firewall im Router irgendwie automatisieren, aber das muss dann erstmal erlaubt/aktiviert sein.


Noch eine letzte Frage:
Wenn die Ports "natürlich" freigegeben werden müssen, wie schaffen das dann Trojaner & Co durch die Routerfirewall?
Ist doch das selbe Prinzip, oder?
Schonmal überlegt? ;)
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Hallo,

Trojaner oder ähnliches schaffen es in der Regel durch die Dummheit der User, die sich durch irgendwelche Sachen die sie downloaden mit auf den Rechner ziehen.

Und wenn die Aktion von User ausgeht (outgoing) dann bringt es nichts incomming Ports zu blocken.

Und du müsstest incomming Ports am Router freigeben damit jemand von draussen auf dich Zugriff hat.

MfG Turri
 

-H-T-P-

Mitglied
Zum Teil ist deine Antwort einleuchtend, nur ein Trojaner kann man ja steuern, also muss der am anderen Ende der Leitung auch Befehle empfangen.

Ich hab mir mal folgendes überlegt:
ICQ, Live Messenger usw. sind doch eine Flash-Anwendung, richtig?
Und da läuft alles über den Messenger-Server.

Schlussfolgerung und vielleicht auch Lösung:
Also gehe ich recht in der Anahme, dass alle Programme die über einen Server laufen keine Ports benötigen. Also ist das so änlich wie ein Webbrowser?

Mir ist dann eingefallen, dass ich mal ein Programm hatte, das änlich wie ein Trojaner war. Dieses Programm ist über eine No-IP gelaufen und wiederrum diese No-IP ist dann über den Server gelaufen.
Diese "IP" heist dann z.B. test.no-ip.com.
Aber ich habe es nicht geschaft sie in mein Programm zu intigrieren.
Wie soll das gehen?
Oder kann man das Programm eigene Befehle auf einen eigenen Server über z.B. PHP die Befehle austauschen lassen? :confused:

Fragen über Fragen......
 

Turri

Erfahrenes Mitglied
Hallo,

Alle Programme die auf das Internet zugreifen benötigen einen Port.
Ports
Nur du bist der, der die Verbindung aufbaut (outgoing) deswegen geht das alles.
Bei den externen "Messenger"Servern (ICQ etc. ) sind die entsprechenden Ports natürlich frei.

Auch dein TCPClient und Server haben einen eingestellten Port worüber die kommunizieren.
Code:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TcpClient1->RemotePort = "18540";
    TcpClient1->RemoteHost = "http://deine.no-ip-adresse.com";
}
Wenn du keinen eingestellt hast, wird vermutlich irgend ein Standard Port verwendet.

Würdest du einen Webserver bei dir zuhause hinstellen dann müsstest du den Port 80 bei dir im Router freigeben sonst kann niemand von aussen(incomming) drauf zugreifen.

No-IP ist nur ein dynamic DNS Dienst. No-IP
Also gibt es dann eine feste URL über die ein Server (der seine IP ändert, z.b. durch Zwangstrennung bei DSL) trotzdem immer erreichbar ist. Vermutlich war dein Server über eine solche URL erreichbar.

So könntest du es mit deinem Programm auch machen...
Einen Server stellen, und den/die Port(s) im Router freigeben.
Andere Leute können dann z.b. über deine No-IP oder dyndns.org URL DynDNS auf deinen Server zugreifen. Die müssten dann auch nicht wissen (Ports ... hää... wasn das?)...
Das müsstest nur du einrichten.

MfG Turri

PS: Eigentlich wäre erstmal die Frage interessant was du vor hast, muss ich mir das als ein Chat vorstellen? Mit einer Beschreibung deinerseits kann man dir vielleicht gezielter weiterhelfen.
 
Zuletzt bearbeitet:

-H-T-P-

Mitglied
Ein Chat könnte man daraus machen, das stimmt.
Aber es gibt schon eh genug Chat-Programme.

Man könnte sagen, das es ein Mini-Admin Programm und/oder Mini-Help-Tool für andere Leute ist.
z.B. CMD-Befehle, Dateimanager mit Hochladen, Runterladen, Ausführen, löschen usw., Screenshot erstellen und senden, eine Update-Funktion gibts auch noch und paar andere Sachen.

Das Gegenstück hat auch eine kleine grafische Oberfläche um zu sehen was passiert usw.

Insgesamt klein, fein und was noch wichtiger ist, voll funktionsfähig.
ALLERDINGS habe immer noch das Problem mit den Ports. :p

Achja, das mit den Ports (dein Code) habe ich schon (siehe erster Post).
Ich geb auch zu, mit der No-IP war ich ein bisschen zu voreilig.

Naja, ich werde es jetzt, wenn keine Lösung gefunden wird, meinen Plan B hervorziehen und der geht so: Die Programme senden ihe Befehle über ein intigrieten WebBrowser mit PHP auf einen Server und das andere Programm hohlt sie sich.
Ist zwar nicht so schön (auch langsam), aber Hauptsache es geht erstmal.
 

Turri

Erfahrenes Mitglied
Hallo,

Ich verstehe deine Idee. ;)
Sehe ich das richtig das dann jeder deiner Kumpels dieses Admin Tool zur verfügung stellt?
Wenn nur du das bist, sehe ich kein Problem darin einen eigenen selbst Programmierten Server zu stellen.
Wenn du dich mit den Portfreigaben auskennst. Das musst ja NUR DU einrichten.
Nachteil den Server zu Hause zu haben ist, der Rechner muss immer laufen, dass der Server immer erreichbar ist.

Die Programme senden ihe Befehle über ein intigrieten WebBrowser mit PHP auf einen Server
Was für ein Server? Wo liegt der?
Der Server muss ja auch erreichbar sein.
Wäre das selbe Problem mit den Ports denk ich mal.

MfG Turri
 

-H-T-P-

Mitglied
Selbst programmierten Server? Versteh jetzt nicht genau was du meinst.
Meinst du PHP?

Aufjedenfall wäre es Schwachsinn einen eigenen Server zuhause laufen zu lassen, da geb ich dir recht.
ABER es gibt ja tausende Anbieter die kostenlosen Webspace anbieten. ;)
Und da ich mit den WebBrowser meine Befehle per PHP sende ist doch die Portfreigabe wurscht.

Ich hab schon bereits angefangen meine Programme umzuschreiben.
Mal schauen obs klappt.
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Ein selbstprogrammierten Server eben.
C++:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TcpServer1->LocalPort = "32140";
}
Ensprechend programmiert lauscht der dann auf Port 32140 ob durch irgendeine eingehende Nachricht (von einem TcpClient) eine Funktion ausgelöst wird.
Das Programm muss halt nur laufen...
Welche Funktionen du dem dann reinprogrammierst ist ja dir überlassen.

Ich denke aber auch das in deinem Fall irgend ein Freehostingangebot das beste ist.
Allein wegen der Stromkosten und ständigen Erreichbarkeit des Servers.

MfG Turri
 

-H-T-P-

Mitglied
Jetzt habe ich das schon fast fertig umprogrammiert.
Hab auch jetzt ein Free-Webspace.

Nur komm ich jetzt einfach nicht weiter.
Das Problem:
ich will eine Datei mit dem enthaltenen Befehl runterladen (mit urldownloadtofile), das geht auch, aber wenn sich die Datei auf den Webspace ändert speichert die Funktion urldownloadtofile die selbe Datei mit selben Inhalt wie vor der Änderung ab. :confused:
Anscheinend wird die Datei Irgendwo zwischengespeichert.
Wenn ich aber das Programm neustarte,dann lädt es wieder die neue Datei mit den neuen Befehl runter und danach geht das alles wieder von vorne los...

Hoffentlich habe ich das irgendwie verständlich erklärt.
Wie kann man das machen, dass eine Datei immer neu runtergeladen wird?
 

Turri

Erfahrenes Mitglied
Hi,

Du musst den Cache vorher löschen, damit die Datei neu runtergeladen wird.

:google: bringt da einige Treffer. Das Problem scheinen viele Leute zu haben.

Ich hoffe der Link geht.

MfG Turri
 

-H-T-P-

Mitglied
Danke
Kurz vorher hat mir einer in den Chat von Tutorials.de den selben Hinweis gegeben.
OK, dieses Problem gelöst und gleich das Nächste(n).

Da ich ja immer den Server abfragen muss bleibt das Programm immer kurzzeitig hängen und das ist extrem störend.
Meine Lösung:
Ein 2.Programm, das den Server abfragt. Das Problem: Um die Informationen zu übermitteln habe ich wieder TcpServer und TcpClient mit der lokalen IP benutzt. Und jetzt das Komische. Sobald der TcpClient/Server aktiviert ist funktioniert der WebBrowser nicht mehr. Fehler: so änlich wie "Konnte angegebene Adresse nicht finden.......". Doch diese Adresse ist richtig, sie hat ja funktioniert und funktioniert noch immer.
ODER
Man müsste es irgendwie schaffen, dass es nicht mehr hängen bleibt.
Nur wie?

An dieser Stellen möchte ich mich außerdem noch bedanken, dass du mich bisher (als einziger) unterstützt hast. Vielen Dank! :)
 

Turri

Erfahrenes Mitglied
Hiho,

An dieser Stellen möchte ich mich außerdem noch bedanken, dass du mich bisher (als einziger) unterstützt hast. Vielen Dank! :)
Ist doch kein Problem :)
Endlich auch mal jemand der sich bedankt.
Du kannst mir ja eine positive Bewertung geben. ;)

Du kannst das abfragen beim Server in einen extra Thread (TThread in der VCL) auslagern.
Da passiert es dir nicht, dass das komplette Programm hängt.
Weil das Programm das Abfragen nebenbei macht.
Dann musst du aber aufpassen, das keine parallelen Zugriffe auf gemeinsam genutzte Objekte stattfinden.
Sowas lässt sich aber z.b. mit einer "Critical Section" verhindern.

Thread im Borland Builder

Ist meiner Meinung nach die eleganteste Variante mit nem parallelen Thread.

MfG Turri
 

-H-T-P-

Mitglied
Sorry das ich so spät Antworte.
Danke für den Link, das klappt super! :)

Das Programm allerdings hat noch immer ein paar Fehler, aber der Ansatz passt schon.
Da muss ich mich einfach nochmal Zeit nehmen.