You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
6.1 KiB
C#
222 lines
6.1 KiB
C#
#if DEBUG && !UNITY_WP_8_1 && !UNITY_WSA
|
|
#if !WINRT || UNITY_EDITOR
|
|
using System;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
|
|
namespace FlyingWormConsole3.LiteNetLib
|
|
{
|
|
public sealed class NetEndPoint
|
|
{
|
|
public string Host { get { return EndPoint.Address.ToString(); } }
|
|
public int Port { get { return EndPoint.Port; } }
|
|
|
|
internal readonly IPEndPoint EndPoint;
|
|
|
|
internal NetEndPoint(IPEndPoint ipEndPoint)
|
|
{
|
|
EndPoint = ipEndPoint;
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!(obj is NetEndPoint))
|
|
{
|
|
return false;
|
|
}
|
|
return EndPoint.Equals(((NetEndPoint)obj).EndPoint);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return EndPoint.ToString();
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return EndPoint.GetHashCode();
|
|
}
|
|
|
|
public NetEndPoint(string hostStr, int port)
|
|
{
|
|
IPAddress ipAddress;
|
|
if (!IPAddress.TryParse(hostStr, out ipAddress))
|
|
{
|
|
if (Socket.OSSupportsIPv6)
|
|
{
|
|
if (hostStr == "localhost")
|
|
{
|
|
ipAddress = IPAddress.IPv6Loopback;
|
|
}
|
|
else
|
|
{
|
|
ipAddress = ResolveAddress(hostStr, AddressFamily.InterNetworkV6);
|
|
}
|
|
}
|
|
if (ipAddress == null)
|
|
{
|
|
ipAddress = ResolveAddress(hostStr, AddressFamily.InterNetwork);
|
|
}
|
|
}
|
|
if (ipAddress == null)
|
|
{
|
|
throw new Exception("Invalid address: " + hostStr);
|
|
}
|
|
EndPoint = new IPEndPoint(ipAddress, port);
|
|
}
|
|
|
|
private IPAddress ResolveAddress(string hostStr, AddressFamily addressFamily)
|
|
{
|
|
#if NETCORE
|
|
var hostTask = Dns.GetHostEntryAsync(hostStr);
|
|
hostTask.Wait();
|
|
var host = hostTask.Result;
|
|
#else
|
|
var host = Dns.GetHostEntry(hostStr);
|
|
#endif
|
|
foreach (IPAddress ip in host.AddressList)
|
|
{
|
|
if (ip.AddressFamily == addressFamily)
|
|
{
|
|
return ip;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
internal long GetId()
|
|
{
|
|
byte[] addr = EndPoint.Address.GetAddressBytes();
|
|
long id = 0;
|
|
|
|
if (addr.Length == 4) //IPv4
|
|
{
|
|
id = addr[0];
|
|
id |= (long)addr[1] << 8;
|
|
id |= (long)addr[2] << 16;
|
|
id |= (long)addr[3] << 24;
|
|
id |= (long)EndPoint.Port << 32;
|
|
}
|
|
else if (addr.Length == 16) //IPv6
|
|
{
|
|
id = addr[0] ^ addr[8];
|
|
id |= (long)(addr[1] ^ addr[9]) << 8;
|
|
id |= (long)(addr[2] ^ addr[10]) << 16;
|
|
|
|
|
|
id |= (long)(addr[3] ^ addr[11]) << 24;
|
|
id |= (long)(addr[4] ^ addr[12]) << 32;
|
|
id |= (long)(addr[5] ^ addr[13]) << 40;
|
|
id |= (long)(addr[6] ^ addr[14]) << 48;
|
|
id |= (long)(Port ^ addr[7] ^ addr[15]) << 56;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
using System;
|
|
using Windows.Networking;
|
|
using Windows.Networking.Sockets;
|
|
|
|
namespace FlyingWormConsole3.LiteNetLib
|
|
{
|
|
public sealed class NetEndPoint
|
|
{
|
|
public string Host { get { return HostName.DisplayName; } }
|
|
public int Port { get; private set; }
|
|
internal readonly HostName HostName;
|
|
internal readonly string PortStr;
|
|
|
|
internal NetEndPoint(int port)
|
|
{
|
|
HostName = null;
|
|
PortStr = port.ToString();
|
|
Port = port;
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!(obj is NetEndPoint))
|
|
{
|
|
return false;
|
|
}
|
|
NetEndPoint other = (NetEndPoint) obj;
|
|
return HostName.IsEqual(other.HostName) && PortStr.Equals(other.PortStr);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return HostName.CanonicalName.GetHashCode() ^ PortStr.GetHashCode();
|
|
}
|
|
|
|
internal long GetId()
|
|
{
|
|
//Check locals
|
|
if (HostName == null)
|
|
{
|
|
return ParseIpToId("0.0.0.0");
|
|
}
|
|
|
|
if (HostName.DisplayName == "localhost")
|
|
{
|
|
return ParseIpToId("127.0.0.1");
|
|
}
|
|
|
|
//Check remote
|
|
string hostIp = string.Empty;
|
|
var task = DatagramSocket.GetEndpointPairsAsync(HostName, "0").AsTask();
|
|
task.Wait();
|
|
|
|
//IPv4
|
|
foreach (var endpointPair in task.Result)
|
|
{
|
|
hostIp = endpointPair.RemoteHostName.CanonicalName;
|
|
if (endpointPair.RemoteHostName.Type == HostNameType.Ipv4)
|
|
{
|
|
return ParseIpToId(hostIp);
|
|
}
|
|
}
|
|
|
|
//Else
|
|
return hostIp.GetHashCode() ^ Port;
|
|
}
|
|
|
|
private long ParseIpToId(string hostIp)
|
|
{
|
|
long id = 0;
|
|
string[] ip = hostIp.Split('.');
|
|
id |= long.Parse(ip[0]);
|
|
id |= long.Parse(ip[1]) << 8;
|
|
id |= long.Parse(ip[2]) << 16;
|
|
id |= long.Parse(ip[3]) << 24;
|
|
id |= (long)Port << 32;
|
|
return id;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return HostName.CanonicalName + ":" + PortStr;
|
|
}
|
|
|
|
public NetEndPoint(string hostName, int port)
|
|
{
|
|
var task = DatagramSocket.GetEndpointPairsAsync(new HostName(hostName), port.ToString()).AsTask();
|
|
task.Wait();
|
|
HostName = task.Result[0].RemoteHostName;
|
|
Port = port;
|
|
PortStr = port.ToString();
|
|
}
|
|
|
|
internal NetEndPoint(HostName hostName, string port)
|
|
{
|
|
HostName = hostName;
|
|
Port = int.Parse(port);
|
|
PortStr = port;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|