using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; namespace ScreenLogicConnect { public class FindUnits { public static readonly byte[] broadcastData = new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, }; protected const short multicastPort = 1444; private Socket searchSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); public static async Task> Find() { var units = new List(); using (var udpClient = new UdpClient(new IPEndPoint(GetMyIP(), 53112)) { EnableBroadcast = true, MulticastLoopback = false, }) { await udpClient.SendAsync(broadcastData, broadcastData.Length, new IPEndPoint(IPAddress.Broadcast, multicastPort)); var buf = await udpClient.ReceiveAsync(); var findServerResponse = new EasyTouchUnit(buf); if (findServerResponse.isValid) { units.Add(findServerResponse); } } return units; } public static IPAddress GetMyIP() { IPAddress localIP; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) { socket.Connect("8.8.8.8", 65530); IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; localIP = endPoint.Address; } return localIP; } } }