AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...
Thema durchsuchen
Ansicht
Themen-Optionen

Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

Ein Thema von idontknow · begonnen am 13. Aug 2020 · letzter Beitrag vom 14. Aug 2020
Antwort Antwort
Seite 1 von 2  1 2      
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#1

Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 14:29
Hallo Community,

ich versuche seit letzter Woche einen TsslWSocket und einen TsslWSocketServer miteinander kommunizieren zu lassen.

Ziel ist eine langzeitstabile Verbindung zwischen einem TCP-Client und einem TCP-Server, die mit TLS1.3 abgesichert ist. Nach einigen Minuten Laufzeit bricht die Datenübertragung jedoch ab.

Es gibt einen ClientThread und einen ServerThread. In der jeweiligen Execute-Methode erzeuge ich den Socket und initialisiere ihn, rufe Listen (Server) bzw. Connect (Client) auf und lasse den Thread
dann die MessageLoop ausführen.

Nach erfolgreichem SSL-Handshake sendet mein Client 128KB große Datenpakete an den Server. Dort kommen sie auch an, TwSocketClient.onDataAvailable wird getriggert, die Bytes lassen sich dort mit TwSocketClient(Sender).Receive(pBuffer...) einlesen.

Wenn der Server 128KB empfangen hat, sende er ein ein "ACK"-Paket an den Client (Den AnsiString "ACK", 3 Bytes). Wenn der Client ein Paket empfängt, sendet dieser erneut 128KB Daten.

Dieses Spiel klappt einige tausend, manchmal auch einige zehntausend Male, bis dann TwSocketClient.onDataAvailable plötzlich nicht mehr aufgerufen wird. Es gibt kein OnSessionClosed, kein onError, kein onException und auch kein onBgException, daß auf ein Problem hindeuten würde.

Offenbar ist das Problem auf Client-Seite: Ein mitlaufendes Wireshark zeigt als letztes ein [ACK]-Paket vom Server zum Client. Weitere Clicks auf den "Manual Send"-Button führen zu keinen weiteren Zeilen im Wireshark Log.

Wenn dieser Zustand erreicht ist (eben nach etwa 4900 Paketen, beim Versuch zuvor nach etwa 590 Paketen) kann sich ein anderer Client problemlos mit dem Server verbinden.

Ich will nicht ausschliessen, daß der Fehler bei mir liegt, bzw. nehme das sogar an, ich habe aber überhaupt keine Idee, was ich falsch machen könnte...
Ist es vielleicht nicht ok, aus einem anderen Thread zu senden? Aber wie soll das sonst gehen, wenn der ClientThread nur noch die MessageLoop ausführt und somit selbst nicht senden kann?

Gleichzeitiges Web-Browsen führt schneller zum Problem. Wenn ich mir irgendwelche Webseiten anschaue dauert es meist keine halbe Minute bis zum Problem.

Anhängend ist mein Testprojekt. Mich würde mal interessieren, ob ihr dasselbe Problem beobachtet und ob jemand eine Vermutung hat, woran es liegen könnte...

Das Projekt ist vollständig, im Win32-Ordner ist auch das zum Testen verwendete Zertifikat enthalten...

Benutzung: Eigene IP-Adresse eingeben, auf den Button "btCreateStart" drücken, dann auf den Button "btSendData Manual Send". Im Programmverzeichnis wächst nun die Datei "logICStest.log" an, bis das Problem auftritt...

Schon mal vielen Dank im voraus...

P.S: Habe auch schon versucht, nicht nach dem Empfang des ACK-Pakets zu senden, sondern zyklisch per Timer oder Thread. Kann man beides im Testprojekt mit Checkboxen wählen, das Resultat ist das gleiche.

Das Problem tritt nicht nur bei TLS1.3 auf, auch mit TLS1.2. Ich glaube sogar, es taucht auch ohne Verschlüsselung auf, dauert nur länger...


Die verwendeten Versionen:
Delphi 10.4 Update 3, ICS 8.64, OpenSSL 1.1.1g
Angehängte Dateien
Dateityp: 7z Test Overbyte ISC Client und Server.7z (1,08 MB, 9x aufgerufen)
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.797 Beiträge
 
Delphi 12 Athens
 
#2

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 14:38
Nach meinem Verständnis von TCP/IP ist es nicht dafür gedacht eine echte dauerhafte Verbindung herzustellen, sondern nur nach Bedarf. Wenn ein Client etwas einem Server mitteilen möchte, oder von einem Server Neuigkeiten erfahren will, muss er sich verbinden, die Daten senden/empfangen und die Verbindung beenden. Dies kann der Client einmal pro Tag/stunde/Minute/Sekunde machen. Wie der Anwender oder Entwickler es eben möchte. Aber eine Dauerhafte Verbindung ist nicht im Sinne der Datensparsamkeit und darum mMn nicht vorgesehen.

