Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TIdTCPClient: Keine Verzögerung beim senden der Daten (https://www.delphipraxis.net/169249-tidtcpclient-keine-verzoegerung-beim-senden-der-daten.html)

romber 6. Jul 2012 12:25

TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Hallo!

Ich verwende IdTCPClient zum senden von Daten and den Server. Ich habe bemerkt, dass kleinere Pakete manchmal mit Verzögerung ankommen. Ich denke, das liegt daran, das der Client kleinere Pakete nicht sofort versendet, sondern wartet, bis der Buffer voll ist. Kann ich das irgendwie vermeiden?

Danke!

mjustin 6. Jul 2012 12:45

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Hier sind einige Informationen dazu:

Indy Write Buffering / Efficient TCP communication

* "Write buffering is disabled by default. You can check write buffering to see if it's active in your code by testing the fConnection.IOHandler.WriteBufferingActive property"

* welchen Wert hat die Property TIdIOHandlerSocket.UseNagle (entspricht TCP_NODELAY option) ?

romber 6. Jul 2012 13:31

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von mjustin (Beitrag 1173797)
welchen Wert hat die Property TIdIOHandlerSocket.UseNagle (entspricht TCP_NODELAY option) ?

UseNagle setze ich nach dem Connect auf False.

mjustin 6. Jul 2012 13:40

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von romber (Beitrag 1173802)
Zitat:

Zitat von mjustin (Beitrag 1173797)
welchen Wert hat die Property TIdIOHandlerSocket.UseNagle (entspricht TCP_NODELAY option) ?

UseNagle setze ich nach dem Connect auf False.

Es muss vor dem Connect gesetzt werden - den Link zur Doku finde ich gerade nicht mehr, hatte das aber gerade gelesen.

romber 6. Jul 2012 13:43

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von mjustin (Beitrag 1173804)
Es muss vor dem Connect gesetzt werden - den Link zur Doku finde ich gerade nicht mehr, hatte das aber gerade gelesen.

Das dachte ich mir auch, aber dann erhalte ich eine Zugriffsverletzung, anscheinend weil es gar kein Socket noch existiert.

mjustin 6. Jul 2012 14:23

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von romber (Beitrag 1173805)
Das dachte ich mir auch, aber dann erhalte ich eine Zugriffsverletzung, anscheinend weil es gar kein Socket noch existiert.

Klasse :) Da hilft nur den Indy Quelltext nach der Nagle-Property zu durchsuchen und per Debugging die Ursache zu finden, oder eventuell eine neuere Version zu verwenden.


Delphi-Quellcode:
procedure TIdIOHandlerSocket.SetNagleOpt(AEnabled: Boolean);
const
  Options: array[Boolean] of Integer = (1, 0);
begin
  if Connected then begin
    Binding.SetSockOpt(Id_IPPROTO_TCP, Id_TCP_NODELAY, PChar(@Options[AEnabled]), SizeOf(Options[AEnabled]));
  end;
end;
Ist Binding nil? Das würde die AV erklären.

romber 8. Jul 2012 09:25

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von mjustin (Beitrag 1173812)
Ist Binding nil? Das würde die AV erklären.

Binding ist tatsächlich nil :oops:

Mit dieser Binding komme ich irgendwie nicht klar. Bis jetzt habe ich einfach den IdTCPClient erstellt und mit dem Server verbunden. Jetzt versuche ich seit Stunden vergeblich, eine Binding zu erstellen, um Socket-Optionen setzten zu können.

Wie erstelle ich eine Binding?

mjustin 8. Jul 2012 11:18

AW: TIdTCPClient: Keine Verzögerung beim senden der Daten
 
Zitat:

Zitat von romber (Beitrag 1173935)
Zitat:

Zitat von mjustin (Beitrag 1173812)
Ist Binding nil? Das würde die AV erklären.

Binding ist tatsächlich nil :oops:

Mit dieser Binding komme ich irgendwie nicht klar. Bis jetzt habe ich einfach den IdTCPClient erstellt und mit dem Server verbunden. Jetzt versuche ich seit Stunden vergeblich, eine Binding zu erstellen, um Socket-Optionen setzten zu können.

Wie erstelle ich eine Binding?

Sorry! Der Indy Code den ich im Internet gefunden hatte ist veraltet. SetNagleOpt in Indy 10.5.8 sieht so aus, und funktioniert nach dem Connect:

Delphi-Quellcode:
procedure TIdSocketHandle.SetNagleOpt(const AEnabled: Boolean);
begin
  { You only want to set a Nagle option for TCP.}
  if HandleAllocated and (SocketType = Id_SOCK_STREAM) then begin
    SetSockOpt(Id_SOCKETOPTIONLEVEL_TCP, Id_TCP_NODELAY, Integer(not AEnabled));
  end;
end;
Wegen Firewall-Problemen und einem WLAN Problem konnte ich mich leider nicht früher melden :oops:

Vielleicht hilft ein Update auf die neueste Indy 10.5.8 Version, auch wegen der erwähnten Access Violation


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