using System.ComponentModel; using System.Net; using System.Runtime.CompilerServices; using System.Web; using Tmds.MDns; namespace robospot_camera_finder { public partial class MainForm : Form { private readonly ServiceBrowser browser = new(); private BindingList all_cameras = new(); class Camera { private IPAddress ip; private string name; public Camera(string name, IPAddress ip) { this.name = name; this.ip = ip; } public string camera_name { get { return name; } } public IPAddress camera_ip { get { return ip; } } } public MainForm() { InitializeComponent(); browser.StartBrowse("_rtsp._tcp"); lbMain.DataSource = all_cameras; lbMain.DisplayMember = "camera_name"; lbMain.ValueMember = "camera_ip"; browser.ServiceAdded += (sender, args) => { foreach (var cam_addr in args.Announcement.Addresses) { if (cam_addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { Camera camera = new Camera("Camera " + cam_addr.ToString(), cam_addr); all_cameras.Add(camera); } } }; browser.ServiceRemoved += (sender, args) => { foreach (var cam_ip in args.Announcement.Addresses) { if (cam_ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { foreach (var camera in all_cameras) { if (cam_ip == camera.camera_ip) { all_cameras.Remove(camera); return; } } } } }; } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { browser.StopBrowse(); } private void lbMain_MouseDoubleClick(object sender, MouseEventArgs e) { Form viewer = new StreamViewer(lbMain.GetItemText(lbMain.SelectedItem), lbMain.SelectedValue.ToString()); viewer.Show(); } } }