Bedenke bitte auch, daß der Client zwar eine riesige Zahl an Absenderports zur Verfügung hat, der Server aber nur einen. So lange ein Client mit einem Server verbunden ist, ist dieser Port belegt.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 14:59
Hallo Sherlock,

Ich möchte einige wenige (1..20) Clients mit einem Server (im lokalen Netz) verbinden, der Server liefert Echtzeitdaten die die Clients visualisieren sollen.

Hierzu sollen sich die Clients beim Server anmelden und die Verbindung halten. Klar kann es sein, das eine TCP-Verbindung mal abbricht, aber im lokalen Netz doch wohl eher selten.
In der realen Anwendung soll der Server von sich aus Daten über die bestehende Verbindung an die Clients schicken, der Client pollt also nicht.

Ich vermute, daß ich die ICS-Komponenten entweder nicht richtig benutze (wahrscheinlich) oder das es da einen Fehler gibt (eher unwahrscheinlich).

Aber gehen muss das... Allein schon deshalb, weil der SSL-Handshake eine Ewigkeit dauert...

Gruß,

Oliver
Oliver
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.065 Beiträge
 
Delphi 12 Athens
 
#4

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 15:00
KeepAlive ?
  Mit Zitat antworten Zitat
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 15:29
Hi Rollo,

Danke für die Antwort. "keepalive" wäre wohl das Stichwort, wenn die Verbindung disconnecten würde, weil über einen längeren Zeitraum keine Daten übertragen werden. Das ist aber nicht mein Problem.

Der Client sendet irgendwann nicht mehr wenn

ClientSocket.Send(TWSocketData(@Text[1]), Length(Text));

aufgerufen wird. Text ist ein 128KB langer AnsiString mit "ABCDEFG...XYZABCDEFG...".

Es gibt zuvor kein OnDisconnect o.ä.

Gruß,

Oliver
Oliver
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.935 Beiträge
 
Delphi 12 Athens
 
#6

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 15:38
Hallo Sherlock,

meine Anwendung macht aber genau sowas im lokalen Netz, auch mit ICS.
=> TCP/IP ist schon für dauerhafte Verbindungen gedacht!

Dem Fragesteller sei noch der Tipp gegeben, dass es in der en.delphipraxis.net
ein ICS spezifisches Unterforum gibt. Vielleicht mal dort fragen, da lesen
sicher ICS Entwickler mit.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 15:40
Ach so, ganz vergessen:

Mein Test-Programm startet Client und Server auf demselben Rechner, Netzwerkkomponenten scheiden somit als Grund aus.

Hätte ich vielleicht erwähnen sollen...

@TurboMagic: Danke für die Info. Hab's gerade schon crossgepostet, mal sehen was da kommt...
Oliver
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#8

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 13. Aug 2020, 15:50
Hallo!

Wenn es auch etwas anderes sein kann, nimm mORMot. Wenn du nicht den Server pollen willst, nimm WebSockets. mORMot musst du nicht installieren, sondern nur die Bibliothekspfad in Delphi 7 - 10.4 setzen.

Folgende Links sind hilfreich: Hilfe, Sourcecode, Forum

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
759 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 14. Aug 2020, 07:15
Bei mir läuft ICS 8.64 + Delphi 10.4 P1-3 in der freien Wildbahn auf ein paar hundert Kisten mit tausenden Verbindungen/Tag. Es sind keine Probleme bekannt.

[[ Dass tcp nur für kurzeitige Verbindungen genutzt werden sollte halte ich für ein Gerücht . Zu Windows 3.1 Zeiten wurden jeweils Verbindungen gekappt, über welche wenig oder keine Daten ausgetauscht wurden. Da du mit D10.4 rumspielst, ist Win3.1 als Zielsystem vom Tisch. ]]
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Stabile TCP-Verbindung mit ICS, ich kriegs nicht hin...

  Alt 14. Aug 2020, 08:28
Wir haben hier auch seit langer Laufzeit einen mini-messenger mit ICS verwirklicht am laufen ohne probleme, 365/7/24.
Was sich hin und wieder abschießt sind die Clients aber nie der Server.
Ob die Datenleitung qualmt oder Tagelang still seht, solange der Server mit "Listen" eingeschaltet ist, macht der sturr sein Ding.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz