AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TClientSocket Daten gehen verloren
Thema durchsuchen
Ansicht
Themen-Optionen

TClientSocket Daten gehen verloren

Ein Thema von iphi · begonnen am 30. Sep 2017 · letzter Beitrag vom 1. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

TClientSocket Daten gehen verloren

  Alt 30. Sep 2017, 20:33
Hallo,

mein Server sendet eine größere Datenmenge, die der Clientsocket empfangen und auch gleich verarbeiten soll.

Die Datenübertragung geht im Prinzip auch.

Mein Problem:
Wenn ich im OnRead des ClientSocket mehr mache als nur die eingegangenen Daten abzuspeichern (z.B. dekodieren), dann gehen ganze Datenblöcke verloren.
Ich habe das Gefühl, wenn ein neues Datenpaket kommt, wenn der OnRead-Handler noch beschäftigt ist, geht dieses Paket verloren. Kann das sein? Was kann man dagegen machen?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TClientSocket Daten gehen verloren

  Alt 30. Sep 2017, 20:36
Möglicherweise durch asynchrone Verarbeitung in Threads.
Markus Kinzler
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#3

AW: TClientSocket Daten gehen verloren

  Alt 30. Sep 2017, 20:59
Gibt es keinen Mechanismus, der den Datenverlust verhindert?

Ich habs eben ausprobiert: Es gehen sogar Daten verloren, wenn ich nur abspeichere, wenn Windows gleichzeitig einen hochpriorisierten Task einschiebt, z.B. beim Öffnen eines neuen Fensters.

P.S.
Ich glaub ich habs. Der Server schickt nicht alle Daten, wenn der Client beschäftigt ist.

Lösung:
Entweder den Server auf Blocking stellen oder aktiv prüfen, ob der Server alles verschickt hat.

Geändert von iphi (30. Sep 2017 um 21:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TClientSocket Daten gehen verloren

  Alt 30. Sep 2017, 21:35
Ich wollte gerade antworten, dass Du mal mehr beschreiben musst.
Dein Nachsatz passt sicher.

Für die asynchrone Kommunikation habe ich hier mal ein paar Versuche dokumentiert:
http://www.delphipraxis.net/190482-s...ockettest.html
Das ist aber eher für viele kleinere gegenseitige Nachrichten ausgelegt.

Vielleicht wären die Indys (immer blocking) auch ein sinnvoller Ansatz für Dich.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#5

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 09:43
Danke für den Spielwiese-Link, sehr interessant.

Ich habe noch ein paar Ungereimtheiten:

Wenn ich den ServerType auf stThreadBlocking stelle, sendet der Server wie gesagt die vollständigen Datagramme an der Client. Soweit so gut. Ich sehe aber merkwürdige Nebenwirkungen:

1. Wenn sich der client mit dem Server verbindet, wird der OnClientConnect nicht mehr ausgelöst.
2. Dito bei Disconnect mit OnClientDisconnect.
3. Wenn der Client an den Server sendet, wird der Server.OnClientRead nicht mehr ausgelöst.

Habe ich da was nicht verstanden? Muss ich in dem Fall pollen?

Und noch was anderes:

Im Falle eines nichtblockierenden Servers:
Wenn ich im OnClientRead den socket.RemotePort abfrage, ist der anders als der socket.LocalPort.
Sollten die Ports nicht identisch sein, wenn Server und Client miteinander verbunden sind???
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 10:19
Deine Fragen kann ich leider nicht beantworten. Da stehe ich nicht genug im Thema. (Ich hatte mich nur soweit beschäftigt, dass mein Framework wie gewünscht funktioniert.)

Aber mal noch ein paar Fragen:
1) Arbeitest Du wirklich mit D6?
2) Was für Daten (wie große und wie häufig) werden übertragen und wie viele Clients gibt es?
3) Hast Du Dich schon mal mit den Indys beschäftigt?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#7

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 11:14
Zitat:
1) Arbeitest Du wirklich mit D6?
2) Was für Daten (wie große und wie häufig) werden übertragen und wie viele Clients gibt es?
3) Hast Du Dich schon mal mit den Indys beschäftigt?
1.
Inzwischen arbeite ich zumeist mit Delphi7, die Unterschiede sind aber marginal.
Ich hatte mir vor langer Zeit Delphi8 angeschafft und es praktisch umgehend wieder verworfen. Allein die Installation dauerte endlos, und produzierte Fehlermeldungen ohne Ende. Wenn ich jetzt Coss-Plattform brauche, dann nehme ich Lazarus. Ich finde aber nach wie vor die irre schnelle Compilierung bei D7 extrem angenehm, daher bin ich standardmäßig bei Delphi7.

2.
ASCII-Daten (Messdaten), 3 Server, 3 Clienten, aber nur 1 zu 1 Verbindungen, maximal 1 MegaByte pro Sekunde, aber nicht echtzeitkritisch.
Das ganze ist also sehr übersichtlich, geht mit den Sockets auch gut.

3.
Indy ja, was TCP/IP anbelangt aber nicht. Für mein einfaches Problem wollte ich schlanken Code mit Bordmitteln von Delphi6/7.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 12:17
Wenn ich im OnClientRead den socket.RemotePort abfrage, ist der anders als der socket.LocalPort.
Sollten die Ports nicht identisch sein, wenn Server und Client miteinander verbunden sind???
Das würde nur eine Verbindung je Portnummer erlauben. Nimm HTTP, das mit Port 80 arbeitet: wenn der Client immer ebenfalls Port 80 verwenden müsste, könnte ein Webbrowser immer nur zu einem einzigen Webserver eine Verbindung öffnen. Praktisch ist das nicht, da man ja auch mal mehrere Browserfenster gleichzeitig öffnen will. An welches Fenster/HTTP-Verbindung soll der Server seine Datenpakete addressieren, wenn alle die gleiche Portnummer verwenden? Darum muss jeder TCP-Client eine eindeutige eigene Portnummer pro Verbindung benutzen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#9

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 15:37
Äh, das verstehe ich nicht.

Ich habe im Beispiel genau einen Server und einen Client und die sollen miteinander Daten austauschen in beide Richtungen.
Das geht doch nur, wenn beide dieselbe Portnummer benutzen, oder ?!?

Solange die verbunden sind, must doch der lokale Port und der Remote Port gleich sein, oder?
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#10

AW: TClientSocket Daten gehen verloren

  Alt 1. Okt 2017, 18:56
Der lokale Port wird gemäß Standard vom Betriebssystem zufällig zwischen 49152 und 65535 vergeben. Zu beachten ist, dass sich nur Windows (ab XP SP2) daran hält, andere Betriebssysteme ignorieren den Standard. Ist ein NAT (Router) dazwischen ändert dieser abermals den Port.

Zurück zum Thema: Was spricht gegen Indy?
Janni
2005 PE, 2009 PA, XE2 PA
  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 04:01 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