![]() |
TTCPClient LocalHost
Hallo,
irgendwie blicke ich im Moment nicht durch und brauche mal einen Wink mit dem Gartenzaun. Windows XP Prof SP3 Delphi 2009 Prof (mit allen Updates) Ich habe mir eine Komponente geschrieben, die über TCP mit einem Gerät (betrachtet das Gerät als Blackbox, ich kann daran nichts ändern) kommuniziert. Damit die Kommunikation mit der BlackBox funktioniert, muss ich in das TCP Protokoll ein für diese BlackBox spezifisches Protokoll als Nutzdaten im TCP Protokoll einbetten. Das ist der Zweck der Kompo und das funktioniert auch ohne Probleme. Also erzeuge ich in meiner Kompo dynamisch einen TTCPClientt aus dem Tab "Internet" (das Indy10 TidTCPClient Monster habe ich wieder rausgeschmissen) und versorge dynamisch alle Properties. Im PC habe ich zwei Netzwerkkarten, 192.168.0.8 und 193.168.0.11 Und nun nach der langen Vorrrede endlich zum Problem. Egal was ich beim TCPClient als LocalHost eintrage, es wird immer der NIC mit der Adresse 192.168.0.8 verwendet. Ich lese nach dem connecten nochmal den LocalHost aus, da steht richtig 192.168.0.11 drin. Aber die Kommunikation findet immer über 192.168.0.8 statt. Erst wenn ich in der Systemsteuerung den NIC mit der Adresse 192.168.0.8 deaktiviere, läuft die Kommunikation wie gewünscht über 192.168.0.11. Wo ist das Schräubchen, an dem ich da drehen muss ??? Gruß Question_mark |
AW: TTCPClient LocalHost
Guten Abend,
was ist die Ip-Adresse der Blackbox? Auf welches Interface zeigt das default Gateway? Wie sind die Netzmasken der Interfaces gesetzt? Grüße Klaus |
AW: TTCPClient LocalHost
Hallo,
zu 1) Also eigentlich gibt es sogar 2 Blackboxen 192.168.0.3 und 192.168.0.4 zu 2) Default Gateway ist mein DSL-Router mit 192.168.0.1 Aber vor dem Router sitzt ein Switch, an dem alle Geräte im LAN zusammenhängen, also es gibt noch mehr als die oben angegebenen (Drucker, weitere PC). Ich habe diese zur Vereinfachung erstmal weg gelassen. Vom DSL Router geht ein Anschluß direkt zum Switch, der andere direkt zum Fernseher für IPTV. zu 3) in meinem LAN haben alle Geräte den IP Bereich 192.168.0.xxx und dann natürlich auch 255.255.255.0 als Subnet mask Gruß Question_mark |
AW: TTCPClient LocalHost
Zitat:
Zitat:
Warum sollte der TCPClient dann zwingend die höhere nehmen? Edit1: TCustomWinSocket.Localhost -> liefert die lokale Hostadresse ![]() Wenn der Client die TCP Verbindung aufbaut ist es unerheblich von welchem der beiden Interfaces das geschieht. Sollten die Interfaces in unterschiedlichen Netzen liegen, wird der Client (soweit das routing und die Netzmasken richtig eingestellt sind) das korrekte Interface wählen um das Zielsystem zu erreichen. Grüße Klaus |
AW: TTCPClient LocalHost
Hallo,
Zitat:
Zitat:
Da habe ich dann aufgrund des Namen LocalHost etwas hinein interpretiert. Und ja, jetzt fällt mir auf, bei den Indys heisst es explizit BoundIP. Und genau darüber bin ich hier wohl gestolpert. Aber die Indy10 will ich mir nicht nochmal antun. Die Indy 9 Version war ja noch akzeptabel, aber mit Indy10 hat man sich da wohl etwas in eine Philosophie verrannt, die ich nicht mehr akzeptieren will. Zitat:
Danke für den Wink mit dem Gartenzaun. Ich war (weil mir von Indy bekannt), der Meinung das der TCPClient die angegebene IP Adresse auch wirklich verwendet, aber nun ist mir das klar. Gruß Question_mark |
AW: TTCPClient LocalHost
Zitat:
Schreib' deine Komponente doch so, dass sie eine TTCPClient-Komponente übergeben bekommt.
Delphi-Quellcode:
Du kannst dir an den Komponenten TQuery, TDataSource und TDBGrid ein Beispiel nehmen.
TBlackboxProtokoll = class(TComponent)
... published property TcpClient:TTCPClient read FTcpClient write SetTcpClient; end; Die Abhängigkeiten sehen so aus:
Code:
Mit dem Pfeil (->) wird eine Abhängigkeit dargestellt.
TDBGrid -> TDataSource -> TQuery
TDBGrid BENÖTIGT ein TDataSource, usw. Bei deiner Komponente ist es das Gleiche: TBlackboxProtokoll benötigt eine TTcpClient-Komponente für seine Arbeit. |
AW: TTCPClient LocalHost
Hallo,
Zitat:
FTCPClient := TTCPClient.Create(Self); Und zwar weil ich nicht alle Properties des TCPClients in meiner Komponente dem Anwender öffentlich machen will. Wenn ich den TCPClient in der von Dir vorgeschlagenen Weise implementiere, habe ich automatisch auch alle public properties in meiner Komponente mit veröffentlicht (sag ich jetzt mal aus dem Bauch heraus). Und wahrscheinlich auch alle Events. Und genau diese Events muss ich speziell behandeln, eben um diese BlackBox (Ok, es ist eine SPS) spezifische Protokoll wieder aus den TCP Nutzdaten zu extrahieren. Damit der Anwender im Endeffekt nur die Nutzdaten bekommt und sich nicht mit dem Protokoll auseinander setzen muss. Wie schon oben geschrieben, funktioniert das auch alles soweit. Eigentlich hat mir nur dieses Indy10 Monster missfallen, darum habe ich die aus dem Projekt rausgekegelt. Die Macher von Indy haben da beim Umstieg von Indy9 auf Indy10 Ihre Philosphie völlig geändert und sich da irgendwie verrannt. Bei Indy9 bekam ich bei einem Fehler einen Event gefeuert, den konnte ich nach meinem Belieben behandeln. Indy10 knallt selbst bei normalen Vorgängen Exceptions heraus, die nicht ohne Aufwand abzufangen sind (und nicht nur im Debugmodus). Bei Indy9 konnte ich im Event "OnError" selber entscheiden, wie ich darauf reagiere. Der Anwender meiner Komponente soll auf keinen Fall zur Laufzeit eine Fehlermeldung sehen. Wenn eine solche Meldung auftritt, möchte ich eben selber entscheiden, wie diese zu behandeln ist. Im Moment überlege ich noch, ob ich beim D2009 TTCPClient bleibe oder wieder auf Indy9 zurück gehe. Also Indy10 bleibt nach meinen bisherigen Erfahrungen aus dem Spiel, wenn ich solche Konstrukte hier sehe : TIdTCPClient.IdIOHandler.IdInterceptor.IdSocket.Id ..... krieg ich das Kotzen. Und die Hilfe zu Indy ist noch schlechter als die von Delphi, und die muss man erstmal unterbieten. Ok, das Beispiel war jetzt etwas übertrieben, aber nur etwas .... Aber danke für Deinen Hinweis, ich werde das auf jeden Fall morgen mal ausprobieren. Gruß Question_mark |
AW: TTCPClient LocalHost
Hallo,
Zitat:
Das war wohl nichts, denn Indy9 ist wohl für Delphi >= 2009 wegen Unicode nicht das geeignete Werkzeug. Das man bei der Installation von D2009 zwischen Indy9 und Indy10 wählen konnte, war wohl ein kleiner Betriebsunfall bei Embarcadingsbums. Was habe ich bisher erkannt : 1) Indy9 nicht für D2009 geeignet wegen Unicode (unter D2006 war Indy9 eine gute Wahl). 2) Indy10 für mein Vorhaben nicht geeignet, alles oversized, bulky und junk. 3) TTCPClient aus D2009 verbindet sich über den NIC, den er möchte. Dann habe ich heute mal die ICS (Version 7.54) von Francois Piette installiert und einen ganzen Tag die darin enthaltene Komponente WSocket getestet. Leider reagiert WSocket nicht auf vom Server gesendete "Keep Alive" Telegramme. Die werden vom ICS WSocket ignoriert. Die Folge ist natürlich, das der Server nach 10 Versuchen mit einem lockeren "RST" die Verbindung mit der Axt kappt... Ich kann zwar in WSocket eigene "Keep Alive" erzeugen, die werden vom Server auch korrekt beantwortet. Allerdings besteht der Server natürlich zu Recht auf ein "ACK" bei einem vom Server gefeuerten "Keep Alive". Hier verhält sich WSocket nicht konform zu den RFCs. Vielleicht habe ich aber auch nur einige Properties übersehen, um das richtige Verhalten zu erzielen. Wenn ja, dann bitte ich Euch um entsprechende Infos. Google habe ich zu dem Thema ausreichend bemüht und auch die Homepage von Overbyte bietet da keine wertvolle Hilfe. Ansonsten bleibt da nur noch Synapse, habe ich dann als nächstes auf der "To do" Liste. Gruß Question_mark |
AW: TTCPClient LocalHost
Hallo,
ich stehe auch gerade vor einem ähnlichen Problem. Ich habe als Pfad für den localhost C:\Program Files\httpd\ mit den beiden Unterordnern htdocs und isapi. in htdocs liegt meine Datei index.html. Diese aber wird nicht gefunden, egal, ob ich im TCPServer als Localhost die Konstante localhost oder meinen konkrten Pfad verwende. Was muss ich noch tun, damit der Pfad gefunden wird? Ich vwerwende vorerst noch nicht Indy, erst mal da reinarbeiten. Derzeit verwende ich TTCPserver von der Palettenseite "Internet" Im Browser ( Internet Explorer 8 ) erhalte ich die Meldung, das Intranet aktuell deaktiviert ist. Wie aber schalte ich das ein, falls das die Ursache ist, das meine Index.html nicht gefunden wird. Localhost muss schließlich erst mal klar sein. Ist vielleicht eher die Schreibweise des Pfades anders als gewöhnlich bei Dateien auf dem lokalen Rechner? Wer kann helfen? Ich habe vor Fragestellung unter localhost gesucht und dabei diesen Thread gefunden, deshalb frage ich auch hier. Habe die You Tube Anleitung mit dem Titel "Creating simplest Web Server using Delphi" angeschaut und meine Delphi Anwendung danach aufgebaut. |
AW: TTCPClient LocalHost
Ich würde dir raten ein eigenes Thema zu erstellen, da dein Problem scheinbar ein völlig anderes ist.
Mir ist nicht ganz klar was du da vor hast. Du wirfst einige Begriffe ziemlich durcheinander. Du hast einen TCP-Server, scheinbar auch einen HTTP-Server (httpd?) und den IE als Client? Was heißt das "als Localhost die Konstante localhost oder den Pfad"? Localhost ist immer eine Konstante für die IP 127.0.0.1. Ein Pfad ist sowas wie C:\Programme oder /home/valentin unter Unix. Und was du meinst, vermute ich mal, ist eine URL: ![]() Mein Tipp: eröffne einen eigenen Thread! :) Liebe Grüße, Valentin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz