.NET에서 인터넷 연결을 확인하는 가장 빠르고 효율적인 방법은 무엇입니까?
Windows NLM API
이것에 가장 좋습니다. stackoverflow.com/questions/5405895/…
.NET에서 인터넷 연결을 확인하는 가장 빠르고 효율적인 방법은 무엇입니까?
Windows NLM API
이것에 가장 좋습니다. stackoverflow.com/questions/5405895/…
답변:
이와 같은 것이 작동해야합니다.
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (client.OpenRead("http://google.com/generate_204"))
return true;
}
catch
{
return false;
}
}
I cannot image a world where www.google.com does not return some HTML
예를 들어 중국의 @DanielVassallo ...
인터넷 연결이 있는지 여부를 확실하게 확인할 수있는 방법 은 없습니다 (인터넷에 액세스하는 것을 의미한다고 가정).
그러나 google.com 또는 이와 유사한 것을 핑하는 것과 같이 사실상 오프라인이 아닌 리소스를 요청할 수 있습니다. 나는 이것이 효율적이라고 생각합니다.
try {
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
return (reply.Status == IPStatus.Success);
}
catch (Exception) {
return false;
}
8.8.8.8
또는 8.8.4.4
)에 핑 (Ping )을 수행하면 문제가 없습니다.
Beware - many schools and offices block the ping protocol.
클라이언트가 사용할 응용 프로그램에이 방법을 사용 하는 경우 인터넷 확인 방법에 반대하는 것이 좋습니다
확인하는 대신 작업 (웹 요청, 메일, ftp 등)을 수행하고 요청이 실패 할 수 있도록 준비하십시오. 확인이 성공하더라도 어쨌든 수행해야합니다.
다음을 고려하세요:
1 - check, and it is OK
2 - start to perform action
3 - network goes down
4 - action fails
5 - lot of good your check did
네트워크가 다운되면 핑 등과 같이 빠르게 작업이 실패합니다.
1 - start to perform action
2 - if the net is down(or goes down) the action will fail
NetworkInterface.GetIsNetworkAvailable
매우 신뢰할 수 없습니다. VMware 또는 다른 LAN 연결 만 있으면 잘못된 결과가 반환됩니다. 또한 Dns.GetHostEntry
방법에 관해서는 응용 프로그램을 배포 할 환경에서 테스트 URL이 차단 될 수 있는지에 대해서만 걱정했습니다.
그래서 내가 찾은 또 다른 방법은 InternetGetConnectedState
방법을 사용 하는 것입니다. 내 코드는
[System.Runtime.InteropServices.DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
public static bool CheckNet()
{
int desc;
return InternetGetConnectedState(out desc, 0);
}
Google에 핑 (ping)을 통한 인터넷 연결 테스트 :
new Ping().Send("www.google.com.mx").Status == IPStatus.Success
"연결 확인 후 즉시 연결이 끊어 질 수 있으므로 작업을 수행하기 전에 연결 확인의 요점은 무엇입니까?"라는 의견에 동의하지 않습니다. 개발자로서 우리가 수행하는 많은 프로그래밍 작업에는 확실히 불확실성이 있지만 불확실성을 수용 수준으로 낮추는 것은 도전의 일부입니다.
최근에 온라인 타일 서버에 연결된 매핑 기능을 포함하는 응용 프로그램을 만드는 데이 문제가 발생했습니다. 인터넷 연결이 부족한 경우이 기능을 사용할 수 없습니다.
이 페이지의 일부 응답은 매우 훌륭했지만 주로 연결이없는 경우 중단과 같은 많은 성능 문제가 발생했습니다.
다음은 이러한 답변 중 일부와 동료의 도움을 받아 사용한 솔루션입니다.
// Insert this where check is required, in my case program start
ThreadPool.QueueUserWorkItem(CheckInternetConnectivity);
}
void CheckInternetConnectivity(object state)
{
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
using (WebClient webClient = new WebClient())
{
webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
webClient.Proxy = null;
webClient.OpenReadCompleted += webClient_OpenReadCompleted;
webClient.OpenReadAsync(new Uri("<url of choice here>"));
}
}
}
volatile bool internetAvailable = false; // boolean used elsewhere in code
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
internetAvailable = true;
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
// UI changes made here
}));
}
}
위에 나열된 모든 옵션을 보았으며 인터넷을 사용할 수 있는지 여부를 확인할 수있는 유일한 옵션은 "Ping"옵션입니다. 가져 오기 [DllImport("Wininet.dll")]
및 / System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
또는 NetworkInterface
클래스 의 다른 변형은 네트워크의 가용성을 감지하는 데 제대로 작동하지 않습니다. 이러한 방법은 네트워크 케이블이 연결되어 있는지 여부 만 확인합니다.
"핑 옵션"
if
(연결 가능) 반품 true
if
(연결을 사용할 수없고 네트워크 케이블이 연결되어 있음) 반환 false
if
(네트워크 케이블이 연결되어 있지 않습니다) Throws an exception
네트워크 인터페이스
if
(인터넷 이용 가능) 반품 True
if
(인터넷을 사용할 수없고 네트워크 케이블이 연결되어 있음) True
if
(네트워크 케이블이 연결되어 있지 않음) 반환 false
[DllImport ( "Wininet.dll")]
if
(인터넷 이용 가능) 반품 True
if
(인터넷을 사용할 수없고 네트워크 케이블이 연결되어 있음) True
if
(네트워크 케이블이 연결되어 있지 않음) 반환 false
그래서의 경우 [DllImport("Wininet.dll")]
와 NetworkInterface
인터넷 연결을 사용할 수 있는지 알 수있는 방법이 없습니다.
코드 확인과 실행 사이의 네트워크 다운 문제를 해결하지는 않지만 상당히 안정적입니다.
public static bool IsAvailableNetworkActive()
{
// only recognizes changes related to Internet adapters
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
// however, this will include all adapters -- filter by opstatus and activity
NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
return (from face in interfaces
where face.OperationalStatus == OperationalStatus.Up
where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback)
select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0));
}
return false;
}
Pinging google.com은 DNS 확인 종속성을 도입합니다. Pinging 8.8.8.8은 괜찮지 만 Google은 나에게서 몇 홉 떨어져 있습니다. 내가해야 할 일은 인터넷에있는 가장 가까운 것을 핑하는 것입니다.
라우팅 가능한 주소에있는 것으로부터 응답을받을 때까지 Ping의 TTL 기능을 사용하여 홉 # 1을 핑한 다음 홉 # 2 등을 사용할 수 있습니다. 해당 노드가 라우팅 가능한 주소에 있으면 인터넷에 있습니다. 우리 대부분의 경우 홉 # 1은 로컬 게이트웨이 / 라우터가되고 홉 # 2는 광섬유 연결의 다른 쪽 또는 그 밖의 첫 번째 지점이됩니다.
이 코드는 저에게 효과적이며 인터넷에서 가장 가까운 것을 핑하고 있기 때문에이 스레드의 다른 제안보다 빠르게 응답합니다.
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Diagnostics;
internal static bool ConnectedToInternet()
{
const int maxHops = 30;
const string someFarAwayIpAddress = "8.8.8.8";
// Keep pinging further along the line from here to google
// until we find a response that is from a routable address
for (int ttl = 1; ttl <= maxHops; ttl++)
{
Ping pinger = new Ping();
PingOptions options = new PingOptions(ttl, true);
byte[] buffer = new byte[32];
PingReply reply = null;
try
{
reply = pinger.Send(someFarAwayIpAddress, 10000, buffer, options);
}
catch (System.Net.NetworkInformation.PingException pingex)
{
Debug.Print("Ping exception (probably due to no network connection or recent change in network conditions), hence not connected to internet. Message: " + pingex.Message);
return false;
}
System.Diagnostics.Debug.Print("Hop #" + ttl.ToString() + " is " + (reply.Address == null ? "null" : reply.Address.ToString()) + ", " + reply.Status.ToString());
if (reply.Status != IPStatus.TtlExpired && reply.Status != IPStatus.Success)
{
Debug.Print("Hop #" + ttl.ToString() + " is " + reply.Status.ToString() + ", hence we are not connected.");
return false;
}
if (IsRoutableAddress(reply.Address))
{
System.Diagnostics.Debug.Print("That's routable so you must be connected to the internet.");
return true;
}
}
return false;
}
private static bool IsRoutableAddress(IPAddress addr)
{
if (addr == null)
{
return false;
}
else if (addr.AddressFamily == AddressFamily.InterNetworkV6)
{
return !addr.IsIPv6LinkLocal && !addr.IsIPv6SiteLocal;
}
else // IPv4
{
byte[] bytes = addr.GetAddressBytes();
if (bytes[0] == 10)
{ // Class A network
return false;
}
else if (bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31)
{ // Class B network
return false;
}
else if (bytes[0] == 192 && bytes[1] == 168)
{ // Class C network
return false;
}
else
{ // None of the above, so must be routable
return true;
}
}
}
Android에서 구현되는 방법은 다음과 같습니다 .
개념 증명으로이 코드를 C #으로 변환했습니다.
var request = (HttpWebRequest)WebRequest.Create("http://g.cn/generate_204");
request.UserAgent = "Android";
request.KeepAlive = false;
request.Timeout = 1500;
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.ContentLength == 0 && response.StatusCode == HttpStatusCode.NoContent)
{
//Connection to internet available
}
else
{
//Connection to internet not available
}
}
private bool ping()
{
System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply reply = pingSender.Send(address);
if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
{
return true;
}
else
{
return false;
}
}
또 다른 옵션은 Vista 및 Windows 7에서 사용할 수있는 네트워크 목록 관리자 API입니다. MSDN 기사는 여기를 참조 하십시오 . 이 기사에는 다음을 수행 할 수있는 코드 샘플을 다운로드하는 링크가 있습니다.
AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());
COM 탭에서 Network List 1.0 Type Library에 대한 참조를 추가하십시오. NETWORKLIST로 표시됩니다.
예외를 포착하여 연결 테스트를 피하십시오. 우리는 때때로 네트워크 연결이 끊어 질 수 있기를 기대하기 때문입니다.
if (NetworkInterface.GetIsNetworkAvailable() &&
new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
//is online
else
//is offline
네트워크 / 연결 변경이 발생할 때마다 사용자에게 알리거나 조치를 취하려는 경우.
NLM API 사용 :
나는 개인적으로 Anton와 moffeltje 의 대답을 가장 잘 찾았 지만 VMWare와 다른 사람들이 설정 한 가상 네트워크를 제외시키는 체크를 추가했습니다.
public static bool IsAvailableNetworkActive()
{
// only recognizes changes related to Internet adapters
if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return false;
// however, this will include all adapters -- filter by opstatus and activity
NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
return (from face in interfaces
where face.OperationalStatus == OperationalStatus.Up
where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback)
where (!(face.Name.ToLower().Contains("virtual") || face.Description.ToLower().Contains("virtual")))
select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0));
}
bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
if (bb == true)
MessageBox.Show("Internet connections are available");
else
MessageBox.Show("Internet connections are not available");
bb
은 네트워크가 인터넷에 연결되지 않은 경우에도 여전히 유효 하다는 것입니다.
핑의 멀티 스레드 버전 :
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;
namespace OnlineCheck
{
class Program
{
static bool isOnline = false;
static void Main(string[] args)
{
List<string> ipList = new List<string> {
"1.1.1.1", // Bad ip
"2.2.2.2",
"4.2.2.2",
"8.8.8.8",
"9.9.9.9",
"208.67.222.222",
"139.130.4.5"
};
int timeOut = 1000 * 5; // Seconds
List<Thread> threadList = new List<Thread>();
foreach (string ip in ipList)
{
Thread threadTest = new Thread(() => IsOnline(ip));
threadList.Add(threadTest);
threadTest.Start();
}
Stopwatch stopwatch = Stopwatch.StartNew();
while (!isOnline && stopwatch.ElapsedMilliseconds <= timeOut)
{
Thread.Sleep(10); // Cooldown the CPU
}
foreach (Thread thread in threadList)
{
thread.Abort(); // We love threads, don't we?
}
Console.WriteLine("Am I online: " + isOnline.ToYesNo());
Console.ReadKey();
}
static bool Ping(string host, int timeout = 3000, int buffer = 32)
{
bool result = false;
try
{
Ping ping = new Ping();
byte[] byteBuffer = new byte[buffer];
PingOptions options = new PingOptions();
PingReply reply = ping.Send(host, timeout, byteBuffer, options);
result = (reply.Status == IPStatus.Success);
}
catch (Exception ex)
{
}
return result;
}
static void IsOnline(string host)
{
isOnline = Ping(host) || isOnline;
}
}
public static class BooleanExtensions
{
public static string ToYesNo(this bool value)
{
return value ? "Yes" : "No";
}
}
}
나는 그것이 불가능하다고 생각하지 않을 것입니다.
나는 이와 같은 것을 만들었고 완벽하지는 않지만 첫 번째 단계는 필수적입니다. 네트워크 연결이 있는지 확인하는 것입니다. Windows Api는 훌륭한 작업을 수행하지 않으므로 더 나은 작업을 수행하지 않는 이유는 무엇입니까?
bool NetworkIsAvailable()
{
var all = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
foreach (var item in all)
{
if (item.NetworkInterfaceType == NetworkInterfaceType.Loopback)
continue;
if (item.Name.ToLower().Contains("virtual") || item.Description.ToLower().Contains("virtual"))
continue; //Exclude virtual networks set up by VMWare and others
if (item.OperationalStatus == OperationalStatus.Up)
{
return true;
}
}
return false;
}
매우 간단하지만 특히 다양한 프록시 구성을 확인하려는 경우 검사 품질을 향상시키는 데 실제로 도움이됩니다.
그래서:
public static bool Isconnected = false;
public static bool CheckForInternetConnection()
{
try
{
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success)
{
return true;
}
else if (reply.Status == IPStatus.TimedOut)
{
return Isconnected;
}
else
{
return false;
}
}
catch (Exception)
{
return false;
}
}
public static void CheckConnection()
{
if (CheckForInternetConnection())
{
Isconnected = true;
}
else
{
Isconnected = false;
}
}
NetworkMonitor 를 사용 하여 네트워크 상태 및 인터넷 연결을 모니터링 하십시오 .
견본:
namespace AmRoNetworkMonitor.Demo
{
using System;
internal class Program
{
private static void Main()
{
NetworkMonitor.StateChanged += NetworkMonitor_StateChanged;
NetworkMonitor.StartMonitor();
Console.WriteLine("Press any key to stop monitoring.");
Console.ReadKey();
NetworkMonitor.StopMonitor();
Console.WriteLine("Press any key to close program.");
Console.ReadKey();
}
private static void NetworkMonitor_StateChanged(object sender, StateChangeEventArgs e)
{
Console.WriteLine(e.IsAvailable ? "Is Available" : "Is Not Available");
}
}
}
소개
일부 시나리오에서는 인터넷을 사용할 수 있는지 여부를 Windows 응용 프로그램에서 C # 코드를 사용하는지 확인해야합니다. 인터넷을 사용하여 파일을 Windows 형식으로 다운로드하거나 업로드하거나 원격 위치에있는 데이터베이스에서 일부 데이터를 가져 오는 경우가 있습니다. 이러한 상황에서는 인터넷 검사가 필수입니다.
코드 뒤의 C #을 사용하여 인터넷 가용성을 확인하는 몇 가지 방법이 있습니다. 여기에는 제한 사항을 포함하여 모든 방법이 설명되어 있습니다.
'wininet'API를 사용하여 로컬 시스템의 인터넷 연결이 활성화되어 있는지 확인할 수 있습니다. 여기에 사용 된 네임 스페이스는 'System.Runtime.InteropServices'이며 DllImport를 사용하여 dll 'wininet.dll'을 가져옵니다. 그런 다음 예제와 같이 두 개의 매개 변수 description 및 reservedValue를 가진 함수 이름 InternetGetConnectedState를 사용하여 extern static으로 부울 변수를 작성하십시오.
참고 : extern 수정자는 외부에서 구현되는 메소드를 선언하는 데 사용됩니다. extern 수정 자의 일반적인 사용은 Interop 서비스를 사용하여 관리되지 않는 코드를 호출 할 때 DllImport 특성과 함께 사용됩니다. 이 경우, 메소드는 정적으로 선언되어야합니다.
그런 다음 이름이 'IsInternetAvailable'인 부울로 메소드를 작성하십시오. 위의 기능은 로컬 시스템의 인터넷 상태를 반환하는이 방법에 사용됩니다
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int description, int reservedValue);
public static bool IsInternetAvailable()
{
try
{
int description;
return InternetGetConnectedState(out description, 0);
}
catch (Exception ex)
{
return false;
}
}
다음 예제는 GetIsNetworkAvailable 메소드를 사용하여 네트워크 연결이 사용 가능한지 판별합니다.
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
System.Windows.MessageBox.Show("This computer is not connected to the internet");
}
설명 (MSDN 기준) : 네트워크 인터페이스가 "업"으로 표시되고 루프백 또는 터널 인터페이스가 아닌 경우 네트워크 연결을 사용할 수있는 것으로 간주됩니다.
장치 나 컴퓨터가 유용한 네트워크에 연결되어 있지 않지만 여전히 사용 가능한 것으로 간주되어 GetIsNetworkAvailable이 true를 반환하는 경우가 많습니다. 예를 들어 응용 프로그램을 실행하는 장치가 프록시가 필요한 무선 네트워크에 연결되어 있지만 프록시가 설정되어 있지 않으면 GetIsNetworkAvailable이 true를 반환합니다. GetIsNetworkAvailable이 true를 반환하는 또 다른 예는 허브 나 라우터가 업스트림 연결을 잃은 허브 나 라우터에 연결된 컴퓨터에서 응용 프로그램이 실행중인 경우입니다.
Ping 및 PingReply 클래스를 사용하면 응용 프로그램은 호스트로부터 응답을 얻어 네트워크를 통해 원격 컴퓨터에 액세스 할 수 있는지 여부를 결정할 수 있습니다. 이러한 클래스는 System.Net.NetworkInformation 네임 스페이스에서 사용할 수 있습니다. 다음 예는 호스트를 ping하는 방법을 보여줍니다.
protected bool CheckConnectivity(string ipAddress)
{
bool connectionExists = false;
try
{
System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
options.DontFragment = true;
if (!string.IsNullOrEmpty(ipAddress))
{
System.Net.NetworkInformation.PingReply reply = pingSender.Send(ipAddress);
connectionExists = reply.Status ==
System.Net.NetworkInformation.IPStatus.Success ? true : false;
}
}
catch (PingException ex)
{
Logger.LogException(ex.Message, ex);
}
return connectionExists;
}
설명 (MSDN 기준) : 응용 프로그램은 Ping 클래스를 사용하여 원격 컴퓨터에 연결할 수 있는지 여부를 감지합니다. 네트워크 토폴로지는 Ping이 원격 호스트에 성공적으로 접속할 수 있는지 여부를 판별 할 수 있습니다. 프록시, NAT (Network Address Translation) 장비 또는 방화벽의 존재 및 구성으로 인해 Ping이 성공하지 못할 수 있습니다. 성공적인 Ping은 네트워크에서 원격 호스트에 도달 할 수 있음을 나타냅니다. 원격 호스트에 상위 레벨 서비스 (예 : 웹 서버)가있는 것은 보장되지 않습니다.
의견 / 제안이 초대됩니다. 행복한 코딩 ......!
내 응용 프로그램의 경우 작은 파일을 다운로드하여 테스트합니다.
string remoteUri = "https://www.microsoft.com/favicon.ico"
WebClient myWebClient = new WebClient();
try
{
byte[] myDataBuffer = myWebClient.DownloadData (remoteUri);
if(myDataBuffer.length > 0) // Or add more validate. eg. checksum
{
return true;
}
}
catch
{
return false;
}
또한. 일부 ISP는 중간 서버를 사용하여 파일을 캐시 할 수 있습니다. 임의의 미사용 파라미터 추가 (예 : https://www.microsoft.com/favicon.ico?req=random_number 캐싱을 방지 할 수 있습니다.
인터넷 연결이 끊어지면 라우터가 페이지를 응답 페이지로 리디렉션하므로 코드가 인터넷에 있다고 생각하기 때문에 3g 라우터 / 모뎀에서 해당 방법에 문제가 있습니다. Apple (또는 기타)은 항상 특정 응답을 반환하는 핫스팟 결정 페이지를 가지고 있습니다. 다음 샘플은 "성공"응답을 반환합니다. 따라서 인터넷에 연결하여 실제 응답을 얻을 수있을 것입니다.
public static bool CheckForInternetConnection()
{
try
{
using (var webClient = new WebClient())
using (var stream = webClient.OpenRead("http://captive.apple.com/hotspot-detect.html"))
{
if (stream != null)
{
//return true;
stream.ReadTimeout = 1000;
using (var reader = new StreamReader(stream, Encoding.UTF8, false))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line == "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>")
{
return true;
}
Console.WriteLine(line);
}
}
}
return false;
}
}
catch
{
}
return false;
}
인터넷 연결에 대한 세 가지 테스트가 있습니다.
System.Net
및System.Net.Sockets
시험 1
public bool IsOnlineTest1()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
시험 2
public bool IsOnlineTest2()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
시험 3
public bool IsOnlineTest3()
{
System.Net.WebRequest req = System.Net.WebRequest.Create("https://www.google.com");
System.Net.WebResponse resp = default(System.Net.WebResponse);
try
{
resp = req.GetResponse();
resp.Close();
req = null;
return true;
}
catch (Exception ex)
{
req = null;
return false;
}
}
테스트 수행
당신이 한 경우 Dictionary
의를 String
하고 Boolean
전화 CheckList
, 당신은 각 테스트의 결과를 추가 할 수 있습니다 CheckList
.
이제 루프를 KeyValuePair
사용하여 각각 을 for...each
반복하십시오.
경우 CheckList
포함 Value
의 true
, 당신은 인터넷 연결이 알고있다.
public static bool HasConnection()
{
try
{
System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
return true;
}
catch
{
return false;
}
}
작동합니다