using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net; using System.Net.Sockets; namespace ScreenConnect; public static class NetworkExtensions { public static bool TryParseIPAddress([NotNullWhen(true)] string? ipAddressString, [NotNullWhen(true)] out IPAddress? ipAddress) { if (ipAddressString != null && IPAddress.TryParse(ipAddressString, out ipAddress)) { return true; } ipAddress = null; return false; } public static IPAddress? TryParseIPAddress(string? ipAddressString) { TryParseIPAddress(ipAddressString, out IPAddress ipAddress); return ipAddress; } public static IPAddress[] GetIPAddresses(string hostOrIPAddressString) { if (TryParseIPAddress(hostOrIPAddressString, out IPAddress ipAddress)) { return new IPAddress[1] { ipAddress }; } return Dns.GetHostEntry(hostOrIPAddressString).AddressList; } public static IPAddress GetIPAddress(string hostOrIPAddressString) { return GetIPAddresses(hostOrIPAddressString).First(); } public static void SendWakeToken(byte[] token, IPAddress fromLocalAddress) { IPEndPoint iPEndPoint = new IPEndPoint(fromLocalAddress, 12287); IPEndPoint remoteEP = new IPEndPoint(IPAddress.Broadcast, 9); using Socket socket = new Socket(iPEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp); socket.Bind(iPEndPoint); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); socket.SendTo(token, remoteEP); } public static TResult Unwrap(this Result @this) { return @this.UnwrapOrElse(delegate(SocketError it) { throw new SocketException((int)it); }); } public static bool Try(this Socket socket, Proc proc, out SocketError socketError) { return ResultExtensions.Try(delegate { proc(socket); }, (SocketException socketException) => socketException.SocketErrorCode, out socketError); } public static void ShutdownQuietly(this Socket socket) { Extensions.Try(delegate { socket?.Shutdown(SocketShutdown.Both); }); } public static void ShutdownAndDisposeQuietly(this Socket socket) { socket.ShutdownQuietly(); socket.DisposeQuietly(); } public static void DisposeFullyQuietly(this Socket socket) { Extensions.Try(delegate { ((IDisposable)socket).Dispose(); }); } }