0

I'm looking for a simple UDP example/demo application for Delphi XE-7 and Indy 10.6.0.5169.

I've been looking for a while and everything I keep finding are for older versions of Indy or Delphi that no longer compile.

I need to implement the UDP Clients in order to handle WS-Discovery messages.

I tried to use the application listed here:

http://delphi.about.com/library/weekly/code/src101105.zip

SendBuffer is giving me an error here:

procedure TUDPSearchForm.SearchPartner;
var
  x: Array[0..3] of Byte;
begin
  RadioGroup1.Items.Clear;
  RadioGroup1.ItemIndex := -1;
  Height := 50+13;
  Top := Top;
  Left := left;
  Show;
  IdUDPClient1.Host := '255.255.255.255';
  IdUDPClient1.Active := true;
  IdUDPClient1.BroadcastEnabled := True;
  x[0] := $00; // Search Receivers
  x[1] := $00; // Search
  x[2] := MessageCount div $100;
  x[3] := MessageCount mod $100;
  inc(MessageCount);
  IdUDPClient1.Port := UDPDefaultPort;
  IdUDPClient1.SendBuffer(x, 4);
  IdUDPClient1.BroadcastEnabled := False;
end;
TLama
  • 75,147
  • 17
  • 214
  • 392
wjvandyke
  • 11
  • 1
  • 1
  • 1
  • There are no examples specific to XE7. If you have a particular demo you want to use, but it does not compile, then show the code and someone (probably me) will adjust it for you so it does compile. – Remy Lebeau Dec 03 '14 at 20:18
  • I tried to use the application listed here: http://delphi.about.com/library/weekly/code/src101105.zip – wjvandyke Dec 03 '14 at 20:42
  • I'm getting an error on: – wjvandyke Dec 03 '14 at 20:42
  • SendBuffer is giving me an error here: TUDPSearchForm.SearchPartner; var x: Array[0..3] of Byte; begin RadioGroup1.Items.Clear; RadioGroup1.ItemIndex := -1; Height := 50+13; Top := Top; Left := left; Show; IdUDPClient1.Host := '255.255.255.255'; IdUDPClient1.Active := true; IdUDPClient1.BroadcastEnabled := True; x[0] := $00; // Search Receivers x[1] := $00; // Search x[2] := MessageCount div $100; x[3] := MessageCount mod $100; inc(MessageCount); IdUDPClient1.Port := UDPDefaultPort; IdUDPClient1.SendBuffer(x, 4); IdUDPClient1.BroadcastEnabled := False; end; – wjvandyke Dec 03 '14 at 20:49

1 Answers1

2

That example is meant for Indy 9. For Indy 10, you have to use TIdBytes instead of a fixed array, eg:

procedure TUDPSearchForm.SearchPartner;
var
  x: TIdBytes;
begin
  RadioGroup1.Items.Clear;
  RadioGroup1.ItemIndex := -1;
  Height := 50+13;
  Top := Top;
  Left := left;
  Show;
  IdUDPClient1.Host := '255.255.255.255';
  IdUDPClient1.Active := true;
  IdUDPClient1.BroadcastEnabled := True;
  SetLength(x, 4);
  x[0] := $00; // Search Receivers
  x[1] := $00; // Search
  x[2] := MessageCount div $100;
  x[3] := MessageCount mod $100;
  inc(MessageCount);
  IdUDPClient1.Port := UDPDefaultPort;
  IdUDPClient1.SendBuffer(x);
  IdUDPClient1.BroadcastEnabled := False;
end;

You can simplify the code a little by using the Broadcast() method instead of SendBuffer():

procedure TUDPSearchForm.SearchPartner;
var
  x: TIdBytes;
begin
  RadioGroup1.Items.Clear;
  RadioGroup1.ItemIndex := -1;
  Height := 50+13;
  Top := Top;
  Left := left;
  Show;
  SetLength(x, 4);
  x[0] := $00; // Search Receivers
  x[1] := $00; // Search
  x[2] := MessageCount div $100;
  x[3] := MessageCount mod $100;
  inc(MessageCount);
  IdUDPClient1.Broadcast(x, UDPDefaultPort);
end;
Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770
  • Thanks for that. I'm getting hung up on setting the "UDPSearchForm.OnUDPRead := UDPRead;" in the TForm1.Activate. It needs a idUDPServer.TIdUDPListnerThread. – wjvandyke Dec 03 '14 at 22:43
  • And what exactly about it are you getting "hung up" on? `TIdUDPListenerThread` is declared in the `IdUDPServer` unit, same as `TUDPReadEvent`. Make sure that unit is in your `uses` clause. – Remy Lebeau Dec 03 '14 at 23:22