AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TUDPSocket

Ein Thema von gbl · begonnen am 13. Aug 2005 · letzter Beitrag vom 20. Aug 2005
Antwort Antwort
gbl

Registriert seit: 21. Aug 2004
18 Beiträge
 
#1

TUDPSocket

  Alt 13. Aug 2005, 15:00
Ich versuche gerade via UDP socket Daten hin und her zu schicken. Leider gibts dafür kein vernünftiges Beispiel.

Mein experimenteller Code schaut z.Z. so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    ServerUdpSocket: TUdpSocket;
    ClientUdpSocket: TUdpSocket;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ServerUdpSocketReceive(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure ServerUdpSocketConnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var buf: string;
begin
  buf:=Memo1.Text;

  ClientUdpSocket.SendBuf(buf, sizeof(buf));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    with ServerUdpSocket do // Empfang
    begin
      LocalPort:='4000';
      Localhost:='127.0.0.1';
      Active:=True;
      Open;
    end;
  except
    ServerUdpSocket.Free;
  end;

  try
    with ClientUdpSocket do // Senden
    begin
      RemotePort:='4000';
      RemoteHost:='127.0.0.1';
      Active:=True;
      Open;
    end;
  except
    ClientUdpSocket.Free;
  end;
end;

procedure TForm1.ServerUdpSocketReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
var Buf_: string;
begin
  ServerUdpSocket.ReceiveBuf(Buf_, ServerUdpSocket.BytesReceived); ;
  Memo2.Text:=Buf_
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var buf: string;
begin
  Memo1.Text:=inttostr(GetTickCount);
  buf:=Memo1.Text;

  ClientUdpSocket.SendBuf(buf, sizeof(buf));
end;

procedure TForm1.ServerUdpSocketConnect(Sender: TObject);
begin
  Label2.Caption:=ServerUdpSocket.RemoteHost;
end;

end.
Späteres Ziel ist es eine Kommunikation zwischen Client und Server in beiden Richtungen stattfinden zu lassen. Client und Server können auch auf dersselben Maschine laufen.

Mein Problem ist momentan, daß bei ServerUdpSocketConnect nicht mal die Verbindung zustande kommt.
______________________________________
cu.
Günter
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

Re: TUDPSocket

  Alt 20. Aug 2005, 11:09
Hallo,
ich empfehle die Indys zu benutzen. Da gibt es jede Menge Demos und die Verwendung ist wirklch nicht schwer.

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
gbl

Registriert seit: 21. Aug 2004
18 Beiträge
 
#3

Re: TUDPSocket

  Alt 20. Aug 2005, 16:35
Danke für Deinen Rat.

Ich möchte jedoch dieses Problem lösen und nicht umgehen. Aus Projekttechnischen Gründen kann/können Indy oder andere 3rd Party Komponenten nicht verwendet werden.
______________________________________
cu.
Günter
  Mit Zitat antworten Zitat
Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#4

Re: TUDPSocket

  Alt 20. Aug 2005, 16:57

Zitat von gbl:
UDP
Zitat von gbl:
Verbindung
Ich dachte immer, dass UDP ein Protokoll ist, das NICHT verbindungsorientiert ist. Wie sollte denn eine Verbindung zu Stande kommen, wenn man einfach nur fröhlich Pakete ins Netz sendet?

Aber ist wie immer nur ein Einwand einer einfältigen Person...

€dit: Achja, ich wollte ja auch noch was halbwegs sinnvolles sagen/anregen: Unter JAVA - beim Programmieren eines IP-Telefons (ist ja zzT ganz groß in Mode...) - hatte ich öfters das Problem, dass der Sender zwar dauernd Daten (bei dir den Timestamp) sendet, der Receiver aber nur einmal received. Unter JAVA haben wir das dann mit Threads und ner "benutzerterminierten" (<-- Der Ausdruck ist an dieser Stelle bestimmt nicht so ganz richtig...) Endlosschleife gelöst. Ich weiß nun nur nicht, ob der UDPSocked unter Delphi die permanente Überprüfung automatisch macht.
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#5

Re: TUDPSocket

  Alt 20. Aug 2005, 18:39
Also ich hatte enorme probleme tservers socket zu verwenden.
bin mit indy sehr viel besser zurecht gekommen.
Zitat:
Ich dachte immer, dass UDP ein Protokoll ist, das NICHT verbindungsorientiert ist.
Das stimmt wohl so halbwegs - berbindungslos bedeutet aber nur, daß es für die verbindung keinen timeout gibt bzw. daß nicht überprüft wird, ob die daten wirklich angekommen sind.
Wenn also der socket auf der einen seite zugemacht wird, dann bekommt das die andere seite nicht mit.
Bei udp muß man auch ein bisschen mit dem buffer aufpassen.
Der kann leicht mal überlaufen.
Auch wenn du ein server/client programm darauf aufbaust mußt du aufpassen, daß du eine antwort auf eine serveranfrage nicht 2-3 mal empfängst bzw. der buffer auch wirklich geleert wird wenn du abrufst.
Ich hab dazu jedesmal den socket wieder zugemacht und danach wieder auf - eine bessere lösung hatte ich nicht - leider.

auch empfehle ich threads für das senden und empfangen zu verwenden mit entsprechendem timeout.

Arnulf

Edit:
Ach ich hab wiedermal schlecht gelesen
Du verwendest die events bei den udp combos.
Die werden dir aber nicht anspringen wenn etwas in den puffer kommt. Also das Receive wird so nicht funktionieren.
Das even springt nur an wenn du tatsächlich gerade dabei bist etwas zu empfangen aber nicht, wenn etwas in den puffer vom socket geschrieben wird.
ich mein damit, du mußt receive manuell aufrufen und danach springt das receive event an.
zumindestens war es bei mir so.
Am server kann man dafür blocking verwenden, dann kannst du in einem thread auf daten warten.
Beim client kann man das auch machen und damit dann ein event selber basteln.
Soweit ich weiß kannst du auch nachschauen ob etwas empfangen wurde - habs auf die schnelle vergessen - aber mit peekmessagebuffer (oder so ähnlich) geht das.

Arnulf
  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 04:58 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