AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TcpClient - Antwort XML unvollständig.

TcpClient - Antwort XML unvollständig.

Ein Thema von Garfield · begonnen am 14. Jan 2011 · letzter Beitrag vom 16. Jan 2011
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#11

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 00:40
.. hatte mir das in etwa so vorgestellt:
Mit zwei kleinen Einfügungen geht es. Allerdings fehlt wieder die letzte Zeile mit den zwei schließenden Tags. Nach einer Weile gibt es eine Meldung "Connection Closed Gracefully.". Wenn man einen Fehler in das Script einbaut, bekommt man einen Fehler mit der gesamten Meldung:
Code:
HTTP/1.1 500 Internal Server Error
DATE: Sat, 15 Jan 2011 23:17:24 GMT
SERVER: FRITZ!Box Fon WLAN 7320 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.88
CONNECTION: keep-alive
CONTENT-LENGTH: 434
CONTENT-TYPE: text/xml; charset="utf-8"

<?xml version="1.0"?>
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
<errorCode>401</errorCode>
<errorDescription>invalid action</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
Das Ding heißt leider nur IdHTTP (nicht -Client).
Bei der Suche musste ich feststellen, das IdHTTP fast immer als IdHTTPClient bezeichnet wird. Das Problem ist dabei, dass eine URL benötigt wird, welche ich nicht habe bzw nicht zusammenbekomme. Es gibt einen Host, einen Port und eine ControlURL.
Angehängte Dateien
Dateityp: 7z Project.7z (225,2 KB, 2x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#12

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 01:24
Auf der Suche nach der Fehlermeldung fand ich diese Lösung: Die gesendete und empfangene Nachricht enden mit dem selben schließenden Tag. Deshalb funktioniert dies:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  TcpClient : TIdTcpClient;
begin
  Memo1.Clear;

  TcpClient := TIdTcpClient.Create(nil);
  TcpClient.Host := 'fritz.box';
  TcpClient.Port := 49000;
  try
    TcpClient.Connect;
    if TcpClient.Connected
    then begin
      if TcpClient.IOHandler.Connected
      then begin
        TcpClient.IOHandler.Write(Memo3.Text);

        Memo1.Text := TcpClient.IOHandler.WaitFor(Memo3.Lines.Strings[Memo3.Lines.Count - 1]);
        Memo1.Lines.Add(Memo3.Lines.Strings[Memo3.Lines.Count - 1]);
      end;
    end;
  finally
    TcpClient.Disconnect;
    TcpClient.Destroy;
  end;
end;
Code:
HTTP/1.1 200 OK
DATE: Sun, 16 Jan 2011 00:20:28 GMT
SERVER: FRITZ!Box Fon WLAN 7320 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.88
CONNECTION: keep-alive
CONTENT-LENGTH: 430
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewConnectionStatus>Connected</NewConnectionStatus>
<NewLastConnectionError>ERROR_NONE</NewLastConnectionError>
<NewUptime>80745</NewUptime>
</u:GetStatusInfoResponse>
</s:Body>
</s:Envelope>
Das einzige, was etwas stört, sind die "falschen" Zeilenschaltungen im XML.

Anscheinend ist es ein Fehler in der verwendeten Indy-Version.
Angehängte Dateien
Dateityp: 7z Project.7z (195,2 KB, 9x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#13

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 12:02
Der Fehler scheint in meiner Fritzbox zu stecken. Bei der Antwort fehlt in der letzten Zeile das LF (#10). Deshalb wartet Indy auf weitere Daten bis die Verbindung geschlossen wird.
___

Nachtrag:

Oben hatte ich die Indy 10-Version welche bei TurboDelphi dabei war verwendet. Bei der aktuellen Indy 10 wird beim WaitFor der angegebene Text mit zurück gegeben.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof

Geändert von Garfield (16. Jan 2011 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 12:12
Bei einer vernünftigen Kommunikation sollte am Anfang die Länge der übertragenen Nachricht übermittelt werden, dann ist das Ende Zeichen sowas von überflüssig.

Schau dir die Nachricht mal als Hex an, ob da am Anfang nicht diese Information mitkommt.
Im Header steht aber auch eine Information zum Anzahl der Zeichen.

Versuche ansonsten diese auszuwerten
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#15

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 13:53
Indy reserviert für die Antwort 32 kB. Nach der Ermittlung der Antwortlänge wird die Antwort in einem entsprechend großen Buffer geschrieben. Im Beispiel sind es 663 Byte.

ReadLn ruft ReadLn(LF) auf und die function TIdBuffer.IndexOf(const AString: string; AStartPos: Integer): Integer; ermittelt die Position des nächsten LF. Beim letzten String wird die Funktion einfach beendet und anstelle der Länge des letzten Strings -1 zurückgegeben.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#16

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 14:20
Delphi-Quellcode:
function TIdBuffer.IndexOf(const ABytes: TIdBytes; AStartPos: Integer): Integer;
var
  i, j, LEnd, BytesLen: Integer;
  LFound: Boolean;
begin
  Result := -1;
  // Dont search if it empty
  if Size > 0 then begin
    EIdException.IfTrue(Length(ABytes) = 0, RSBufferMissingTerminator);
    EIdException.IfNotInRange(AStartPos, 0, Size - 1, RSBufferInvalidStartPos);
    BytesLen := Length(ABytes);
    LEnd := FHeadIndex + Size;
    for i := FHeadIndex + AStartPos to LEnd - BytesLen do begin
      LFound := True;
      for j := 0 to BytesLen - 1 do begin
        if i + j < LEnd then begin
          if FBytes[i + j] <> ABytes[j] then begin
            LFound := False;
            Break;
          end;
        end
        else
          Break;
      end;
      if LFound then begin
        Result := i - FHeadIndex;
        if Result <> -1 then
          Break;
      end;
    end;
  end;
end;
Geändert in
Delphi-Quellcode:
function TIdBuffer.IndexOf(const ABytes: TIdBytes; AStartPos: Integer): Integer;
var
  i, j, LEnd, BytesLen: Integer;
  LFound: Boolean;
begin
  Result := -1;
  // Dont search if it empty
  if Size > 0 then begin
    EIdException.IfTrue(Length(ABytes) = 0, RSBufferMissingTerminator);
    EIdException.IfNotInRange(AStartPos, 0, Size - 1, RSBufferInvalidStartPos);
    BytesLen := Length(ABytes);
    LEnd := FHeadIndex + Size;
    for i := FHeadIndex + AStartPos to LEnd - BytesLen do begin
      LFound := True;
      for j := 0 to BytesLen - 1 do begin
        {
        *  Beim letzten Zeichen des Buffer ist auf jeden Schluss.
        }

        if i + j < LEnd - 1 then begin
          if FBytes[i + j] <> ABytes[j] then begin
            LFound := False;
            Break;
          end;
        end
        else
          Break;
      end;
      if LFound then begin
        Result := i - FHeadIndex;
        if Result <> -1 then
          Break;
      end;
    end;
  end;
end;
und es funktioniert.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.334 Beiträge
 
Delphi XE5 Professional
 
#17

AW: TcpClient - Antwort XML unvollständig.

  Alt 16. Jan 2011, 21:34
und es funktioniert.
Doch nicht ganz. Das letzte Zeichen fehlt.

Da muss dann noch die function TIdIOHandler.ReadLn(ATerminator: string; ATimeout: Integer = IdTimeoutDefault; AMaxLineLength: Integer = -1): string; ein wenig angepasst werden.
Delphi-Quellcode:
  // Extract actual data
  Result := FInputBuffer.Extract(LTermPos + Length(ATerminator));
  if (ATerminator = LF) and (LTermPos > 0) then begin
    {
    *  Wenn beim letzten String das LF fehlt, würde das letzte Zeichen abgeschnitten.
    }

    if (Result[LTermPos + 1] <> CR) and (Result[LTermPos + 1] <> LF)
    then inc(LTermPos);

    if Result[LTermPos] = CR then begin
      Dec(LTermPos);
    end;
  end;
  SetLength(Result, LTermPos);
end;
Wobei ich mich frage, ob man da ein
Delphi-Quellcode:
  // Extract actual data
  Result := FInputBuffer.Extract(LTermPos + Length(ATerminator));
  Result := TrimRight(Result);
end;
nicht ausreichend wäre.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  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 06:11 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