AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Socket und ReciveBuf -> keine Daten

Socket und ReciveBuf -> keine Daten

Ein Thema von Dragon27 · begonnen am 8. Sep 2007 · letzter Beitrag vom 8. Sep 2007
Antwort Antwort
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#1

Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 03:00
Hallo zusammen,

ich habe ein Problem beim Empfangen von Records. Vielleicht könnt Ihr mir weiterhelfen!

Die Serverprocedur zum empfangen:

Delphi-Quellcode:

procedure TForm2.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var z:integer;
ENachricht, SNachricht:RNachricht;
begin
Socket.ReceiveBuf(ENachricht,sizeof(ENachricht));
log('empfangen! '+ENachricht.Befehl+' '+ENachricht.Text); //Schreibt lediglich eine Lognachricht in ein Memo...


end;
Die Clientprocedur zum senden:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var SNachricht:RNachricht;
begin
SNachricht.Befehl:='logon';
SNachricht.text:=edit1.text;
sNachricht.Nickname:='';
Client.Socket.SendBuf(SNachricht, sizeof(SNachricht));

end;
Der Record:

Delphi-Quellcode:
type RNachricht=record
Befehl:String;
Text:String;
Nickname:String;
end;
Der Fehler (Beim Server):

Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Access violation at address 00403154 in module 'Project2.exe'. Read of address 004ED000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Ich habe jetzt die Firewall abgestellt... und trotzdem geht nix. Jedoch kann sich der Client connecten!

Danke für Eure Hilfe!!
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 08:51
Hallo,

ich denke, wenn du dir mal SizeOf(ENachricht) anschaust, dann müsstest du selbst merken was da schief geht. Dein Record enthält drei Zeiger auf Ansi-Strings! Die Zeiger mögen auf der Client-Seite noch eine Bedeutung haben, auf der Server-Seite dürften sie ins Nirwana zeigen. Du kannst alles mögliche zwischen Client und Server austauschen - nur keine Zeigerwerte.

Beim Senden von Texten hast du prinzipiell zwei Möglichkeiten: Trennzeichen folgen der Nachricht oder Nachricht folgt einer Längeninformation. Das Arbeiten mit Trennzeichen sollte bei einem eigenen Protokoll nur ab der zweiten Ebene erfolgen, da sich sonst Angriffsmöglichkeiten auf den Server ergeben.

Grüße vom marabu
  Mit Zitat antworten Zitat
Dragon27

Registriert seit: 20. Nov 2003
Ort: Aßling
543 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 08:55
Hallo,

das heißt die müsten ein zugewiesene Größe haben?

Danke!

Gruß Andy
Delphi is ......... DELPHI!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 10:33
Hallo Andy,

aus deiner Rückfrage schließe ich, dass ich mich nicht verständlich genug ausgedrückt habe. Für die Kommunikation definierst du dir einen universellen Puffer:

Delphi-Quellcode:
type
  PBuffer = ^TBuffer;
  TBuffer = record
    Size: Cardinal;
    Data: array [0..0] of Byte;
  end;
Intern kannst du mit beliebigen Puffern arbeiten, so auch mit deinem Record RNachricht. Ich würde diese Records als Klassen ausbilden. Was du dir dann aber unbedingt noch schreiben musst, dass sind Marshalling (und Unmarshalling) -Routinen, die deine Daten für den Versand umformen:

Delphi-Quellcode:
type
  IMarshal = interface(IInterface)
    procedure Marshal(var buffer: PBuffer);
    procedure Unmarshal(const buffer: PBuffer);
  end;

  TNachricht = class(TInterfacedObject, IMarshal)
    Befehl: string;
    Text: string;
    Nickname: string;
    // IMarshal
    procedure Marshal(var buffer: PBuffer);
    procedure Unmarshal(const buffer: PBuffer);
  end;
Die Marshalling-Prozedur könnte dann so aussehen:

Delphi-Quellcode:
procedure TNachricht.Marshal(var buffer: PBuffer);
var
  msg: string;
  size: Cardinal;
begin
  msg := Befehl + sLineBreak + Text + sLineBreak + Nickname;
  size := SizeOf(buffer.Size) + Length(msg);
  GetMem(buffer, size);
  buffer.Size := size;
  Move(msg[1], buffer.Data, size);
end;
An der Unmarshalling-Prozedur kannst du dich ja mal versuchen.

Alles nur getippt und nicht getestet.

Freundliche Grüße
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 10:41
Wieso definierst du noch ein Data in dem Record, wenn du diesen nie richtig nutzt? In der jetzigen Marshalling Methode alloziierst du Speicher welchen du auf einer anderen Ebene wieder freigeben musst.

Warum nicht einfach einen Cardinal direkt versenden mit der Grösse der folgenden Daten und danach die Daten. Diese hast du schliesslich in dem zusammengebauten String komplett vorliegen (in passend von Delphi alloziierten Speicher).
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Socket und ReciveBuf -> keine Daten

  Alt 8. Sep 2007, 11:08
Hallo Thomas,

nicht nur Data, sondern den ganze Record TBuffer habe ich nur aus didaktischen Gründen deklariert - selbst würde ich wohl nur einen Pointer verwenden. Aber deine eigentliche Frage ist ja: Warum Marshalling in einer eigenen Methode und damit ein Speicherverwaltungsproblem? Die Freigabe des angeforderten Speichers zu organisieren dürfte kein Problem sein, zur Not wird alles in einen String gepackt. Natürlich kann man auch ohne ein solches Interface arbeiten und deinen Vorschlag in einer Methode TNachricht.Send() umsetzen. Das ist dann der Verzicht auf eine Abstraktionsebene. Alles hat seine Vor- und Nachteile.

Freundliche Grüße
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:30 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