AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

Ein Thema von moelski · begonnen am 20. Apr 2010 · letzter Beitrag vom 20. Apr 2010
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

  Alt 20. Apr 2010, 09:30
Moin !

Ich nutze den TIdHTTPWebBrokerBridge um einen Webservice bereit zu stellen. Funzt soweit auch. Was aber schon merkwürdig ist sind die Connections die TIdHTTPWebBrokerBridge offen hält.

Ich nutze dazu das proggy TCPView (Sysinternals) um das zu monitoren. Wenn sich nun ein Client mit dem Webservice unterhält, dann steht danach eine solche Verbindung im TCPView:
Code:
[System Process]:0   TCP   <RECHNER>:6060   <RECHNER>:1288   TIME_WAIT
Nach ca. 2 Minuten verschwindet die Connection dann.

Müsste die nicht im Normalfall sofort verschwinden? Der Client macht einen Connect zum TCP Server, kommuniziert und macht ein disconnect. Oder sehe ich da was falsch?

Auch mit NetStat -an kann man sich das ansehen:
Code:
TCP   <IP>:1297    <IP>:22222      WARTEND

Das blöde an der Sache ist nun, das - wenn der Webservice schnell abgefragt wird - eine Menge Connections rumdümpeln und auf ihr Timeout warten.

Hat jemand eine Idee?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

  Alt 20. Apr 2010, 12:20
Hallo moelski,

Zitat von moelski:
Was aber schon merkwürdig ist sind die Connections die TIdHTTPWebBrokerBridge offen hält.
Ich ändere das mal: die Connections die Windows offen hält.

TIME_WAIT und 2 Minuten sind das deutliche Indiz.

Zitat von moelski:
Müsste die nicht im Normalfall sofort verschwinden? [...] Oder sehe ich da was falsch?
1) Nein und 2) Ja.

Nach der Socket Freigabe wartet der TCP/IP Stack per Default 120 Sekunden für die Freigabe aus dem FD_WAIT State. Dieses Verhalten des Betriebssystems soll u.a. einer sauberen Beendigung der Kommunikation dienen.

Zitat von moelski:
Das blöde an der Sache ist nun, das - wenn der Webservice schnell abgefragt wird - eine Menge Connections rumdümpeln und auf ihr Timeout warten.

Hat jemand eine Idee?
Ja, das ist richtig. Deswegen kann man dieses Verhalten über die Registry (insb. bei Servern) steuern. Grundlagen hier: http://msdn.microsoft.com/en-us/library/ms819739.aspx und guter Suchbegriff ist "TcpTimedWaitDelay".

Schau auch mal, ob bei der WebBrokerBridge sowas wie ReuseSocket als Property verfügbar ist (ich weiß das jetzt nicht aus dem Kopf).

Wenn Du am Zielrechner das Verhalten änderst, mußt Du aber mit den freien Ports aufpassen. Gerade bei W2k3 oder W2k8 sind dort iirc nur Ports 1000 bis 5000 für ausgehende Kommunikation frei, da kommt man schnell als Limit.

hth,

Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

  Alt 20. Apr 2010, 12:44
Moin !

Danke für die Infos.

Zitat:
ReuseSocket
Das habe ich schon mal getestet:
FWebBrokerBridge.ReuseSocket := rsTrue; Hatte aber leider keinen Einfluss. Wobei ich nur rsTrue getestet habe.
Generell wäre ja folgendes möglich:
TIdReuseSocket = (rsOSDependent, rsTrue, rsFalse);
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: TIdHTTPWebBrokerBridge und die Connections (TIME_WAIT)

  Alt 20. Apr 2010, 12:49
Moin

Zitat von moelski:
Moin !

Danke für die Infos.
Klar, gerne.

Zitat von moelski:
Zitat:
ReuseSocket
Das habe ich schon mal getestet:
FWebBrokerBridge.ReuseSocket := rsTrue; Hatte aber leider keinen Einfluss. Wobei ich nur rsTrue getestet habe.
Generell wäre ja folgendes möglich:
TIdReuseSocket = (rsOSDependent, rsTrue, rsFalse);
Ja, das hatte ich mir schon gedacht. Für das System sind es unterschiedliche Verbindungen (selbst bei gleicher IP sind es andere Destination Ports), da kann das leider nicht helfen. Also bleibt nur der Umweg über das OS Timeout.

Gruß,
Assertor
Frederik
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:52 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