
C# 获取本机外网IP
我想获取本机的外网IP(桌面应用程序)Dns类里有个GetHostEntry方法能获取IP!但是获取的是个列表,里面有外网IP,也有内网ip!我试着把内网IP过滤掉(有1...
我想获取本机的外网IP(桌面应用程序)
Dns类里有个GetHostEntry方法能获取IP!
但是获取的是个列表,里面有外网IP,也有内网ip!
我试着把内网IP过滤掉(有10开头的,192.168开头,172.16-172.31开头)
可是又蹦出一个169.254开头的本地IP!
我不想用过滤了,感觉不太保险!
怎么直接获取本机的外网IP?用windows Api也行 展开
Dns类里有个GetHostEntry方法能获取IP!
但是获取的是个列表,里面有外网IP,也有内网ip!
我试着把内网IP过滤掉(有10开头的,192.168开头,172.16-172.31开头)
可是又蹦出一个169.254开头的本地IP!
我不想用过滤了,感觉不太保险!
怎么直接获取本机的外网IP?用windows Api也行 展开
展开全部
using System;
using System.Runtime.InteropServices ;
using System.Collections.Generic ;
using System.Net ;
using System.Net.Sockets ;
using System.IO ;
using ESBasic.Helpers ;
using ESBasic.Network.Tcp;
namespace ESBasic.Network
{
/// <summary>
/// NetHelper 。
/// </summary>
public static class NetHelper
{
#region IsPublicIPAddress
public static bool IsPublicIPAddress(string ip)
{
if(ip.StartsWith("10.")) //A类 10.0.0.0到10.255.255.255.255
{
return false ;
}
if(ip.StartsWith("172."))//B类 172.16.0.0到172.31.255.255
{
if(ip.Substring(6 ,1) == ".")
{
int secPart = int.Parse(ip.Substring(4 ,2)) ;
if((16 <= secPart) && (secPart <= 31) )
{
return false ;
}
}
}
if(ip.StartsWith("192.168."))//C类 192.168.0.0到192.168.255.255
{
return false ;
}
return true ;
}
#endregion
#region ReceiveData
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(NetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelper.ReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(NetworkStream stream ,byte[] buff ,int offset ,int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = stream.Read(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(ISafeNetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelper.ReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(ISafeNetworkStream stream, byte[] buff, int offset, int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = stream.Read(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
#endregion
#region GetRemotingHanler
//前提是已经注册了remoting通道
public static object GetRemotingHanler(string channelTypeStr ,string ip ,int port ,string remotingServiceName ,Type destInterfaceType)
{
try
{
string remoteObjUri = string.Format("{0}://{1}:{2}/{3}" ,channelTypeStr ,ip ,port ,remotingServiceName) ;
return Activator.GetObject(destInterfaceType ,remoteObjUri);
}
catch
{
return null ;
}
}
#endregion
#region GetLocalIp
/// <summary>
/// GetLocalIp 获取本机的IP地址
/// </summary>
public static IPAddress[] GetLocalIp()
{
string hostName = Dns.GetHostName() ;
IPHostEntry hEntry = Dns.Resolve(hostName) ;
return hEntry.AddressList ;
}
public static IPAddress GetFirstLocalIp()
{
string hostName = Dns.GetHostName();
IPHostEntry hEntry = Dns.Resolve(hostName);
return hEntry.AddressList[0];
}
/// <summary>
/// GetLocalPublicIp 获取本机的公网IP地址
/// </summary>
public static string GetLocalPublicIp()
{
IPAddress[] list = NetHelper.GetLocalIp();
foreach(IPAddress ip in list)
{
if(NetHelper.IsPublicIPAddress(ip.ToString()))
{
return ip.ToString() ;
}
}
return null ;
}
#endregion
#region IsConnectedToInternet
/// <summary>
/// IsConnectedToInternet 机器是否联网
/// </summary>
public static bool IsConnectedToInternet()
{
int Desc=0;
return InternetGetConnectedState(Desc,0);
}
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(int Description,int ReservedValue);
#endregion
#region GetMacAddress 获取网卡mac地址
/// <summary>
/// GetMacAddress 获取本机所有网卡的Mac地址
/// </summary>
public static IList<string> GetMacAddress()
{
return MachineHelper.GetMacAddress();
}
#endregion
#region DownLoadFileFromUrl
/// <summary>
/// DownLoadFileFromUrl 将url处的文件下载到本地
/// </summary>
public static void DownLoadFileFromUrl(string url ,string saveFilePath)
{
FileStream fstream = new FileStream(saveFilePath ,FileMode.Create ,FileAccess.Write);
WebRequest wRequest = WebRequest.Create(url);
try
{
WebResponse wResponse = wRequest.GetResponse();
int contentLength =(int)wResponse.ContentLength;
byte[] buffer = new byte[1024];
int read_count = 0 ;
int total_read_count = 0 ;
bool complete = false;
while (!complete )
{
read_count = wResponse.GetResponseStream().Read(buffer,0,buffer.Length);
if(read_count > 0)
{
fstream.Write(buffer ,0 ,read_count) ;
total_read_count += read_count ;
}
else
{
complete = true ;
}
}
fstream.Flush() ;
}
finally
{
fstream.Close() ;
wRequest = null;
}
}
#endregion
}
}
这个类直接拿去用吧,命名空间改一下,里面有你想要的方法以及一些可能对你有用的方法
using System.Runtime.InteropServices ;
using System.Collections.Generic ;
using System.Net ;
using System.Net.Sockets ;
using System.IO ;
using ESBasic.Helpers ;
using ESBasic.Network.Tcp;
namespace ESBasic.Network
{
/// <summary>
/// NetHelper 。
/// </summary>
public static class NetHelper
{
#region IsPublicIPAddress
public static bool IsPublicIPAddress(string ip)
{
if(ip.StartsWith("10.")) //A类 10.0.0.0到10.255.255.255.255
{
return false ;
}
if(ip.StartsWith("172."))//B类 172.16.0.0到172.31.255.255
{
if(ip.Substring(6 ,1) == ".")
{
int secPart = int.Parse(ip.Substring(4 ,2)) ;
if((16 <= secPart) && (secPart <= 31) )
{
return false ;
}
}
}
if(ip.StartsWith("192.168."))//C类 192.168.0.0到192.168.255.255
{
return false ;
}
return true ;
}
#endregion
#region ReceiveData
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(NetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelper.ReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(NetworkStream stream ,byte[] buff ,int offset ,int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = stream.Read(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(ISafeNetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelper.ReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(ISafeNetworkStream stream, byte[] buff, int offset, int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = stream.Read(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
#endregion
#region GetRemotingHanler
//前提是已经注册了remoting通道
public static object GetRemotingHanler(string channelTypeStr ,string ip ,int port ,string remotingServiceName ,Type destInterfaceType)
{
try
{
string remoteObjUri = string.Format("{0}://{1}:{2}/{3}" ,channelTypeStr ,ip ,port ,remotingServiceName) ;
return Activator.GetObject(destInterfaceType ,remoteObjUri);
}
catch
{
return null ;
}
}
#endregion
#region GetLocalIp
/// <summary>
/// GetLocalIp 获取本机的IP地址
/// </summary>
public static IPAddress[] GetLocalIp()
{
string hostName = Dns.GetHostName() ;
IPHostEntry hEntry = Dns.Resolve(hostName) ;
return hEntry.AddressList ;
}
public static IPAddress GetFirstLocalIp()
{
string hostName = Dns.GetHostName();
IPHostEntry hEntry = Dns.Resolve(hostName);
return hEntry.AddressList[0];
}
/// <summary>
/// GetLocalPublicIp 获取本机的公网IP地址
/// </summary>
public static string GetLocalPublicIp()
{
IPAddress[] list = NetHelper.GetLocalIp();
foreach(IPAddress ip in list)
{
if(NetHelper.IsPublicIPAddress(ip.ToString()))
{
return ip.ToString() ;
}
}
return null ;
}
#endregion
#region IsConnectedToInternet
/// <summary>
/// IsConnectedToInternet 机器是否联网
/// </summary>
public static bool IsConnectedToInternet()
{
int Desc=0;
return InternetGetConnectedState(Desc,0);
}
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(int Description,int ReservedValue);
#endregion
#region GetMacAddress 获取网卡mac地址
/// <summary>
/// GetMacAddress 获取本机所有网卡的Mac地址
/// </summary>
public static IList<string> GetMacAddress()
{
return MachineHelper.GetMacAddress();
}
#endregion
#region DownLoadFileFromUrl
/// <summary>
/// DownLoadFileFromUrl 将url处的文件下载到本地
/// </summary>
public static void DownLoadFileFromUrl(string url ,string saveFilePath)
{
FileStream fstream = new FileStream(saveFilePath ,FileMode.Create ,FileAccess.Write);
WebRequest wRequest = WebRequest.Create(url);
try
{
WebResponse wResponse = wRequest.GetResponse();
int contentLength =(int)wResponse.ContentLength;
byte[] buffer = new byte[1024];
int read_count = 0 ;
int total_read_count = 0 ;
bool complete = false;
while (!complete )
{
read_count = wResponse.GetResponseStream().Read(buffer,0,buffer.Length);
if(read_count > 0)
{
fstream.Write(buffer ,0 ,read_count) ;
total_read_count += read_count ;
}
else
{
complete = true ;
}
}
fstream.Flush() ;
}
finally
{
fstream.Close() ;
wRequest = null;
}
}
#endregion
}
}
这个类直接拿去用吧,命名空间改一下,里面有你想要的方法以及一些可能对你有用的方法

2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也遇到这个问题 求解决方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |