Einzelnen Beitrag anzeigen

jmk1

Registriert seit: 27. Aug 2004
2 Beiträge
 
Delphi 7 Enterprise
 
#1

Indy Disconnect/TimeWait-Problem

  Alt 29. Aug 2007, 18:19
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='POSTthen 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;
  Mit Zitat antworten Zitat