unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls, System.Threading, System.Net, System.Net.Sockets, System.Text, Borland.Vcl.ExtCtrls, System.Collections, Borland.Vcl.SyncObjs; type TForm1 = class(TForm) StartRecvButton: TButton; EndRecvButton: TButton; ListBox1: TListBox; Edit1: TEdit; Edit2: TEdit; Timer1: TTimer; procedure StartRecvButtonClick(Sender: TObject); procedure EndRecvButtonClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private th: Thread; udpserver: UdpClient; list: Hashtable; lock: TCriticalSection; procedure Execute; end; var Form1: TForm1; implementation {$R *.nfm} procedure TForm1.FormCreate(Sender: TObject); begin list := Hashtable.Create; lock := TCriticalSection.Create; end; procedure TForm1.StartRecvButtonClick(Sender: TObject); begin th := Thread.Create(Execute); th.Start; StartRecvButton.Enabled := False; EndRecvButton.Enabled := True; Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); var itr: IDictionaryEnumerator; begin ListBox1.Clear; lock.Enter; try itr := list.GetEnumerator; while itr.MoveNext do begin ListBox1.Items.Add(string(itr.Value) + ' ' + string(itr.Key)); end; finally lock.Leave; end; end; procedure TForm1.EndRecvButtonClick(Sender: TObject); begin Timer1.Enabled := False; list.Clear; ListBox1.Clear; udpserver.Close; th.Join; StartRecvButton.Enabled := True; EndRecvButton.Enabled := False; end; procedure TForm1.Execute; var ipaddr: IPAddress; mcopt: IPv6MulticastOption; remoteip: IPEndPoint; buf: TBytes; msg: string; begin // Multicast port = '10101' udpserver := UdpClient.Create(StrToInt(Edit2.Text), AddressFamily.InterNetworkV6); // Multicast address = 'ff35:40:fdb4:353a:c83f:10::10' ipaddr := IPAddress.Parse(Edit1.Text); mcopt := IPv6MulticastOption.Create(ipaddr); udpserver.JoinMulticastGroup(mcopt.InterfaceIndex, mcopt.Group); try while True do begin buf := udpserver.Receive(remoteip); if Length(buf) > 0 then begin msg := Encoding.get_ASCII.GetString(buf); lock.Enter; try list.Remove(remoteip.Address.ToString); list.Add(remoteip.Address.ToString, msg); finally lock.Leave; end; end; end; except on E: Exception do //System.Console.Out(E.StackTrace); end; end; end.