![]() |
TUDPSocket
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:
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.
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. Mein Problem ist momentan, daß bei ServerUdpSocketConnect nicht mal die Verbindung zustande kommt. |
Re: TUDPSocket
Hallo,
ich empfehle die Indys zu benutzen. Da gibt es jede Menge Demos und die Verwendung ist wirklch nicht schwer. Florian |
Re: TUDPSocket
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. |
Re: TUDPSocket
:wiejetzt:
Zitat:
Zitat:
Aber ist wie immer nur ein Einwand einer einfältigen Person... :stupid: €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. :wink: |
Re: TUDPSocket
Also ich hatte enorme probleme tservers socket zu verwenden.
bin mit indy sehr viel besser zurecht gekommen. Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 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