Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi UDP Socket verbindung? (https://www.delphipraxis.net/128067-udp-socket-verbindung.html)

Ganjaaa 23. Jan 2009 12:39


UDP Socket verbindung?
 
Hallo also ich versuche schon seit geraumer zeit eine UDP (ja ich meine auch UDP) verbindung zu einen Server zu bekommen.

Das problem ist das ich das irgendwie trotz googlen ned rausbekommen kann mir einer helfen

In PHP bekomme ich sowas hin das sieht dann so aus

Delphi-Quellcode:
$sock = @fsockopen("udp://".$host, 29900);
      if($sock != false)
      {
         socket_set_timeout( $sock, 0, 500000 );
         @fwrite($sock, "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01");
         $info = @fread($sock,4096);
         $info .= @fread($sock,4096);
         fclose($sock);
      }
So das ich den datenblock "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01" sende und dann in $info die antwort erhalte

kann mir einer damit evt helfen mit Indy UDPClient hatte ichs schon versucht aber da stürzt mein pc immer ab kann sein das ich was falsch mache ^^

danke Ganjaaa

Relicted 23. Jan 2009 12:45

Re: UDP Socket verbindung?
 
hi,

nutzt du vista x64 ?
weil da schaffe ich es auch mit den indys einen bluescreen zu provozieren.

gruß
reli

Ganjaaa 23. Jan 2009 14:07

Re: UDP Socket verbindung?
 
Ähhh ja ^^ Vista Business Edition (64bit)

Meflin 23. Jan 2009 14:16

Re: UDP Socket verbindung?
 
Wenns die Indys nicht tun, vielleicht funktionierts ja mit Synapse?
http://www.ararat.cz/synapse/doku.php/

Ganjaaa 23. Jan 2009 14:36

Re: UDP Socket verbindung?
 
Ähm ich lese da schon groß in der Überschrift "TCP/IP" aber ich brauche eine UDP verbindung

Meflin 23. Jan 2009 14:38

Re: UDP Socket verbindung?
 
Zitat:

Zitat von Ganjaaa
Ähm ich lese da schon groß in der Überschrift "TCP/IP" aber ich brauche eine UDP verbindung

http://www.ararat.cz/synapse/doku.php/features
Zitat:

Supports TCP, UDP, ICMP and RAW protocols.
:roll:

sirius 23. Jan 2009 20:06

Re: UDP Socket verbindung?
 
In dem Thread hatte ich mal eine kleine (auf WIN-API basierende) UDP-Komponente geschrieben.

Ganjaaa 24. Jan 2009 00:35

Re: UDP Socket verbindung?
 
also sirius deine komponete schaut klasse aus nur bin ich glaube ich zu doof damit umzugehen

hier das habe ich soweit aber irgendwie kommt immer nen fehler xD

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sock: TUDP_Socket;
  buffer: String;
  buf: array[0..8096] of Byte;
begin
  sock := TUDP_Socket.Create(nil);
  try
    sock.RemoteHost := '69.12.76.145';
    sock.RemotePort := 29900;
    sock.SocketMode := smEvent;
    sock.Open;
    buffer := '\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01';
    sock.Send(buffer,length(buffer));
    sock.Recv(buffer,8096);
    sock.Close;
  finally
    sock.Free
  end;
end;

inherited 24. Jan 2009 07:40

Re: UDP Socket verbindung?
 
Probier mal
sock.Send(buffer[0],length(buffer));
sock.Recv(buffer[0],8096);

Grund: Liest du aus buffer statt buffer[0], wird von der Adresse des Zeigers aus gelesen, nicht von der Adresse des ersten Elements aus. Gleiches beim Lesen. Allerdings ist dein Buffer zu klein um 8096 bytes zu speichern. Vorher solltest du mit
SetLength(buffer, 8096) für den nötigen Platz sorgen.
Wieso eigentlich 8096? ich hätte 8192 oder 4096 erwartet :gruebel:

sirius 24. Jan 2009 10:41

Re: UDP Socket verbindung?
 
@inherited
Er hat zwar oben auch ein Array definiert, benutzt aber nur den String. Deswegen ist es buffer[1] (weil der String als einzige Ausnahme bei 1 anfängt)


@ganjaaa (neben dem oben erwähnten noch folgendes:)
Du hast smEvent als SocketMode angegeben. Dies bedeutet, dass recv zumeist nichts empfangen wird, weil zu de Zeitpunkt noch nichts da ist. Dein Programm ist schneller als das Netz.
Um die Funktionalität von PHP hinzubekommen musst du nur auf smBlocking stellen. Dann wartet recv bis auch etwas da ist. Allerdings ist diese funktionalität bei Desktopanwendungen nicht üblich. Denn, wenn es im Netz mal wieder länger dauert, friert dein Programm bei recv ein. Gleiches gilt, wenn gar nix zurückkommt. Deswegen war smEvent gar nicht so falsch. Du musst allerdings jetzt noch das Ereignis onReceiving mit einer Methode belegen und dort kannst du dann recv aufrufen.

Delphi-Quellcode:
//Fsock würde ich als Feld in die Klasse legen und in FormCreate bzw. Formdestroy erstellen und löschen
procedure TForm1.Button1Click(Sender: TObject);
var
  buffer: String;
begin
  //das kan auch schon woanders vorbelegt werden
  FSock.onReceiving:=RecvSock;
  Fsock.RemoteHost := '69.12.76.145';
  Fsock.RemotePort := 29900;

  Fsock.SocketMode := smEvent;
  Fsock.Open;
  buffer := '\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01';
  Fsock.Send(buffer[1],length(buffer));
end;
procedure TForm1.RecvSock(Sender: TObject);
var buffer: String;
    len:Integer;
begin
  setlength(buffer,8192);
  len:=FSock.recv(buffer[1],8192);
  setlength(buffer,len);
  showmessage(buffer);
  FSock.close;
end;
alles ungetestet


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 Uhr.
Seite 1 von 2  1 2      

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