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 user profile iconraziel: Delphi-Tags hinzugefügt