Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy Disconnect/TimeWait-Problem (https://www.delphipraxis.net/98600-indy-disconnect-timewait-problem.html)

jmk1 29. Aug 2007 17:19


Indy Disconnect/TimeWait-Problem
 
Hallo.

Ich habe ein Problem mit den Indy 10 Internetkomponenten. Und zwar bekomme ich des öfteren nach der 2. POST-Message, also nach dem der Code ein 2. Mal durchlaufen wurde, einen Socket-Error 10048 (Adress already in use). Anschließend sehe ich im Tool TCPView, das die Verbindung zum Server nicht abgebaut wird. Sie ist stattdessen im Zustand "TIME_WAIT". Deswegen kommt bei jedem weiteren Verbindungsversuch ein weiterer Fehler 10048.
Füge ich nach dem Post-Befehl einen Disconnect ein, geht es nachvollziehbar gar nicht: Die 1. Post-Message wird fehlerfrei abgesetzt, die 2. liefert den Fehler 10048.
Manchmal, wenn ich das Programm abbreche, sehe ich die Verbindung in TCPView von meinem Programm zum System wandern.
Wie schaffe ich es die Verbindung richtig zu trennen? Und was soll dieses "TIME_WAIT" sein? Wer wartet da auf was?
Da das mein allererstes Internet-Programm ist, fehlt mir vielleicht nur eine Kleinigkeit?
Ich bin auch schon mit dem Debugger ein wenig durch den Indy-Quellcode. Hat mich aber auch nicht weitergebracht :-(

JMK


Eingesetzte Software: W2K(SP4), Delphi7, Indy10.
Das ganze soll irgendwann dazu dienen, den Datenaustausch zwischen einem NokiaCommunicator mit einer XML-Applikation und dem dazugehörigen Internetserver mitzuschneiden, um die Rückmeldungen in Form von XML-Dateien in einer Datenbank abzuspeichern und später auszudrucken.



Delphi-Quellcode:
procedure TformMain.serverCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

var url:string;
    responseStream,requestStream:TStringStream;
    wdh:integer;
begin
  if ARequestInfo.Command='' then exit;
  client.Request.Method:=ARequestInfo.Command;
  client.Request.Host:='mta.dbtelematik.de';
  client.Request.URL:=ARequestInfo.Document;
  if ARequestInfo.QueryParams<>'' then
    client.Request.URL:=client.Request.URL+'?'+ARequestInfo.QueryParams;
  client.Request.UserAgent:=ARequestInfo.UserAgent;
  client.Request.Accept:=ARequestInfo.Accept;
  client.Request.AcceptCharSet :=ARequestInfo.AcceptCharSet;
  client.Request.AcceptEncoding:=ARequestInfo.AcceptEncoding;
  client.Request.AcceptLanguage:=ARequestInfo.AcceptLanguage;
  client.Request.ContentType:=ARequestInfo.ContentType;
  client.Request.Connection:=ARequestInfo.Connection;
  url:='http://'+client.Request.Host+client.Request.URL;
  Log('Command: '+ARequestInfo.Command);
  Log('URL:'+url);
  Log('Params:'+ARequestInfo.UnparsedParams);
  requestStream:=TStringStream.Create('');
  requestStream.CopyFrom(ArequestInfo.PostStream,0);
  responseStream:=TStringStream.Create('');
  wdh:=5;
  repeat
    try
      if client.Request.Method='POST' then begin
       client.Post(url,requestStream,responseStream);
      end;
      wdh:=0;
      AResponseInfo.ResponseNo := client.ResponseCode;
     except
      on E: EIDSocketError do begin
         Log('EIDSocketError#'+IntToStr(e.LastError));
         client.Disconnect;
         Sleep(2000);
         dec(wdh);
         if wdh=0 then begin
           AResponseInfo.ResponseNo:=404;
           AResponseInfo.ResponseText:='SyncServer: Fehler bei Client-Connection';
         end;
       end;
    end;
  until wdh=0;
  Log('Response To Commi:'+IntToStr(AResponseInfo.ResponseNo)+' '+AResponseInfo.ResponseText);
  requestStream.Free;
  AResponseInfo.ContentLength:=client.Response.ContentLength;
  AResponseInfo.ServerSoftware:= client.Response.Server;
  AResponseInfo.Date:= client.Response.Date;
  AResponseInfo.LastModified:= client.Response.LastModified;
  AResponseInfo.ContentType:=client.Response.ContentType;
  AResponseInfo.ContentEncoding:=client.Response.ContentEncoding;
  AResponseInfo.ContentLanguage:=client.Response.ContentLanguage;
  AResponseInfo.ContentVersion:=client.Response.ContentVersion;
  AResponseInfo.ContentText:=responseStream.DataString;
  client.Response.ContentStream:=nil;
  responseStream.Free;
end;

jmk1 1. Sep 2007 17:57

Re: Indy Disconnect/TimeWait-Problem
 
Hallo.

Konnte das Problem durch verwenden einer anderen Portnummer bei jeder Verwendung des Client's umgehen.
Bin mir mittlerweile nicht mehr sicher ob dieser TIME_WAIT-Status ein Fehler ist, sondern "normales" Verhalten. Weiß da jemand mehr?

JMK


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz