AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

UDP Datentransfer

Ein Thema von hanspeter · begonnen am 27. Jun 2011 · letzter Beitrag vom 28. Jun 2011
Antwort Antwort
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

UDP Datentransfer

  Alt 27. Jun 2011, 16:13
Hallo,
ich habe mir eine Client-Server Lösung mit den Indy - UDP Komponenten gebaut.

Der Client und Server haben die gleiche Portadresse. Die IP Adresse ist für jeden Rechner fest eingestellt.
Der Server antwortet auf eine Datenübertragung mit ACK (Im Fehlerfall NoACK)
Fällt die Verbindung aus, weil z.B. der Server gestoppt wurde, dann sendet der Client zyklisch
eine Anfrage an den Server, bis dieser mit ACK antwortet.

Ich habe jetzt den eigenartigen Effekt das manchmal nach einer Verbindungsunterbrechung der Server die Daten empfängt und korrekt mit ACK beantwortet.
Die Information kommt aber nicht beim Client an.
Der Effekt tritt nur zeitweise auf. Ein Wechsel der Portadresse bringt nichts.
Hat wer eine Idee, woran das liegen kann ?

Der Client ist als Thread angelegt.

Delphi-Quellcode:
procedure TUPDClient.Execute;
var
    LCS: TCriticalSection;
begin
   NameThreadForDebugging('UDPTransfer');
   FClient.Active := true;
   //FClient.ReceiveTimeout := FTimeout;
   LCS := TCriticalSection.Create;

   while not (Terminated) do
   begin
     LRead := '';
     ReceiveString := '';
     if FClient.Active then
     begin
       LCS.Enter;
       try
         LRead := FClient.ReceiveString;
         ReceiveString := LRead;
       except
         ServerConnect := false;
       end;
       LCS.Leave;
     end;
     if (aState = udp_WaitServerRequest) and (TimerStart > 0) and (GetTickCount - TimerStart > Timeout) then
     begin
       aState := Err_UDPServerRequest;
       TimerStart := 0;
       runServerConnect := false;
       flagWaitServerRequest := false;
       Synchronize(ExecuteUDP);
       end;
     If Lread='then sleep(1)
     else
     begin
       TimerStart := 0;
       Synchronize(ExecuteUDP);
     end;
  end;
  LCS.Enter;
  if FClient.Active then
    FClient.Active := false;

  FClient.Free;
  LCS.Leave;
  LCS.Free;
end;
Hat wer eine Idee?

Gruß
Peter
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: UDP Datentransfer

  Alt 27. Jun 2011, 16:20
UDP hat doch gerade gegenüber TCP die Eigenschaft, dass nicht sichergestellt ist, ob die Daten auch ankommen:

Zitat von http://de.wikipedia.org/wiki/User_Datagram_Protocol:
UDP stellt einen verbindungslosen, nicht-zuverlässigen Übertragungsdienst bereit. Das bedeutet, es gibt keine Garantie, dass ein einmal gesendetes Paket auch ankommt, dass Pakete in der gleichen Reihenfolge ankommen, in der sie gesendet wurden, oder dass ein Paket nur einmal beim Empfänger eintrifft. Eine Anwendung, die UDP nutzt, muss daher gegenüber verlorengegangenen und unsortierten Paketen unempfindlich sein oder selbst entsprechende Korrekturmaßnahmen beinhalten.

Geändert von blackfin (27. Jun 2011 um 16:27 Uhr)
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

AW: UDP Datentransfer

  Alt 27. Jun 2011, 19:17
UDP hat doch gerade gegenüber TCP die Eigenschaft, dass nicht sichergestellt ist, ob die Daten auch ankommen:
Meine Frage war nicht was UDP ist, das wei0 ich selber genau und äh ich kann schon lesen und Wikepedia ist mir nicht völlig unbekannt.
Meine Frage ist, ob wer eine Idee hat, woran es liegen kann, dass alle gesendeten Pakete beim Client nicht mehr ankommen?

Peter
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: UDP Datentransfer

  Alt 27. Jun 2011, 19:50
goto #2
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: UDP Datentransfer

  Alt 27. Jun 2011, 20:16
Guten Abend,

sind die Rechner im einem LAN miteinander verbunden - oder liegt das "Internet dazwischen"?

Hast Du die Möglichkeit den Traffic mitzuschneiden (mit Wireshark ..)?

Liegt eventuell ein Fehler im Client vor?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#6

AW: UDP Datentransfer

  Alt 27. Jun 2011, 20:39
ReceiveString() ist soviel ich weiss blocking bzw. hat standardmäßig ein unendliches Timeout.
Nur eine vermutung (habe mit Indy-UDP noch nie gearbeitet): Kann es sein, dass bei einem Verbindungsabbruch während ReceiveString() ein Fehler auftritt ("connection reset" oder dergleichen) und noch Daten im Receive-Buffer hängen, so dass der Client nie weitergeht?

P.S.: Ich wollte mit meinem Beitrag nicht "klugscheissen" oder dir an den Karren pissen. Wenn dir das so vorkam, sorry, aber es hätte ja sein können, dass du nicht gewusst hast, dass bei UDP nicht unbedingt immer alle Daten ankommen...

Geändert von blackfin (27. Jun 2011 um 20:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:04 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