AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TIdTCPClient: Keine Verzögerung beim senden der Daten
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPClient: Keine Verzögerung beim senden der Daten

Ein Thema von romber · begonnen am 6. Jul 2012 · letzter Beitrag vom 8. Jul 2012
Antwort Antwort
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

TIdTCPClient: Keine Verzögerung beim senden der Daten

  Alt 6. Jul 2012, 12:25
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!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#2

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

  Alt 6. Jul 2012, 12:45
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) ?
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#3

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

  Alt 6. Jul 2012, 13:31
welchen Wert hat die Property TIdIOHandlerSocket.UseNagle (entspricht TCP_NODELAY option) ?
UseNagle setze ich nach dem Connect auf False.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 6. Jul 2012, 13:40
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#5

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

  Alt 6. Jul 2012, 13:43
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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 6. Jul 2012, 14:23
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.
Michael Justin

Geändert von mjustin ( 6. Jul 2012 um 14:26 Uhr)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#7

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

  Alt 8. Jul 2012, 09:25
Ist Binding nil? Das würde die AV erklären.
Binding ist tatsächlich nil

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?
  Mit Zitat antworten Zitat
mjustin

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

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

  Alt 8. Jul 2012, 11:18
Ist Binding nil? Das würde die AV erklären.
Binding ist tatsächlich nil

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

Vielleicht hilft ein Update auf die neueste Indy 10.5.8 Version, auch wegen der erwähnten Access Violation
Michael Justin
  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:45 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