![]() |
Komischer Fehler mit TClientSocket
Hallo,
Ich versuche gerade mit der TClientSocket Komponente eine simple HTTP Anfrage zu senden.
Delphi-Quellcode:
wieso bekomme ich hier als Antwort irgendwelche komischen Zeichen :?:
procedure TForm1.Button1Click(Sender: TObject);
begin sock.host:='google.de'; sock.port:=80; sock.ClientType:=ctnonblocking; sock.Open; //sock.active:=true; end; procedure TForm1.sockConnect(Sender: TObject; Socket: TCustomWinSocket); begin Socket.SendText('GET / HTTP/1.0' + #13#10#13#10) end; procedure TForm1.sockRead(Sender: TObject; Socket: TCustomWinSocket); begin memo1.text:=socket.ReceiveText; end; Zitat:
|
Re: Komischer Fehler mit TClientSocket
Bei mir sieht die Antwort folgendermaßen aus...
Code:
HTTP/1.0 302 Found
Location: [url]http://www.google.de/[/url] Cache-Control: private Content-Type: text/html; charset=UTF-8 Set-Cookie: PREF=ID=6d1b1a59c632379b:TM=1221754085:LM=1221754085:S=0PZRuli-F07YMqPR; expires=Sat, 18-Sep-2010 16:08:05 GMT; path=/; domain=.google.com Date: Thu, 18 Sep 2008 16:08:05 GMT Server: gws Content-Length: 218 Connection: Keep-Alive <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved [url="http://www.google.de/"]here[/url]. </BODY></HTML> |
Re: Komischer Fehler mit TClientSocket
Zitat:
Woren kann es liegen, dass ich diese komischen Zeichen bekomme, liegt es an meinen System? Rad Studio 2009 Architect, Win Vista x86 |
Re: Komischer Fehler mit TClientSocket
Ich habe gerade mit einem Sniffer gesehen, dass dort auch die richtigen Daten ankommen, aber wieso werden die dennoch falsch angezeigt?
:wall: |
Re: Komischer Fehler mit TClientSocket
ich habe ja wirklich keine ahnung über unicode aber benutzt du vieleicht delphi 2009 ?
(ich hoffe ich rede keinen schwachsinn :? ) |
Re: Komischer Fehler mit TClientSocket
Zitat:
|
Re: Komischer Fehler mit TClientSocket
Liegt es also an Unicode?
Wenn ja, wie könnte ich es dann beheben? Mit der Indy HTTP Kompo. funktioniert es ja schließlich auch... |
Re: Komischer Fehler mit TClientSocket
Mit Delphi 7 klappt es perfekt, gerade ausprobiert.
Wieso aber nicht mit Delphi 2009, muss man dort irgendwas spezielles vorher einstellen oder so? (wegen Unicode) :wiejetzt: |
Re: Komischer Fehler mit TClientSocket
Hallo,
Ist schon etwas seltsam :gruebel: Ich habe gedacht man könnte es mal via Stream probieren - und tatsächlich: Es funktioniert :thumb:
Delphi-Quellcode:
procedure TForm1.sockRead(Sender: TObject; Socket: TCustomWinSocket);
var Stream: TStringStream; Buffer : Pointer; Len : Integer; begin Len := Socket.ReceiveLength; Stream := TStringStream.Create(); try Stream.Seek(0,soFromEnd); Buffer := AllocMem(Len); try Socket.ReceiveBuf(Buffer^, Len); Stream.Write(Buffer^, Len); ShowMessage(Stream.DataString) finally FreeMem(Buffer); end; finally Stream.Free; end; end; |
Re: Komischer Fehler mit TClientSocket
Zitat:
|
Re: Komischer Fehler mit TClientSocket
Geht sogar noch etwas einfacher. Mit ReceiveBuf()
Jedoch muss der Buffer (Buf) vom Typ AnsiChar sein. Sonst kommt auch Zeichensalat raus.
Delphi-Quellcode:
procedure TForm1.sockRead(Sender: TObject; Socket: TCustomWinSocket);
const MAX_BUF = 100; var Buf : array[1..MAX_BUF + 1] of AnsiChar; Bytes : Integer; begin Bytes := Socket.ReceiveLength; while Bytes > 0 do begin Dec(bytes, Socket.ReceiveBuf(Buf, MAX_BUF)); Buf[MAX_BUF] := #0; Memo1.Text := Memo1.Text + Buf; end; end; |
Re: Komischer Fehler mit TClientSocket
Ja, ich habe es jetzt einfach so gemacht:
Delphi-Quellcode:
Ist am kürzesten und am verständlichsten (für mich) :)
var
s:ansistring; begin setlength(s,socket.ReceiveLength); socket.ReceiveBuf(s[1],socket.ReceiveLength); memo1.Lines.Add(s); end; Danke an alle. |
Re: Komischer Fehler mit TClientSocket
sry, bitte löschen
|
Re: Komischer Fehler mit TClientSocket
Ich hoffe, es ist okay, wenn ich diesen älteren Thread nochmal "aufwärme", aber ich habe gerade genau das gleiche Problem!
Ich sende einen String per .SendText und prüfe sogar, ob die richtige Anzahl der gesendeten Bytes mit der Länge des Strings übereinstimmen. Beim Client kommt auch die richtige Anzahl an Bytes an (Prüfung per .ReceiveLength), aber wenn ich dann mit .ReceiveText das ganze in einen String übernehme, erhalte ich nur wirre Zeichen. Momentan behelfe ich mir ebenfalls mit dem work-around per .SendBuf/.RevceiveBuf, aber wüsste doch gerne, was der Grund dieses Fehlers (?) ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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