AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy Disconnect/TimeWait-Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Indy Disconnect/TimeWait-Problem

Ein Thema von jmk1 · begonnen am 29. Aug 2007 · letzter Beitrag vom 1. Sep 2007
Antwort Antwort
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
jmk1

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

Re: Indy Disconnect/TimeWait-Problem

  Alt 1. Sep 2007, 18:57
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
  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 00:28 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