TCP Client sieht Server nicht



  • Hallo guten Morgen,
    ich habe ein Programm geschrieben, das mit TCP eine Verbindung zu einem TCP-Server aufbaut und im Fall einer Trennung versucht die Verbindung wieder herzustellen. Der TCP-Client wie auch der Server sind nicht direkt sondern über einen Switch miteinander verbunden.

    Solange der TCP-Server immer auf dem selben PC läuft funktiioniert das gut. Den Server gibt es aber in dem Netzwerk zwei mal mit der selben Software und der selben IP-Adresse. Immer nur ein Server in Betrieb.

    Durch eine Spannungsüberwachung kann der Fall eintrteten, dass ein Server ausgeschaltet wird und der zweite Server wird hochgefahren. Jetzt findet der TCP-Client den Server nicht mehr.

    TCP-Client-Socket öffne ich beim Start des Programmes einmal. Mit den Ereignissen OnConnect, OnConnecting und OnDisconnect überwache ich die Verbindung. Tritt ein OnDisconnect auf versuche ich nach einer Zeitverzögerung von 1 Sekunde die Verbindung wieder herzustellen in dem ich ClientSocket->Active auf tue setze.

    Was kann ich machen im Falle eines Serverwechsels um die Verbindung wieder herzustellen?

    Vielen Dank
    Evi48



  • So wie Du das hier schilderst sollte es eigentlich keine Probleme gebe. Das einzige was ich mir vorstellen könnte, ein Switch lernt normalerweise, welche IP über welchen Switchport erreicht werden kann. Fällt dieser Server aus, kriegt das der Switch nicht mit und versucht weiterhin die IP über den gelrnten Switchport zu erreichen. Versuch erstmal nach einem "Serverwechsel", ob die entsprechende IP per PING überhaupt noch erreicht wird.



  • Danke das das versuche ich mal

    Evi48



  • Hallo Peter,
    ich habe die Sache mit dem switch versucht doch der Fehler scheint in der Software zu liegen und ich habe nochmals die BCB-Hilfe bemüht und die Software geändert. In der Hilfe steht:
    "Mit Open wird die Socket-Verbindung initialisiert. Die Eigenschaft Active wird dabei auf true gesetzt. Bei Client-Sockets sucht Open nach einem Server und übernimmt den Verbindungsaufbau."

    Doch siehe da die Eigenschaft bleibt nach dem Aufruf von Open false und die Verbindung wird auch nicht aufgebaut.

    Weißt du oder ein BCB-Fan da Abhilfe.

    Danke
    Evi48



  • Hallo,
    die beiden nachstehenden Zeilen sollen die Verbindung wieder neu aufbauen.

    ClientSocket->Open();
    		ClientSocket->Active = true;
    

    Gehe ich mit Einzelschritt durch das Programm und halte auf der Zeile Active = true und bewege den Cursor auf Open wird die Meldung: "ClientSocket->Open = E2027 Eine Speuicheradresse muss verwendet werden" angezeigt. Hiermit kann ich leider nichts anfangen. Wer weiß was ich da falsch gemacht habe?

    Evi48



  • Ich hab jetzt nicht wirklich Erfahrung speziell mit TClientSocket, aber was mir auffällt, Du verwendest TClientSocket::Open und setzt anschließend TClientSocket::Active auch noch 🙄 Schau mal in die BCB-Hilfe zu TClientSocket::Active, vielleicht hilfts Dir ja weiter. Ansonsten mußte ich in der Vergangenheit bei einer Kompo (vergessen welche) feststellen, daß die auch nicht so reagierte wie erwartet, ähnlich wie hier mit Open/Close. Die einzige Lösung die damals wirklich zuverlässig funktionierte war, die Kompo bei Bedarf mit new erzeugen (hier Verbindungsaufbau) und am Ende wieder mit delete löschen (hier Verbindungsende).

    PS: was mir gerade noch einfällt, TOpenDialog hat auch Macken, muß man u.U. auch vor Gebrauch mit new erzeugen und nachher wieder deleten.



  • Hallo Peter,
    die Zeile Active = true ist nur ein Relikt aus der alten Version. Doch nachdem ich die Zeile mit Open eingefügt habe wird auch das Actve nicht auf true gesetzt.

    Mit dem new versuche ich mal.

    Danke
    Evi48



  • Peter schrieb:

    PS: was mir gerade noch einfällt, TOpenDialog hat auch Macken, muß man u.U. auch vor Gebrauch mit new erzeugen und nachher wieder deleten.

    Muß du das immer oder wie?
    Solche Probleme sind bis jetzt nirgends aufgefallen.
    Ich muß das nicht machen (erstellen und deleten), ich nutze einfach die Kompo.
    Du machst da bestimmt was falsch.. 😞



  • @DJBlackEagle
    Nein, ich muß das nicht immer machen. In der Regel genügt es, die Kompo auf die Form zu ziehen. In einem Fall mußte ich aber TOpenDialog::InitialDir zu Laufzeit auf andere Verzeichnisse setzen und genau das hat das Teil nicht gefressen.



  • Hallo Zusammen,

    und hier ist die Lösung:

    TClientSocket hat auch Eigenschaften, die nur zur Laufzeit gestzt werden können. Hierzu gehört "Address". Zur Entwicklungszeit steht nur die Eigenschaft "Host" zur Verfügung.

    Host sollte nur den Namen des gesuchten Rechners enthalten und nicht die IP-Adresse. Offensichtlich findet der Client auch dann den Rechner wenn hier die IP-Adresse eingetragen ist aber nur während des Programmstarts. Address enthält die IP-Adresse.

    Bei dieser Einstellung funktioniert auch das Open wie in der Hilfe beschrieben.

    Ob nun auch mein ursprüngliches Problem gelöst ist wird sich ende November herausstellen.

    Danke für die Hilfe

    Dieter



  • ***amkopfkratz*** sehr ominös, habs mir gerade in der Hilfe angeguckt. Nun ja, warten wirs ab 😉


Anmelden zum Antworten