С# проверка подключения к Интернету
Не могли бы вы рассказать мне, есть ли способ проверить, есть ли подключение к Интернету на моем компьютере, когда запущена моя программа на С#. Для простого примера, если интернет работает, я бы вывел окно с сообщением Internet is available
. иначе я бы вывел сообщение с сообщением Internet is unavailable
.
Без использования функции библиотеки, чтобы узнать, доступна ли сеть (так как это не проверяет подключение к Интернету)
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Или не открывая веб-страницу и не проверяя, возвращают ли она данные
using (WebClient client = new WebClient())
htmlCode = client.DownloadString("http://google.com");
Потому что оба этих метода не соответствуют моим потребностям.
Ответы
Ответ 1
немного более короткая версия:
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
catch
{
return false;
}
}
Другой вариант:
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) {
// presumably online
}
Вы можете найти более широкое обсуждение здесь
Ответ 2
Рассмотрим следующий фрагмент кода...
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)
{
// presumably online
}
Удачи!
Ответ 3
просто написал async-функции для этого:
private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
if (e.Cancelled)
return;
if (e.Error != null)
return;
if (e.Reply.Status == IPStatus.Success)
{
//ok connected to internet, do something...
}
}
private void checkInternet()
{
Ping myPing = new Ping();
myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
try
{
myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
}
catch
{
}
}
Ответ 4
Теперь мой класс NetworkMonitor предоставляет (на основе других ответов здесь):
public bool IsInternetAvailable
{
get { return IsNetworkAvailable && _CanPingGoogle(); }
}
private static bool _CanPingGoogle()
{
const int timeout = 1000;
const string host = "google.com";
var ping = new Ping();
var buffer = new byte[32];
var pingOptions = new PingOptions();
try {
var reply = ping.Send(host, timeout, buffer, pingOptions);
return (reply != null && reply.Status == IPStatus.Success);
}
catch (Exception) {
return false;
}
}
Ответ 5
Это мой подход;
- Убедитесь, что сетевое соединение доступно, если это не так, мы не сможем подключиться к другому хосту.
-
Проверьте, можем ли мы подключиться к некоторым основным узлам. Используйте резервную копию только в том случае, если сайт недоступен.
public static bool ConnectToInternet(int timeout_per_host_millis = 1000, string[] hosts_to_ping = null)
{
bool network_available = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
if (network_available)
{
string[] hosts = hosts_to_ping ?? new string[] { "www.google.com", "www.facebook.com" };
Ping p = new Ping();
foreach (string host in hosts)
{
try
{
PingReply r = p.Send(host, timeout_per_host_millis);
if (r.Status == IPStatus.Success)
return true;
}
catch { }
}
}
return false;
}
Примечания:
- Не используйте слишком много хостов при достижении цели, взвесьте стоимость во время выполнения всех попыток с уменьшающейся вероятностью успеха.
- Если мы отправим запрос на определенный хост, на который мы намерены подключиться позже (например, HTTP-запрос), возвращаемый пинг не означает, что мы подключены к этому конкретному хосту. Подумайте, что произойдет, если хост заблокирован. например, Facebook заблокирован в Иране, Китае,... Идет ли этот ISP пинг?
- DNS-запрос не будет достаточным, поскольку он может быть кэширован
Ответ 6
public static bool HasConnection()
{
try
{
System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
return true;
}
catch
{
return false;
}
}