| Autor |
Beitrag |
professorbass
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 10:57
He Leute ich will euch hier nicht auf den Wecker fallen *gg* mit meinen fragen.
Aber was ist hier falsch im Code
was mache ich falsch
wen ich im Browser localhost eingebe lädt es stundenlang und es passiert nix.
Ich glaube das hat was mit RecvBufferSize zu tun???.
Und wen das so ist was wäre richtig???
oder ist was anderes falsch?
könnt ihr mir da helfen?
THX
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdContext, StdCtrls, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer;
type TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); private public end;
var Form1: TForm1;
implementation
Uses IdTCPClient; {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin IdTCPServer1.Active := True; end;
procedure TForm1.Button2Click(Sender: TObject); begin IdTCPServer1.Active := False; end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); Var Cli : TIdTCPClient; Len : Cardinal; Data : String; begin Try Cli := NIL; Try Cli := TIdTCPClient.Create( NIL ); Cli.Host := 'tue-hauptclan.eu'; Cli.Port := 80; Cli.Connect; Repeat If AContext.Connection.Socket.RecvBufferSize>0 then Begin Len := AContext.Connection.Socket.RecvBufferSize; Data := AContext.Connection.Socket.ReadString(Len); Cli.Socket.Write( Data ); End; If Cli.Socket.RecvBufferSize>0 then Begin Len := Cli.Socket.RecvBufferSize; Data := Cli.Socket.ReadString(Len); AContext.Connection.Socket.Write( Data ); End; Cli.Socket.CheckForDisconnect(False); Cli.CheckForGracefulDisconnect(False); AContext.Connection.Socket.CheckForDisconnect(False); AContext.Connection.CheckForGracefulDisconnect(False); SleepEx(1,True); Until (NOT AContext.Connection.Connected) OR (NOT Cli.Connected); Finally If Assigned(Cli) then Begin Cli.Disconnect; Cli.Free End; AContext.Connection.Disconnect; End; Except End; end;
end. |
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 09.08.10 14:32
hast du das denn schonmal debuggt?
Was wird aufgerufen, wo hakt es?
Etwas Eigeninitiative bitte.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 14:36
Ich frag mal vorsichtig nach.
Du weisst, das localhost, entweder ein VM ist oder ein 2. Rechner, der darauf wartet das Du dich mit ihm verbindest. Also die Anfrage gestartet hat, das Du dich mit ihm verbinden sollst.
Müsstest Du evtl den Code auch noch posten? Denn das Problem kann ja auch da sein!
Denn auf Dich selbst wirst Du es ja nicht versuchen! Oder evtl IP angeben.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 14:43
Es war dieses Tutorial was ich da gemacht habe.
Es ist leider veraltet so das ich den Code etwas verändern musste für indy10
dort gibt es kein 2. Code ???
www.delphi3000.com/a...article_3381.asp?SK=
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 09.08.10 14:43
BTW.: Du weißt das keine Fehlermeldung kommen würde selbst wenn ein Fehler auftritt? Grund ist das du komplett alle Fehler unbehandelt mit der leeren Except-Anweisung (ev. sogar mit der Finally) abfängst.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 15:12
Schau was dir elundril noch geschrieben hat. Ne Fehlermeldung kannst du natürlich nicht bekommen. Steht aber auch in diesem lnk drin, das Du dafür was selber machen must!
dort wird aber auch mit Thread gearbeitet so wie ich es sehe!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 15:25
Jaich habe nun
Except
ShowMessage('Fehler');
end;
eingetragen
richtig jetzt kommt ein Fehler.
@ALF ja das ist mir klar das es dann weiterleitet zu der Domain wo ich eingetragen habe.
aber das macht's nicht Browser bleibt weis Fehler kommt vom Programm und der Browser wartet auf Antwort vom Server.
mit aTread geht es nichtmehr mit der indy Version 10 haben die geändert.
da habe ich nachgeforscht im internet und rausgefunden
bei version 10 von indy geht das so nicht mehr.
AThread.Connection.CurrentReadBufferSize
darum meine Frage ja warum das so ist,
worann es ligen könnte
habe es ja soweit edditiert das es mit der version 10 gehen sollte.
@Flamefire ich habe den Debugger laufenlassen kommt
thread start
und ohne debug infos.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 15:34
Setzt mal ein Breakpoint bei Zeile 66 ob da was kommt und steppe dann durch ob DATA überhaupt was drin hat!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 09.08.10 15:39
probier mal lieber folgendes:
Delphi-Quelltext 1: 2: 3:
| except on E: Exception do Showmessage(E.Message); end; |
Damit kann man ev. mehr anfangen als mit 'Fehler'.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 15:57
Delphi-Quelltext 1: 2: 3:
| except on E: Exception do Showmessage(E.Message); end; |
Hat nicht wirklich viel gebracht *gg*
Aber guter tip. THX
es kommt kein Fehler mehr
Browser sagt warten auf Host, und er wartet und wartet *gg*
hab gestern die ganze Nacht gesucht ob es eventuell noch n anderes Tutorial gibt das ich anhand dessen vielleicht den Fehler finde aber leider nix. naja mal sehen vielleicht krieg ich es ja noch irgend wie hin mit eurer Hilfe.
--- Moderiert von Narses: Beiträge zusammengefasst---
Nachtrag:
Doch nach Langerzeit kommt der Fehler: Connection Closed Gracefully
"CONNECTION CLOSED GRACEFULLY" ist wenn die Gegenstelle unerwartet die Verbindung beendet. In diesem Fall könnte es sein, dass man sich mit einer dynamischen IP-Adresse (= Einwahl-IP-Adresse = zugewiesende IP-Adresse des Internetproviders) mit einem Server verbindet und der Server das nicht mag. Der Server trennt einfach die Verbindung. Alternative wäre der Server erlaubt nur die Verbindung (und Kommunikation) mit bestimmten IP-Adressen, alle anderen dürfen sich zwar verbinden werden aber sofort wieder getrennt.
Danke nochmals für eure Hilfe echt geil von euch
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 16:09
Nimm doch mal ne andere Adresse google oder so!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 16:38
Ne weder denen ihre eigne von dem tutorial geht.
noch Google oder meine eigne Domains.
Schade Funktioniert nicht ich versteh au die Fehlermeldung nicht die iss doch bisschen komisch oder ??
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 09.08.10 16:47
ALF hat folgendes geschrieben : | Setzt mal ein Breakpoint bei Zeile 66 ob da was kommt und steppe dann durch ob DATA überhaupt was drin hat!
Gruss Alf |
@professorbass: Hast du das gemacht, nachdem es dir schon der 2. gesagt hat? >.<
Ist doch wurst ob die Adresse geht. Wichtig ist erstmal, dass es beim Server ankommt, den du geschrieben hast.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 16:48
Also aufhängen tut sich das ganze bei
Delphi-Quelltext 1: 2:
| Len := AContext.Connection.Socket.RecvBufferSize;Data := AContext.Connection.Socket.ReadString(Len); |
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 17:06
Stimmt
Quelltexthaltepunkt bei $004E4835: \Unit1.pas Zeile 63. Prozess Project1.exe (17032)
dan ist warscheinlich RecvBufferSize eben doch falsch...
E2171 Auf Variable 'Len' kann wegen Optimierung nicht zugegriffen werden
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mo 09.08.10 17:19
mh.... wenn ich weiter steppe hängt er sich in der Unit IDStackWindows Zeile 834 bei der
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| class function TIdSocketListWindows.FDSelect(AReadSet, AWriteSet, AExceptSet: PFDSet; const ATimeout: Integer): Boolean; var LResult: Integer; LTime: TTimeVal; begin if ATimeout = IdTimeoutInfinite then begin LResult := IdWinsock2.Select(0, AReadSet, AWriteSet, AExceptSet, nil); end else begin LTime.tv_sec := ATimeout div 1000; LTime.tv_usec := (ATimeout mod 1000) * 1000; LResult := IdWinsock2.Select(0, AReadSet, AWriteSet, AExceptSet, @LTime); end; Result := (GStack as TIdStackBSDBase).CheckForSocketError(LResult) > 0; end; | Bis dahin werden aber Daten gelesen! Denn der "Puffer" der noch zwischendurch erstellt wird, wird mit Daten gefüllt! 1X, beim 2ten durchlauf bleibt er an der obigen Stelle hängen
mh.....
Edit:
das ist, was der Server im Puffer hat:
| Zitat: |
GET / HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: de
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: localhost
Connection: Keep-Alive
Cookie: pkSITE=a%3A1%3A%7Bi%3A0%3Bi%3A1266620400%3B%7D
|
Es ist die anfrage vom IE "localhost", wenn ich es richtig sehe.
Beim Versuch den Clienten zuerst auszulesen, hängt sich der Client auch an dieser Stelle auf, holt aber noch nicht mal Daten von der angegebenen Adresse!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Mo 09.08.10 21:05
Gut super...
da sind wir schon bissel weiter..
Was gibt es den für bessere Alternativen für ReadString
wens überhaupt eine gibt...???
ich mein ist ja kein string is ja ein Cardinal dessen inhald zu einem string werden soll richtig????
Dumme Fragen gibts ned
bin Amfänger!!!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 09.08.10 21:16
häng mal bitte das projekt an.
dann guck ich mal...
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 10.08.10 00:00
Also, das auslesen der Daten, darf als Ergebnis, nur die tatsächliche länge haben. In diesem Fall sind es 502 bytes. Dann steht das drin, was oben bei mir als Zitat markiert ist.
Delphi-Quelltext 1:
| Data := AContext.Connection.Socket.ReadString(502); |
mit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| If AContext.Connection.Socket.RecvBufferSize>0 then Begin Len := AContext.Connection.Socket.RecvBufferSize; while len>0 do begin if length(AContext.Connection.Socket.ReadLn)<>0 then begin Data := Data + AContext.Connection.Socket.ReadLn; dec(len); end else break; end; Cli.Socket.Write( Data); End; | wird Data auch gefüllt!
Nun folgt auch eine Anforderung zur Adresse, laut log von Apache!
Wie nun aber die Daten von der Adresse zurückkommen??? nix gefunden!
Flamefire eigentlich nur C&P von professorbass seinem 1.Post
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
professorbass 
      
Beiträge: 21
|
Verfasst: Di 10.08.10 09:35
ja ich probiere Delphi zu lernen und so mache ich tutorial für tutorial aus dem netz und Google hilft mir.
jedes tutorial wo interessant aus siht mache ich.
Aber ich denke es ist dann doch zu Schwer.
Mit php kahm ich gut zurecht auf diese Weise hier portal.tue-hauptclan.eu das ist in mache warte auf das design wo ein kumpel macht
solang ist dort pause... fehlen noch phar funktionen abersowet ists schon fertig mit admin bereich wird ein schönes cms.
da dacht ich mir soooo viel schwererer kann das doch nicht sein. oder verwirrt mich php den da sind phaar sachen gleich wie z.b. die if abfrage fast identisch.
und da wir hier die Software rumfahren haben dacht ich mir das könnte lustig werden ich
mach noch ein tutorial wen ich das hier nicht Klappen sollte wen das dann auch nicht klappt lasse Ichs
wäre schon toll das zu können.
--- Moderiert von Narses: Beiträge zusammengefasst---
@ ALF der weg zurück ist ja eigentlich...
na klar der müsste den selben fehler haben denn der funktioniert ja fast gleich wen ichs habe poste ich den code.
|
|