.NET에서 인터넷 연결을 확인하는 가장 빠르고 효율적인 방법은 무엇입니까?
답변
이와 같은 것이 작동해야합니다.
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (client.OpenRead("http://google.com/generate_204"))
return true;
}
catch
{
return false;
}
}
답변
인터넷 연결이 있는지 여부를 확실하게 확인할 수있는 방법 은 없습니다 (인터넷에 액세스하는 것을 의미한다고 가정).
그러나 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;
}
답변
확인하는 대신 작업 (웹 요청, 메일, 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
인터넷 연결을 사용할 수 있는지 알 수있는 방법이 없습니다.