AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Socket - Daten verschicken - Fehler!
Thema durchsuchen
Ansicht
Themen-Optionen

Socket - Daten verschicken - Fehler!

Ein Thema von PatrickB · begonnen am 19. Dez 2007 · letzter Beitrag vom 20. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#1

Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:11
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:20
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.
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#3

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:25
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
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#4

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:48
Okay, jetzt hab ich nochmal nen alten Thread gelesen in dem das gleiche Thema behandelt wurde und bin nun auch darauf gekommen dass man Server.Socket.ReceiveBuf(Rec,SizeOf(Rec)); in 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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:50
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;
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#6

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 17:55
Achso, jetzt hab ichs glaube ich verstanden
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#7

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 18:22
Kann ich mit SocketStream dann auch gut Dateien verschicken?
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#8

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 18:38
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?
  Mit Zitat antworten Zitat
PatrickB

Registriert seit: 13. Dez 2007
61 Beiträge
 
#9

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 19:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Socket - Daten verschicken - Fehler!

  Alt 19. Dez 2007, 20:12
Guck mal was es hier nettes gibt:
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:12 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