|
|
|
|
using System;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Net.NetworkInformation;
|
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel.Network
|
|
|
|
|
{
|
|
|
|
|
public static class NetUtils
|
|
|
|
|
{
|
|
|
|
|
public static bool PingHost(string hostUri, int portNumber)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var client = new TcpClient(hostUri, portNumber))
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool TestConnection(string host, int port, int timeout = 100)
|
|
|
|
|
{
|
|
|
|
|
var hostEntry = Dns.GetHostEntry(host);
|
|
|
|
|
if (hostEntry.AddressList.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
var ip = hostEntry.AddressList[0];
|
|
|
|
|
return TestConnection(new IPEndPoint(ip, port), timeout);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool TestConnection(IPEndPoint endpoint, int timeout = 100)
|
|
|
|
|
{
|
|
|
|
|
if (endpoint == null) return false;
|
|
|
|
|
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
|
|
|
|
|
{
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, false);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoChecksum, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseUnicastPort, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 100);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, true);
|
|
|
|
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, false);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
IAsyncResult result = socket.BeginConnect(endpoint, null, null);
|
|
|
|
|
bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
|
|
|
|
|
if (socket.Connected)
|
|
|
|
|
{
|
|
|
|
|
socket.EndConnect(result);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
socket.Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int Compare(this IPEndPoint x, IPEndPoint y)
|
|
|
|
|
{
|
|
|
|
|
if (x == null && y == null) return 0;
|
|
|
|
|
if (x == null) return 1;
|
|
|
|
|
if (y == null) return -1;
|
|
|
|
|
|
|
|
|
|
var xx = x.Address.ToString();
|
|
|
|
|
var yy = y.Address.ToString();
|
|
|
|
|
var result = string.CompareOrdinal(xx, yy);
|
|
|
|
|
return result == 0 ? x.Port.CompareTo(y.Port) : result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int Compare(this IPAddress x, IPAddress y)
|
|
|
|
|
{
|
|
|
|
|
if (x == null && y == null) return 0;
|
|
|
|
|
if (x == null) return 1;
|
|
|
|
|
if (y == null) return -1;
|
|
|
|
|
|
|
|
|
|
var xx = x.ToString();
|
|
|
|
|
var yy = y.ToString();
|
|
|
|
|
return string.CompareOrdinal(xx, yy);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static IPEndPoint CreateIPEndPoint(string endPoint)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrWhiteSpace(endPoint)) return null;
|
|
|
|
|
|
|
|
|
|
string[] ep = endPoint.Split(':');
|
|
|
|
|
if (ep.Length < 2) throw new FormatException("Invalid endpoint format");
|
|
|
|
|
IPAddress ip;
|
|
|
|
|
if (ep.Length > 2)
|
|
|
|
|
{
|
|
|
|
|
if (!IPAddress.TryParse(string.Join(":", ep, 0, ep.Length - 1), out ip))
|
|
|
|
|
{
|
|
|
|
|
throw new FormatException("Invalid ip-adress");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!IPAddress.TryParse(ep[0], out ip))
|
|
|
|
|
{
|
|
|
|
|
throw new FormatException("Invalid ip-adress");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int port;
|
|
|
|
|
if (!int.TryParse(ep[ep.Length - 1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
|
|
|
|
|
{
|
|
|
|
|
throw new FormatException("Invalid port");
|
|
|
|
|
}
|
|
|
|
|
return new IPEndPoint(ip, port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int GetFreeTcpPort()
|
|
|
|
|
{
|
|
|
|
|
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
|
|
|
|
|
l.Start();
|
|
|
|
|
int port = ((IPEndPoint)l.LocalEndpoint).Port;
|
|
|
|
|
l.Stop();
|
|
|
|
|
l = null;
|
|
|
|
|
return port;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static IPAddress GetNonLoopbackAddress(bool ignore_virtual_devices = true, bool ignore_docker_devices = true)
|
|
|
|
|
{
|
|
|
|
|
if (NetworkInterface.GetIsNetworkAvailable())
|
|
|
|
|
{
|
|
|
|
|
foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())
|
|
|
|
|
{
|
|
|
|
|
if (adapter.OperationalStatus == OperationalStatus.Up)
|
|
|
|
|
{
|
|
|
|
|
if (ignore_virtual_devices && (adapter.Description.IndexOf("Virtual", StringComparison.OrdinalIgnoreCase) >= 0 || adapter.Name.IndexOf("Virtual", StringComparison.OrdinalIgnoreCase) >= 0))
|
|
|
|
|
continue;
|
|
|
|
|
if (ignore_docker_devices && (adapter.Description.IndexOf("Docker", StringComparison.OrdinalIgnoreCase) >= 0 || adapter.Name.IndexOf("Docker", StringComparison.OrdinalIgnoreCase) >= 0))
|
|
|
|
|
continue;
|
|
|
|
|
if (adapter.NetworkInterfaceType != NetworkInterfaceType.Ethernet)
|
|
|
|
|
continue;
|
|
|
|
|
foreach (UnicastIPAddressInformation address in adapter.GetIPProperties().UnicastAddresses)
|
|
|
|
|
{
|
|
|
|
|
if (address.Address.AddressFamily == AddressFamily.InterNetwork)
|
|
|
|
|
{
|
|
|
|
|
if (!IPAddress.IsLoopback(address.Address))
|
|
|
|
|
{
|
|
|
|
|
return address.Address;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|