Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Socket ReceiveBuf und ReceiveText unterscheiden (https://www.delphipraxis.net/62063-socket-receivebuf-und-receivetext-unterscheiden.html)

Alcatraz 30. Jan 2006 15:12


Socket ReceiveBuf und ReceiveText unterscheiden
 
Hallo;

Gibt es keine Möglichkeit um festzustellen op man nun Text oder Stream empfàngt?

Ich habe versucht es so zu lösen:

Code:
  Stream:=TMemoryStream.Create;
  Socket.ReceiveBuf(Stream,Socket.ReceiveLength);
  Received:=socket.ReceiveText;
try
    Stream.Seek(0,soFromBeginning);
    Image2.Picture.Bitmap.LoadFromStream(Stream);
    Image2.Picture.Bitmap.SaveToFile('server_test.bmp');
except
  memo1.lines.append(socket.ReceiveText);
end;
Dann steht jedoich nichts im Memo1.
Wenn ich anstelle von
Code:
memo1.lines.append(socket.ReceiveText);
Code:
memo1.lines.append('blablabla');
benutze funktionniert es.

Also werden die Informationen vorher weggenommen.
Wie kann ich das verhindern beispielsweise umgehen?
Dass ich am Ende noch den Text in das Memo setzen kann.

mfG;

Muetze1 30. Jan 2006 17:34

Re: Socket ReceiveBuf und ReceiveText unterscheiden
 
Moin!

Zitat:

Zitat von Alcatraz
Gibt es keine Möglichkeit um festzustellen op man nun Text oder Stream empfàngt?

Nein, darum musst du dich in deinem eigenen Protokoll kümmern.

Zitat:

Zitat von Alcatraz

Ich habe versucht es so zu lösen:

Code:
  Stream:=TMemoryStream.Create;
  Socket.ReceiveBuf(Stream,Socket.ReceiveLength);
  Received:=socket.ReceiveText;
try
    Stream.Seek(0,soFromBeginning);
    Image2.Picture.Bitmap.LoadFromStream(Stream);
    Image2.Picture.Bitmap.SaveToFile('server_test.bmp');
except
  memo1.lines.append(socket.ReceiveText);
end;

Dreifach *Autsch* Der Code ist wirklich böse. Du hast da einen wirklich, wirklich bösen Code geschrieben. Mal kurz durchgehen: Du instanziierst eine Instanz von TMemoryStream. Die Instanzenadresse wird in ihrer Variable abgelegt (4 Byte gross). Dann haust du alle im Buffer des Sockets vorhandenen Daten einfach in die 4 Byte grosse Variable - ok, 4 Byte wären (wenns nicht falsch wäre) noch ok, aber alles andere zerschiesst dir alle nachfolgenden Variablen, etc. Mit dem ReceiveBuf() ist der Socketbuffer leer und trotzdem versuchst du danach noch mit ReceiveText was auszulesen. Da wird immer ein Leerstring zurück kommen - ausser du hast wirklich mal soviel Glück, dass zwischenzeitlich der Socket Thread zugeschlagen hat und den Buffer befüllt hat (unwahrscheinlich). Bei ReceiveBuf() und ReceiveText() verhält es sich gleich: einmal ausgeführt, werden die ausgelesenen Daten aus dem Socketbuffer entfernt.

So, dann das Stream.Seek(), was sehr höchstwahrscheinlich abgestürzt ist, weil die Instanz in Stream durch Daten vom Socket überschrieben wurden, wahrscheinlich auch deshalb mit Try/Except zum Schweigen gebracht, bringt dann auch nix mehr, da keine Daten im Stream sind - bzw. überall, nur nicht dort. Die Instanz vom Stream ist eh verloren.

Und als vorletztes gehst du sofort davon aus, dass bei einem Aufruf von OnClientRead() o.ä. mit einem ReceiveBuf() ein komplettes Bitmap empfangen wurde. Da muss ich dich enttäuschen. Dieser Fall würde nur bei wirklich kleinen Bitmaps eintreten. Im Normalfall müssen mehrere folgende Aufrufe von OnClientRead abgewartet werden, bis man das komplette TBitmap empfangen hat. Aber zu wissen wann dies der Fall ist, hilft dir wiederrum ein Protokoll, wo du vor dem Bitmap die Informationen schicken kannst, wie gross denn das folgende Bitmap ist.

Und als aller letztes versuchst du erneut mit ReceiveText was aus dem Socket zu lesen - was aber mit 200%iger Wahrscheinlichkeit wieder nix ergibt, da der Socket wohl wiederrum noch nix neues empfangen hat. Dü könntest ansatzweise mal die Variable Received ins Memo schreiben - aber wie schon oben vermutet sollte da nix drinne stehen.

Empfehlung: Ein Tutorial über Sockets und deren Komponenten (egal ob nun Indy oder TClientSocket/TServerSocket).

PS: Zu deiner Signatur: Das "das" vor Leben hat eine bestimmte Bedeutung. Und mal so nebenbei: Substantive werden gross geschrieben...

Muetze1 ist heut wieder bööööse :evil: :twisted: ...

Alcatraz 6. Feb 2006 19:12

Re: Socket ReceiveBuf und ReceiveText unterscheiden
 
Hey!

Ich hab' das jetzt anders versucht. Funktionniert trotzdem nicht! :(

Typen-Deklaration:
Code:
type
  TYaimRec = record
    Text: String[200];
    Img: TGraphic;
end;
Versenden beim Client:
Code:
  Rec.Text:='IMG';
  image1.Picture.Graphic.LoadFromFile('C:\test.jpg');
  Rec.Img:=image1.Picture.Graphic;
  Client.Socket.SendBuf(Rec,sizeof(Rec));
Empfangen beim Server:
Code:
  Socket.ReceiveBuf(Rec,SizeOf(Rec));
  if rec.Text='IMG' then begin
    rec.img.SaveToFile('C:\test_received.jpg');
  end
  else showmessage(Rec.Text);
Wieso funktionniert das nicht?
Beim speichern am Server
Code:
rec.img.SaveToFile('C:\test_received.jpg');
bekomm' ich eine Access violation.

mfG;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 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