You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.6 KiB
147 lines
4.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.Sockets;
|
|
|
|
namespace Sog
|
|
{
|
|
public static class NetUtils
|
|
{
|
|
public static string GetHostIp()
|
|
{
|
|
string hostname = Dns.GetHostName(); //得到本机名
|
|
IPHostEntry localhost = Dns.GetHostEntryAsync(hostname).Result;
|
|
|
|
foreach (IPAddress localaddr in localhost.AddressList)
|
|
{
|
|
if (IPAddress.IsLoopback(localaddr))
|
|
continue;
|
|
|
|
// 返回第一个IPv4地址
|
|
if (localaddr.AddressFamily == AddressFamily.InterNetwork)
|
|
{
|
|
return localaddr.ToString();
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 判断ip是否本机本地地址,ipv4
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static bool IsThisMachineAddress(string address)
|
|
{
|
|
try
|
|
{
|
|
if(address == "127.0.0.1" || address == "localhost")
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//System.Net.NetworkInformation.IPAddressCollection
|
|
//Console.WriteLine("NetUtils.IsThisMachineLocalIp ipaddress {0}", ipaddress);
|
|
|
|
string hostname = Dns.GetHostName();//得到本机名
|
|
if(hostname == address)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool ismatching = false;
|
|
|
|
|
|
IPHostEntry localhost = Dns.GetHostEntryAsync(hostname).Result;
|
|
|
|
foreach (IPAddress localaddr in localhost.AddressList)
|
|
{
|
|
if (localaddr.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
|
|
continue;
|
|
if (IPAddress.IsLoopback(localaddr))
|
|
continue;
|
|
|
|
string ip = localaddr.ToString();
|
|
|
|
//Console.WriteLine("NetUtils.IsThisMachineLocalIp Dns.GetHostEntryAsync ip {0} in list", ip);
|
|
|
|
if (ip == address)
|
|
{
|
|
ismatching = true;
|
|
return ismatching;
|
|
}
|
|
|
|
}
|
|
|
|
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
|
|
|
|
foreach (var network in networkInterfaces)
|
|
{
|
|
if (network.OperationalStatus != OperationalStatus.Up)
|
|
continue;
|
|
var properties = network.GetIPProperties();
|
|
if (properties.GatewayAddresses.Count == 0)
|
|
continue;
|
|
|
|
foreach (var tmpaddress in properties.UnicastAddresses)
|
|
{
|
|
if (tmpaddress.Address.AddressFamily != AddressFamily.InterNetwork)
|
|
continue;
|
|
if (IPAddress.IsLoopback(tmpaddress.Address))
|
|
continue;
|
|
|
|
string ip = tmpaddress.Address.ToString();
|
|
|
|
//Console.WriteLine("NetUtils.IsThisMachineLocalIp NetworkInterface ip {0} in list", ip);
|
|
|
|
if (ip == address)
|
|
{
|
|
ismatching = true;
|
|
return ismatching;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ismatching;
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
TraceLog.Exception(ex);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// 把ip地址转换成网络字节序(大端)的数字, 等于inet_aton
|
|
public static uint IpAddrToNum(string addr)
|
|
{
|
|
uint ipNum = 0;
|
|
var ipAddr = IPAddress.Parse(addr);
|
|
if (ipAddr != null)
|
|
{
|
|
foreach (byte b in ipAddr.GetAddressBytes())
|
|
{
|
|
ipNum = ipNum << 8;
|
|
ipNum |= b;
|
|
}
|
|
}
|
|
return ipNum;
|
|
}
|
|
|
|
// 把网络字节序(大端)的数字转换成ip地址, 等于inet_ntoa
|
|
public static string IpNumToAddr(uint ipNum)
|
|
{
|
|
byte[] ipArr = new byte[4];
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
ipArr[i] = (byte)(ipNum & 0xffff);
|
|
ipNum = ipNum >> 8;
|
|
}
|
|
return string.Format("{0}.{1}.{2}.{3}", ipArr[3], ipArr[2], ipArr[1], ipArr[0]);
|
|
}
|
|
}
|
|
}
|
|
|