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也行
展开
 我来答
LifeRushing
2010-04-30 · TA获得超过786个赞
知道小有建树答主
回答量:861
采纳率:0%
帮助的人:516万
展开全部
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
}
}

这个类直接拿去用吧,命名空间改一下,里面有你想要的方法以及一些可能对你有用的方法
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
snowleung
2010-04-30 · TA获得超过192个赞
知道小有建树答主
回答量:256
采纳率:100%
帮助的人:255万
展开全部
不可以直接获取外网IP的。除非你本身就是拨号上网,没有通过家用路由器分接。

http://zhidao.baidu.com/question/149330561.html

这个问题我也回答过了%
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
快乐度小小
2012-04-12
知道答主
回答量:19
采纳率:0%
帮助的人:11.2万
展开全部
我也遇到这个问题 求解决方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式