win32 API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved); 参数lpdwFlags返回当前网络状态,参数dwReserved依然是保留参数,设置为0即可。 INTERNET_CONNECTION_MODEM 通过调治解调器连接网络 INTERNET_CONNECTION_LAN 通过局域网连接网络 这个函数的功能是很强的。它可以: 1. 判断网络连接是通过网卡还是通过调治解调器 2. 是否通过代理上网 3. 判断连接是On Line还是Off Line 4. 判断是否安装“拨号网络服务” 5. 判断调治解调器是否正在使用 这个win32 API在系统system32文件夹中winInet.dll中 使用这个判断的话,需要在类中这样写: private const int INTERNET_CONNECTION_MODEM = 1; private const int INTERNET_CONNECTION_LAN = 2; [DllImport("winInet.dll")] private static extern bool InternetGetConnectedState( ref int dwFlag, int dwReserved ); //调用的方法(Winform为例,放一个按钮,单击即可): private void button1_Click(object sender, System.EventArgs e){ System.Int32 dwFlag = new int(); if(!InternetGetConnectedState(ref dwFlag, 0)) MessageBox.Show("未连网!"); else if((dwFlag & INTERNET_CONNECTION_MODEM)!=0) MessageBox.Show("采用调治解调器上网。"); else if((dwFlag & INTERNET_CONNECTION_LAN)!=0) MessageBox.Show("采用网卡上网。"); }
在C#中可以使用多种方法来判断网络的连接状态,比如使用WIN32的API来判断,也可以直接Ping某个网址来判断。
下面来介绍下我最进行写的一个判断网络连接的方法类,使用了Wine32的API函数与Ping.Send结合的方法,代码如下:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Net.NetworkInformation;
namespace TestNetConnectWin32 { public class GetInternetConStatus { private const int INTERNET_CONNECTION_MODEM = 1; private const int INTERNET_CONNECTION_LAN = 2; [DllImport("winInet.dll")] private static extern bool InternetGetConnectedState( ref int dwFlag, int dwReserved );
/// <summary> /// 判断网络的连接状态 /// </summary> /// <returns> /// 网络状态(1-->未联网;2-->采用调治解调器上网;3-->采用网卡上网) ///</returns> public static int GetNetConStatus(string strNetAddress) { int iNetStatus = 0; System.Int32 dwFlag = new int(); if (!InternetGetConnectedState(ref dwFlag, 0)) { //没有能连上互联网 iNetStatus = 1; } else if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0) { //采用调治解调器上网,需要进一步判断能否登录具体网站 if (PingNetAddress(strNetAddress)) { //可以ping通给定的网址,网络OK iNetStatus = 2; } else { //不可以ping通给定的网址,网络不OK iNetStatus = 4; } } else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0) { //采用网卡上网,需要进一步判断能否登录具体网站 if (PingNetAddress(strNetAddress)) { //可以ping通给定的网址,网络OK iNetStatus = 3; } else { //不可以ping通给定的网址,网络不OK iNetStatus = 5; } }
return iNetStatus; }
/// <summary> /// ping 具体的网址看能否ping通 /// </summary> /// <param name="strNetAdd"></param> /// <returns></returns> private static bool PingNetAddress(string strNetAdd) { bool Flage = false; Ping ping = new Ping(); try { PingReply pr = ping.Send(strNetAdd, 3000); if (pr.Status == IPStatus.TimedOut) { Flage = false; } if (pr.Status == IPStatus.Success) { Flage = true; } else { Flage = false; } } catch { Flage = false; } return Flage; }
} } //判断方法 private void btnJudge_Click(object sender, EventArgs e) { int iNetStatus = GetInternetConStatus.GetNetConStatus("baidu.com"); if (iNetStatus == 1) { lblNetStatus.Text = "网络未连接"; } else if(iNetStatus==2) { lblNetStatus.Text = "采用调治解调器上网"; } else if (iNetStatus == 3) { lblNetStatus.Text = "采用网卡上网"; } else if (iNetStatus == 4) { lblNetStatus.Text = "采用调治解调器上网,但是联不通指定网络"; } else if (iNetStatus == 5) { lblNetStatus.Text = "采用网卡上网,但是联不通指定网络"; } }
|
请发表评论