Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   idTCP in iOS (https://www.delphipraxis.net/189964-idtcp-ios.html)

XXcD 13. Aug 2016 22:30

idTCP in iOS
 
Hallo,

ich habe momentan ein Problem mit dem Empfangen von Daten in meinem Programm.
Das Programm funktioniert soweit, nur es werden nur bei jedem zweiten Sendevorgang Daten empfangen.
Serverseitig werden die Daten jedoch empfangen.

Das ganze läuft in einem AnonymousThread.

Hier mal mein aktueller Quellcode:

Delphi-Quellcode:
TThread.CreateAnonymousThread(procedure ()
  var
    I: Integer;
    c: Byte;
  begin
  while not Application.Terminated do
  begin
    if not IdTCPClient1.Socket.InputBufferIsEmpty then
    begin
      if IdTCPClient1.Connected then
      begin
       c:=IdTCPClient1.Socket.ReadByte;

       //mache was mit den Daten
      end;
    end
    else
    IdTCPClient1.Socket.CheckForDataOnSource(100);
  end;
  end).Start;
Es scheint so als würde der InputBuffer sich nur bei jedem zweiten Empfangen zu füllen.
Wenn ich zum Testen die Daten so abrufe, dann kommt immer alles an:

Delphi-Quellcode:
procedure TTabbedForm.Button1Click(Sender: TObject);
var
s: string;
begin
s:=IdTCPClient1.Socket.Readln();
Memo1.Lines.Add(s);
end;
Ich hoffe mir kann jemand bei dem Problem helfen.

Mit freundlichen Grüßen

XXcD

mjustin 14. Aug 2016 10:01

AW: idTCP in iOS
 
Indy blockiert bei ReadXXX bis Daten vorhanden sind. Die Prüfung auf Connected ist nicht notwendig.

Indy wird eine Exception auslösen, wenn das ReadByte wegen eines Timeouts oder einer fehlenden Verbindung scheitert.

Delphi-Quellcode:
TThread.CreateAnonymousThread(procedure ()
  var
    C: Byte;
  begin
  while not Application.Terminated do
  begin
    try
      C := IdTCPClient1.Socket.ReadByte;  
      // mache was mit den Daten
    except
      on E: Exception do
      begin
        // behandle Timeout, z.B. durch Neuaufbau der Verbindung
      end;
    end
    else
  end;
  end).Start;

XXcD 14. Aug 2016 10:48

AW: idTCP in iOS
 
Danke für deine Antwort, ich habe das gerade so geändert wie du geschrieben hast.
Leider verändert sich nichts an meinem Problem, kann es sein, dass die Daten zu klein sind, sodass der Buffer sich füllt?
Ich erwarte immerhin nur 13 Bytes pro Paket.

mjustin 14. Aug 2016 11:53

AW: idTCP in iOS
 
Zitat:

Zitat von XXcD (Beitrag 1344859)
Danke für deine Antwort, ich habe das gerade so geändert wie du geschrieben hast.
Leider verändert sich nichts an meinem Problem, kann es sein, dass die Daten zu klein sind, sodass der Buffer sich füllt?
Ich erwarte immerhin nur 13 Bytes pro Paket.

Für Pakete bekannter Länge bietet TIdTCPClient auch eine Methode, mit der ein Byte Array fester Länge eingelesen wird

procedure ReadBytes(var VBuffer: TIdBytes; AByteCount: Integer; AAppend: Boolean = True);

d.h.:

IdTCPClient1.Socket.ReadBytes(MyBytesArray, 13, False);

XXcD 15. Aug 2016 11:39

AW: idTCP in iOS
 
Die Pakete haben leider eine unbekannte Länge.

Ich konnte das Problem aber lösen. Es lag am Client der die CRC Summe die ich empfange falsch berechnet hat.
Vielen Dank für die Bemühungen.

Mich würde nur noch interessieren warum der Anonymous Thread nicht läuft wenn ich das Programm für Windows compiliere.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15: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