Entwickler-Ecke
Internet / Netzwerk - Socket CLient Read Fehler
furby - Mi 11.01.06 23:08
Titel: Socket CLient Read Fehler
kann mir wer sagen, warum bei dieser Prozedur ein Acces Violation Fehler auftritt. Ich habs zwar mit try except gemacht, aber das nützt mir ja nichts. weil ich ja will, dass das auch funktioniert ;). naja hier ist mal der code
Delphi-Quelltext
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:
| procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Rectext, Param1, Param2: string;
begin try repeat label1.caption := socket.receiveText; RecText := RestText + Socket.ReceiveText; RestText := ''; if RecText[1] = '{' then begin SplitString(RecText,Param1, Param2) ; if RecText = 'FUN' then begin if Param1 = 'HIDE TASKBAR' then begin ShowTaskBar(false); SendTextToClient('ADD','taskbar invisible.',''); Memo1.Lines.add('taskabar versteckt'); end
else if Param1 = 'SHOW TASKBAR' then begin ShowTaskBar(true); SendTextToClient('ADD','taskbar visible.',''); Memo1.Lines.add('taskabar sichtbar'); end; end; end; until RecText = 'Error'; except Memo1.Lines.add('Fehler'); end; end; |
alias5000 - Mi 11.01.06 23:32
Hast du noch genauere Informationen, wo die AV auftritt, du könntest ja auch mal die try-except Schleife enger fassen, also weniger Befehle in die Schleife packen, am besten jeden Befehl einzeln, dann weißt du genau, wos hakt.
Gruß alias5000
PS.: ein Tipp, es gibt eine recht gute Komponente/Bibliothek, namens madexcept, die dir sogar die Zeilennummer des Fehlers, sowie den gesamten Aufrufstack zurückgibt:
http://www.madshi.net
Narses - Mi 11.01.06 23:57
Moin!
Ich rate mal, dass der Fehler hier liegt:
Delphi-Quelltext
1:
| if RecText[1] = '{' then |
weil: Du liest in einer Schleife per .RecieveText und setzt den anderen Teilstring auf einen Leerstring. Später wird also RecText auch ein Leerstring sein (können), und dann haut dir RecText[1] natürlich eine rein (Exception), weil der String möglicherweise leer ist.
Also, ganz ehrlich, wenn ich mir deinen Code so ansehe, dann sieht mir das nach einem Protokoll-Parser aus; aber leider einer, der total krasse Macken hat, wenn ich das mal so sagen darf :wink: (zwei Aufrufe von .RecieveText und dann noch in einer Schleife... :gruebel:)
Darf ich dir mal mein neues
Protokoll-Chat-Tut [
http://www.delphi-library.de/viewtopic.php?t=54269&start=0&postdays=0&postorder=asc&highlight=] ans Herz legen? 8) :wink:
cu
Narses
furby - Do 12.01.06 23:29
ich werds mir mal reinziehen ;)
thkerkmann - So 15.01.06 16:04
Hi,
narses hat genau recht.
Socket.ReceiveText ist eine Funktion, die die Daten vom Socketbuffer liest. Und dann sind sie weg. Man kann sie also nicht 2x hintereinander aufrufen um den gleichen Text zu erhalten.
Normalerweise macht man das so:
Delphi-Quelltext
1: 2: 3:
| s := ''; while socket.ReceiveLength > 0 do s := s + socket.ReceiveText; |
und jetzt kann man den text in s locker parsen.
Gruss
Thomas.
Moderiert von
raziel: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!