Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Socket - Daten verschicken - Fehler! (https://www.delphipraxis.net/105312-socket-daten-verschicken-fehler.html)

PatrickB 19. Dez 2007 17:11


Socket - Daten verschicken - Fehler!
 
Hi,

ich hab jetzt versucht mit SendBuf und ReceiveBuf einen Record zu verschicken.
Hier erstmal mein Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DdeMan, Scktcomp, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    Server: TServerSocket;
    Client: TClientSocket;
    { Public-Deklarationen }
  end;

type
  CustomRec = record
    Text: String[20];
    Zahl: byte;
end;

var
  Form1: TForm1;


implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  //Initialisierung des Objekts (ältere Delphi-Versionen)

  try
    Server := TServerSocket.Create(Form1);
    Client := TClientSocket.Create(Form1);
    Server.OnClientRead := ServerClientRead; //Nur bei älteren Versionen
    Server.Port := 10024;
    Server.Open;
    Client.Port := 10024;
    Client.Host := '127.0.0.1';
    Client.Open;
  except
    //Im Fehlerfall wieder freigeben (ältere Versionen)
    Client.Free;
    Server.Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Client.Free;
  Server.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Rec: CustomRec;
begin
  //Unserem Record werden Werte zugewiesen
  with Rec do begin
    Text := Edit1.Text;
    //In Edit2 nur Zahlen eingeben!
    Zahl := StrToInt(Edit2.Text);
  end;
  //Unser Record wird verschickt!
  Client.Socket.SendBuf(Rec,sizeof(Rec));
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Rec: CustomRec;
begin
  //wir holen unseren Record ab...
  Server.Socket.ReceiveBuf(Rec,SizeOf(Rec));
  //...und übertragen den Inhalt in das MemoFeld
  with Rec do begin
    Memo1.Lines.Add(Text);
    Memo1.Lines.Add(IntToStr(Zahl));
  end;
end;
end.
Wenn ich das so ausführen will erscheint bei mir dieser Fehler:

Zitat:

Eine Anforderung zum Senden und Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und keine Adresse angegeben wurde(10057)
Könnt ihr mir bitte helfen =)

Gruß

Patrick

Muetze1 19. Dez 2007 17:20

Re: Socket - Daten verschicken - Fehler!
 
1. Du wirst aufgerufen, so bald der Socket was empfangen hat. Das bedeutet nicht, dass der Record komplett ist. Delphi-Referenz durchsuchenReceiveLength
2. Der Server kann viele Verbindungen zu den Clients haben während die Clients immer nur eine Verbindung zu einem Server aufbauen können. Nun nenn mir mal deine Vermutung, wie sich mehrere Client in einem Socket beim Server drängeln sollen. OnClientRead übergibt dir genau den Socket als Parameter, welcher Daten empfangen hat. Und selbst wenn, dann sind die Clients unter Server.Socket.Connections[] zu finden.
3. Wenn du im Fehlerfall die Sockets im FormCreate mit Free wieder freigibst, dann haben sie immernoch ihre alte Instanzadresse in den Membern, somit knallt es spätestens beim FormDestroy.

Und der Fehler rührt grundsätzlich vom 2. Punkt her. Trotzdem empfehle ich dir, die anderen Punkte entsprechend auch mit beachten.

PatrickB 19. Dez 2007 17:25

Re: Socket - Daten verschicken - Fehler!
 
Danke für die schnelle Antwort, aber irgendwie versteh ich die 2. Aussage nicht :?
1. hab ich bis jetzt ignoriert da ich immer beide editfelder ausfülle.

Edit:

Hab das Tutorial dazu benutzt: http://www.dsdt.info/tutorials/winsocket/?page=5

PatrickB 19. Dez 2007 17:48

Re: Socket - Daten verschicken - Fehler!
 
Okay, jetzt hab ich nochmal nen alten Thread gelesen in dem das gleiche Thema behandelt wurde und bin nun auch darauf gekommen dass man
Delphi-Quellcode:
Server.Socket.ReceiveBuf(Rec,SizeOf(Rec));
in
Delphi-Quellcode:
Socket.ReceiveBuf(Rec,SizeOf(Rec));
umändern muss.

Aber warum verstehe ich immer noch nciht so genau?

Und wie kann ich mit ReceiveLenght jetzt genau was anfangen?
Also wenn man in das Edit2 keine Zahl eingibt und versendet gibts den Fehler.

Muetze1 19. Dez 2007 17:50

Re: Socket - Daten verschicken - Fehler!
 
Zitat:

Zitat von PatrickB
Aber warum verstehe ich immer noch nciht so genau?

Der ServerSocket kann x-viele Clients gleichzeitig verbunden haben. Somit gibt es nicht nur ein Socket beim Server, sondern für jeden Client einen. Der Client, von dem Daten empfangen wurden, wird dir übergeben - besser: dessen Socket - als zweiten Parameter in dem Ereignis OnClientRead. Schau dir mal den zweiten Parameter an.

Delphi-Quellcode:
procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Rec: CustomRec;
begin
  //wir holen unseren Record ab...
  Socket.ReceiveBuf(Rec,SizeOf(Rec));
  //...und übertragen den Inhalt in das MemoFeld
  with Rec do begin
    Memo1.Lines.Add(Text);
    Memo1.Lines.Add(IntToStr(Zahl));
  end;
end;

PatrickB 19. Dez 2007 17:55

Re: Socket - Daten verschicken - Fehler!
 
Achso, jetzt hab ichs glaube ich verstanden :)

PatrickB 19. Dez 2007 18:22

Re: Socket - Daten verschicken - Fehler!
 
Kann ich mit SocketStream dann auch gut Dateien verschicken?

PatrickB 19. Dez 2007 18:38

Re: Socket - Daten verschicken - Fehler!
 
Wie kann ich mit ReceiveLength denn prüfen ob "Zahl" definiert wurde?

Und was ist der Unterschied wenn ich jetzt Zahl mit byte oder mit integer deklariere?

PatrickB 19. Dez 2007 19:23

Re: Socket - Daten verschicken - Fehler!
 
Okay, ich prüfe jetzt ob Edit2.Text eine Zahl ist und ob length <> 0 ist. Das klappt jetzt.

Jetzt müsst ich nur noch wissen wie ich das genau mache wie ich Dateien mit SendBuf verschicke.

Zacherl 19. Dez 2007 20:12

Re: Socket - Daten verschicken - Fehler!
 
Guck mal was es hier nettes gibt: http://www.delphipraxis.net/template.../icon_edit.gif :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Seite 1 von 2  1 2      

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