Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TTcpClient: keine Daten (https://www.delphipraxis.net/163680-ttcpclient-keine-daten.html)

messie 11. Okt 2011 11:44


TTcpClient: keine Daten
 
Moin,

ich habe ein WLan-Modem, was Daten feuert. Die möchte ich gerne empfangen.
Mit einem TcpClient.open kommt die Kommunikation zustande und das Modem sendet.

Ich bekomme aber keine OnReceive ausgelöst, wenn ich mit einem Timer die property BytesReceived abfrage, ist die immer 0.

Die Kommunikation endet nach etwa 10s, da ist dann wahrscheinlich irgendein Puffer voll.

Kann mir jemand einen Tipp geben, wo ich die übertragenen Daten finde?

Danke, Messie

Klaus01 11. Okt 2011 13:01

AW: TTcpClient: keine Daten
 
Zitat:

Zitat von messie (Beitrag 1129765)
Die Kommunikation endet nach etwa 10s, da ist dann wahrscheinlich irgendein Puffer voll.

Oder ein Timeout hat zugeschlagen.
Kannst Du den Traffic tracen (mit Wireshark)?
Kommt wirklich eine Verbindung zustande.

Grüße
Klaus

messie 11. Okt 2011 13:52

AW: TTcpClient: keine Daten
 
Zitat:

Zitat von Klaus01 (Beitrag 1129794)
Zitat:

Zitat von messie (Beitrag 1129765)
Die Kommunikation endet nach etwa 10s, da ist dann wahrscheinlich irgendein Puffer voll.

Oder ein Timeout hat zugeschlagen.
Kannst Du den Traffic tracen (mit Wireshark])?
Kommt wirklich eine Verbindung zustande.

Grüße
Klaus

Ja, die Daten kommen tatsächlich, sobald ich connect ausführe (mit Wireshark :roll:).
Ich habe jetzt auch mal einen Indy-Client probiert, das Verhalten ist identisch. Und nach dem Lesen vieler Posts sollte ich besser dazuschreiben, dass ich D2009 verwende.
Mit dem Indy-Client kann ich ConnectAndGetAll aufrufen, dann werden die Daten kontinuierlich geschickt, bis ich das Programm abschieße. Ich bekomme sie aber nicht zu fassen.

D.h., es würde wahrscheinlich reichen, den Puffer per Timer o.ä. zu pollen. Da habe ich aber noch keine Entsprechung zu ReceiveBuf beim Indy-Client gefunden.

Grüße, Messie

Klaus01 11. Okt 2011 15:03

AW: TTcpClient: keine Daten
 
Hallo,

die Daten kann man auch im onExecute auslesen.

Beispiel:
Delphi-Quellcode:
procedure TTcpListener.onExecute(AContext: TIdContext);
var
  clientIP : AnsiString;
  mStream : TMemoryStream;
begin
  clientIP := AContext.Binding.PeerIP;
  if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      mStream := TMemoryStream.Create;
      try
        AContext.Connection.IOHandler.InputBufferToStream(mStream);
        mStream.Position := 0;
        // transfer to FileManager
        fileManager.addData(clientIP,mStream);
        // decode data
        if onlineMode then
          decoderScheduler.add(clientIP,mStream);
      finally
        freeAndNil(mStream)
      end;
    end;
  sleep(50);
end;
Grüße
Klaus

messie 11. Okt 2011 15:22

AW: TTcpClient: keine Daten
 
Jetzt habe ich die Indy-Variante mal ausgebaut.
Delphi-Quellcode:
procedure TForm3.Timer1Timer(Sender: TObject);
var
  bytecount : integer;
  vBufferIn: TIdBytes;
begin
  bytecount := indyclient.IOHandler.InputBuffer.Size;
  indyclient.IOHandler.ReadBytes(vBufferIn, bytecount, false);
end;
InputBuffer.Size bleibt bei 0.
Interessanterweise sind die Daten da wenn ich den Client per disconnect trenne.

@ Klaus: wo gibt es denn den TTcpListener und wie wird das onexecute gefeuert?
Denn ich muss einen Datenstrom mit 20kb/s einlesen, was bei 32768k Buffergröße schon etwas häufiger stattfinden muss. Da bietet sich ein Timerevent ja an.

Danke, Messie

Klaus01 11. Okt 2011 16:21

AW: TTcpClient: keine Daten
 
.. entschuldige, da fehlte wohl etwas an Hintergrundinfos:
Delphi-Quellcode:
constructor TTcpListener.create(tcpPort: Word);
begin
  inherited create;
  listenerPort := tcpPort;
  logger := Tlogger.getInstance;
  onlineMode := false;
  // toDo: replace file path with ini file settings
  fileManager := TFileManager.create(ExtractFilePath(ParamStr(0)));
  decoderScheduler := TDecoderScheduler.create;
  tcpServer := TIdTcpServer.Create(nil);
  tcpServer.OnExecute := onExecute;
  tcpServer.OnConnect := onConnect;
  tcpServer.OnDisconnect := onDisconnect;
  tcpServer.Bindings.DefaultPort := listenerPort;
  tcpServer.Active := true;
  logger.push('TCP Server started, listening on port '+intToStr(tcpPort));
end;
TTCPListener.onExecute ist die onExecute Methode für den TidTcpServer.

Grüße
Klaus

messie 12. Okt 2011 09:55

AW: TTcpClient: keine Daten
 
Zitat:

Zitat von Klaus01 (Beitrag 1129853)
.. da fehlte wohl etwas an Hintergrundinfos:

vor allen Dingen bei mir :stupid:

Ich habe mal versucht, Deine Klasse zu verstehen, mir fehlt da aber noch viel. Von welchem Klassentyp leitest Du ab? Ist das ein Thread-Typ?

Danke, Messie

Klaus01 12. Okt 2011 10:34

AW: TTcpClient: keine Daten
 
Zitat:

Zitat von messie (Beitrag 1129970)
Ich habe mal versucht, Deine Klasse zu verstehen, mir fehlt da aber noch viel. Von welchem Klassentyp leitest Du ab? Ist das ein Thread-Typ?
Danke, Messie

TTcpListener ist von TObject abgeleitet.
Die Klasse enthält einen TidTCPServer.

Da ich das mit TurboDelphi programiert habe, muss ich die onExecute Methode
des TIdTcpServer zur Laufzeit zuweisen, deshalb habe ich die onExecute Ereignisbehandlingsroutine
im TTcpListener definiert.

Das OnExecute vom TidTcpServer wird immer dann ausgelöst, wenn Daten ankommen.

Grüße
Klaus

messie 12. Okt 2011 14:05

AW: TTcpClient: keine Daten
 
Hmmm,

läuft bei mir nicht. Der Server im WLan-Modem fängt nicht an zu senden.
Wahrscheinlich fehlt ein connect, was ich beim client ja auslösen kann.

Geht Server vs. Server überhaupt?

Danke, Messie

Klaus01 12. Okt 2011 14:45

AW: TTcpClient: keine Daten
 
Zitat:

Zitat von messie (Beitrag 1130017)

Geht Server vs. Server überhaupt?

irgendwer sollte sich schon zum Server verbinden.
Normalerweise:
Client verbindet sich zum Server.
Client schickt Daten zum Server.
Server macht etwas mit den Daten und schickt Rückmeldung.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.
Seite 1 von 2  1 2      

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