我在VS 2010中使用.Net 4.0。 我可以将我的机器的IP地址检索为
string hostname = Dns.getHostName();
IPHostEntry host = Dns.getHostEntry(hostname);
现在host.AddressList是一个IP地址数组。
我注意到AddressList [0]什么都没有,AddressList [1]是环回地址。我不确定其他指数。
如果我在一台机器上创建了一台服务器并且想要将其IP填充到客户端(可能只是机器),那么我应该填充哪个IP(在host.AddressList中)?使用哪个索引? 我怎么知道我是连接到局域网还是互联网,还是根本没有连接? 请澄清。
答案 0 :(得分:2)
这可能是此question的重复。
不要因为拥有有效的DNS服务器或多个IP而假设您已连接到互联网(或任何其他网络)。本地PC或路由器可能充当活动DNS,即使没有互联网连接或同一网络上的任何其他计算机也可以使用。有关可能的解决方案,请查看我上面链接的问题/答案。还有一个或两个示例只是为了检测是否存在活动的网络连接。
至于检测有效的互联网连接,我总是只是尝试在我想要连接的服务器上请求一些页面(可以与一些更新检查或新闻显示相结合),因为它可能很重要连接到某个特定的服务器(而不仅仅是一般的互联网连接)。
答案 1 :(得分:2)
有几种方法可以做到(我认为你可以使用[2]和[3]的组合)。
如果您包含对Microsoft.VisualBasic
的引用,则可以使用Microsoft.VisualBasic.Devices.Network.IsAvailable
属性来检查网络连接是否可用(以及在此条件发生更改时要通知的相关事件)。
导入API函数进行检查:
[Flags]
enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
[DllImport("WININET", CharSet=CharSet.Auto)]
static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
或者只是使用System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
函数(更好的解决方案,唯一的缺点是它仅在4.0中的客户端配置文件中受支持)。
Ping一个已知的主机名,如Google或Microsoft(这也会检查DNS)。
使用上述技术的组合(在此示例中,我使用导入的API,但您可能更喜欢另一种)。
static class NetworkHelpers
{
public static bool IsNetworkConnectionAvailable()
{
InternetConnectionState state = InternetConnectionState.INTERNET_CONNECTION_OFFLINE;
if (!InternetGetConnectedState(ref state, 0))
return false;
if (state == InternetConnectionState.INTERNET_CONNECTION_OFFLINE)
return false;
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply reply = ping.Send(KnownHostName, PingTimeout);
return reply.Status == System.Net.NetworkInformation.IPStatus.Success;
}
catch (System.Net.NetworkInformation.PingException)
{
return false;
}
}
private const string KnownHostName = "http://www.microsoft.com";
private const int PingTimeout = 5000; // milliseconds
[Flags]
private enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
[System.Runtime.InteropServices.DllImport("WININET", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
}
答案 2 :(得分:1)
使用此功能可以轻松找到互联网连接的状态:
[DllImport("wininet.dll", Charset = Charset.auto)]
private static extern bool InternetGetConnectedSate(ref InternetConnectionState_e lpdwFlags, int dwReserved);
然后例如:
if(InternetConnectionState_e.INTERNET_CONNECTION_PROXY) != 0)
{
// do your internet stuff
}