![]() |
Socket - Daten verschicken - Fehler!
Hi,
ich hab jetzt versucht mit SendBuf und ReceiveBuf einen Record zu verschicken. Hier erstmal mein Code:
Delphi-Quellcode:
Wenn ich das so ausführen will erscheint bei mir dieser Fehler:
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. Zitat:
Gruß Patrick |
Re: Socket - Daten verschicken - Fehler!
1. Du wirst aufgerufen, so bald der Socket was empfangen hat. Das bedeutet nicht, dass der Record komplett ist.
![]() 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. |
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: ![]() |
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:
in
Server.Socket.ReceiveBuf(Rec,SizeOf(Rec));
Delphi-Quellcode:
umändern muss.
Socket.ReceiveBuf(Rec,SizeOf(Rec));
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. |
Re: Socket - Daten verschicken - Fehler!
Zitat:
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; |
Re: Socket - Daten verschicken - Fehler!
Achso, jetzt hab ichs glaube ich verstanden :)
|
Re: Socket - Daten verschicken - Fehler!
Kann ich mit SocketStream dann auch gut Dateien verschicken?
|
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? |
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. |
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 23:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz