Не только должна, но и отлично работает. Вот пример:
function TFormMain.CreateUDPServer : Boolean;
Var I : Integer;
begin
Result:=False;
IdUDPServer:=TIdUDPServer.Create;
IdUDPServer.BroadcastEnabled:=True;
IdUDPServer.OnUDPRead:=IdUDPServerUDPRead;
for I := Low(UDPPortArray) to High(UDPPortArray) do
begin
IdUDPServer.Bindings.Clear;
with IdUDPServer.Bindings.Add do
begin
IP:='0.0.0.0';
Port:=UDPPortArray[I];
end;
try
IdUDPServer.Active:=True;
except
end;
if IdUDPServer.Active then
begin
FActiveUDPPort:=IdUDPServer.Bindings.Items[0].Port;
IPMACLocalPair.Port:=IdUDPServer.Bindings.Items[0].Port;
Result:=True;
Exit;
end;
end;
FActiveUDPPort:=-1;
end;
procedure TFormMain.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
Var S : String;
begin
if (IPMACLocalPair.IP.Equals(ABinding.PeerIP)) And (IPMACLocalPair.Port=ABinding.PeerPort) then exit;
DateTimeToString(S, 'hh:nn:ss.zzz', Now);
S:=S+' '+BytesToString(AData , IndyUTF8Encoding);
S:=S+' | from '+ABinding.PeerIP+':'+ABinding.PeerPort.ToString;
Memo.Lines.Insert(0,S);
end;
На UDPPortArray не обращайте внимание, это если порт занят, то используется другой (UDPPortArray : array [0..2] of Integer = (55771, 55772, 55773);).
IdUDPServer.BroadcastEnabled:=True; тоже не нужно, если не собираетесь широковещать.
Большинство функций работы с TIdBytes доступны в юните idGlobal, как например BytesToString(AData , IndyUTF8Encoding) в моем коде.