AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Socket ReceiveBuf und ReceiveText unterscheiden
Thema durchsuchen
Ansicht
Themen-Optionen

Socket ReceiveBuf und ReceiveText unterscheiden

Ein Thema von Alcatraz · begonnen am 30. Jan 2006 · letzter Beitrag vom 6. Feb 2006
Antwort Antwort
Alcatraz

Registriert seit: 23. Jan 2006
3 Beiträge
 
Delphi 5 Enterprise
 
#1

Socket ReceiveBuf und ReceiveText unterscheiden

  Alt 30. Jan 2006, 16:12
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;
The Alcatraz
~ Das leben ist Scheisse, doch die Grafik ist geil ^^ ~
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Socket ReceiveBuf und ReceiveText unterscheiden

  Alt 30. Jan 2006, 18:34
Moin!

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 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 ...
  Mit Zitat antworten Zitat
Alcatraz

Registriert seit: 23. Jan 2006
3 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Socket ReceiveBuf und ReceiveText unterscheiden

  Alt 6. Feb 2006, 20:12
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;
The Alcatraz
~ Das leben ist Scheisse, doch die Grafik ist geil ^^ ~
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 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