using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace CommonLang.Net
{
public static class IPUtil
{
// public static IPEndPoint ToEndPoint(Uri uri)
// {
// IPAddress[] ip = Dns.GetHostAddresses(uri.Host);
// IPEndPoint ret = new IPEndPoint(ip[0], uri.Port);
// return ret;
// }
// public static IPEndPoint ToEndPoint(string host, int port)
// {
// IPAddress[] ip = Dns.GetHostAddresses(host);
// IPEndPoint ret = new IPEndPoint(ip[0], port);
// return ret;
// }
public static IPAddress ToExpectAddress(string host, AddressFamily family)
{
IPAddress[] ips = Dns.GetHostAddresses(host);
foreach (var ip in ips)
{
if (ip.AddressFamily == family)
{
return ip;
}
}
return null;
}
///
/// 用System.net.dns类中的GetHostEntry()和GetHostName()方法来建立一个本
/// 地IP地址,并且建立了一个IPHostEntry对象。用以下两句代码来获取本地IP
/// 地址
///
///
public static IPEndPoint CreateLocalConnectorEndPoint()
{
return new IPEndPoint(IPAddress.IPv6Any, 0);
}
public static IPEndPoint CreateLocalListenEndPoint(int port)
{
return new IPEndPoint(IPAddress.IPv6Any, port);
}
public static bool IsOnlyIPv6(IPHostEntry ips)
{
if (ips.AddressList.Length == 0)
{
return false;
}
foreach (var ip in ips.AddressList)
{
if (ip.AddressFamily != AddressFamily.InterNetworkV6)
{
return false;
}
}
return true;
}
public static IPAddress MapToIPv6(this IPAddress addr)
{
if (addr.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("Must pass an IPv4 address to MapToIPv6");
string ipv4str = addr.ToString();
return IPAddress.Parse("::ffff:" + ipv4str);
}
public static IPAddress MapToIPv6(this string ipv4str)
{
return IPAddress.Parse("::ffff:" + ipv4str);
}
public static bool IsIPv4MappedToIPv6(this IPAddress addr)
{
bool pass1 = addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6, pass2;
try
{
pass2 = (addr.ToString().StartsWith("0000:0000:0000:0000:0000:ffff:") ||
addr.ToString().StartsWith("0:0:0:0:0:ffff:") ||
addr.ToString().StartsWith("::ffff:")) &&
IPAddress.Parse(addr.ToString().Substring(addr.ToString().LastIndexOf(":") + 1)).AddressFamily == AddressFamily.InterNetwork;
}
catch
{
return false;
}
return pass1 && pass2;
}
}
}