Hallo liebe Forengemeinde,
ich habe eine Frage zu einer TCPIP Verbindung und dem
TClientSocket Element. Ich nutze den C++ Builder 10 Seattle.
Bei meinem Projekt wird aus der Desktop Anwendung mit einer externen Steuerung über TCPIP kommuniziert. Die Steuerung ist bereits fertig und als TCPIP Server ausgelegt. An ihr muss mindestens einmal beim Erststart von Desktop Anwendung und Steuerung beim Kunden die
IP-Adresse entsprechend dem Adressraum des Kundenrechners eingestellt werden. Ich spreche von den ersten 3 Bestandteilen der IP4 Adresse.
Das ganze ist natürlich nur nötig, wenn im Netzwerk kein DHCP Server vorhanden ist oder die Steuerung zum Beispiel direkt an den Ethernetport des Rechners angesteckt wird.
In meiner Software kann ich über GetAdaptersInfo die
IP-Adressen und Adressräume der vorhandenen Adapter auslesen. Allerdings habe ich an meinem Standardrechner zum Beispiel einen LAN-Adapter, einen WLAN Adapter und noch weitere virtuelle Adapter, die teilweise alle andere
IP-Adressräume besitzen. Somit bin ich davon ausgegangen dass auch der Kunde mehrere Adapter besitzen kann und dies entsprechend beachtet werden muss.
Da ich über Code nicht feststellen konnte welches der primäre Adapter ist oder an welchem Adapter meine Steuerung hängt, dachte ich dass der Kunde aus einer Liste den zu verwendenden Adapter auswählen kann. Es wäre ja theoretisch möglich, dass der Rechner an zwei Netzwerken hängt, das eine für Intra-/Internet und das andere nur für die Steuerung. Dann muss natürlich festgelegt werden welcher Netzwerkadapter verwendet werden soll.
Nach mehreren Tests habe ich dann festgestellt, dass beim Start der Verbindung und ersten Senden von Nachrichten immer der LAN-Adapter genutzt wird. Ich suche nun eine Möglichkeit beim TCLientSocket den Ausgangspunkt am Anwendungsrechner auf den vom Bediener ausgewählten Netzwerkadapter einzustellen. TClientSocket bietet hierfür scheinbar keine Möglichkeit. Das Objekt TClientSocket besitzt aber auch einen Socket der Klasse TClientWinSocket und diese wiederum erbt von
TCustomWinSocket. TCustomWinSocket besitzt die Eigenschaften
LocalAddress welche für mein Anliegen zu beschreiben wäre. Leider ist diese Eigenschaft nur lesend aufrufbar und ist auch nur mit der
IP des LAN-Adapters belegt nachdem TClientSocket.Open() aufgerufen wurde.
Meine Fragen sind daher wie folgt:
1. Wie kann ich festlegen welchen Netzwerkadapter der TClientSocket nutzen soll?
2. Nach welcher Regel wird der verwendete Adapter standardmäßig ausgewählt? Bei mir ist es meist der LAN-Adapter, manchmal aber auch der WLAN-Adapter.
3. Ist der TClientSocket hier die richtige Komponenten und noch Stand der Dinge? Ich habe mich auch etwas in die
Indy Dokumentation eingelesen und festgestellt, dass es hier die Eigenschaft BoundIP gibt, die genau das geforderte erledigt. Ich wollte aber eher die vorhandenen Komponenten vom C++ Builder nutzen statt externer. Auch funktioniert meine Anwendung bereits ohne Probleme wenn ich entsprechend alle
IP-Adressen händisch einstelle.
Ich bedanke mich schon mal vorab für eure Rückmeldung.
Grüße
CppN