Cách nhanh nhất và hiệu quả nhất để kiểm tra kết nối Internet trong .NET là gì?
Windows NLM API
nên là tốt nhất cho việc này stackoverflow.com/questions/5405895/
Cách nhanh nhất và hiệu quả nhất để kiểm tra kết nối Internet trong .NET là gì?
Windows NLM API
nên là tốt nhất cho việc này stackoverflow.com/questions/5405895/
Câu trả lời:
Một cái gì đó như thế này sẽ làm việc.
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
ở Trung Quốc chẳng hạn ...
Hoàn toàn không có cách nào bạn có thể kiểm tra một cách đáng tin cậy nếu có kết nối internet hay không (tôi giả sử bạn có nghĩa là truy cập internet).
Tuy nhiên, bạn có thể yêu cầu các tài nguyên hầu như không bao giờ ngoại tuyến, như ping google.com hoặc một cái gì đó tương tự. Tôi nghĩ rằng điều này sẽ có hiệu quả.
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
hoặc 8.8.4.4
) hoạt động tốt với tôi.
Beware - many schools and offices block the ping protocol.
Nếu bạn đang sử dụng phương pháp này cho một ứng dụng sẽ được sử dụng bởi khách hàng, tôi sẽ khuyên bạn nên chống lại phương pháp kiểm tra internet này
Thay vì kiểm tra, chỉ cần thực hiện hành động (yêu cầu web, thư, ftp, v.v.) và sẵn sàng cho yêu cầu thất bại, dù sao bạn cũng phải làm, ngay cả khi kiểm tra của bạn thành công.
Hãy xem xét những điều sau đây:
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
Nếu mạng ngừng hoạt động, hành động của bạn sẽ thất bại nhanh như ping, v.v.
1 - start to perform action
2 - if the net is down(or goes down) the action will fail
NetworkInterface.GetIsNetworkAvailable
là rất không đáng tin cậy. Chỉ cần có một số kết nối VMware hoặc LAN khác và nó sẽ trả về kết quả sai. Ngoài ra về Dns.GetHostEntry
phương pháp tôi chỉ quan tâm đến việc liệu URL thử nghiệm có thể bị chặn trong môi trường nơi ứng dụng của tôi sẽ triển khai hay không.
Vì vậy, một cách khác tôi phát hiện ra là sử dụng InternetGetConnectedState
phương pháp. Mã của tôi là
[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);
}
Một thử nghiệm cho kết nối internet bằng cách ping Google:
new Ping().Send("www.google.com.mx").Status == IPStatus.Success
Tôi không đồng ý với những người nêu rõ: "Điểm nào trong việc kiểm tra kết nối trước khi thực hiện một nhiệm vụ, vì ngay sau khi kiểm tra kết nối có thể bị mất". Chắc chắn có một mức độ không chắc chắn trong nhiều nhiệm vụ lập trình mà chúng tôi là nhà phát triển đảm nhận, nhưng việc giảm độ không chắc chắn xuống mức chấp nhận là một phần của thách thức.
Gần đây tôi gặp phải vấn đề này khi tạo một ứng dụng bao gồm tính năng ánh xạ được liên kết với máy chủ gạch trực tuyến. Chức năng này đã bị vô hiệu hóa khi thiếu kết nối internet.
Một số phản hồi trên trang này là rất tốt, tuy nhiên đã gây ra nhiều vấn đề về hiệu suất như treo, chủ yếu trong trường hợp không có kết nối.
Đây là giải pháp mà tôi đã kết thúc bằng cách sử dụng, với sự giúp đỡ của một số câu trả lời này và các đồng nghiệp của tôi:
// 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
}));
}
}
Tôi đã thấy tất cả các tùy chọn được liệt kê ở trên và tùy chọn khả thi duy nhất để kiểm tra khô héo internet có sẵn hay không là tùy chọn "Ping". Nhập [DllImport("Wininet.dll")]
và System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
Hoặc bất kỳ biến thể nào khác của NetworkInterface
lớp không hoạt động tốt trong việc phát hiện tính khả dụng của mạng. Các phương thức này chỉ kiểm tra xem cáp mạng có được cắm hay không.
"Tùy chọn Ping"
if
(Kết nối có sẵn) trả về true
if
(Kết nối không khả dụng và cáp mạng được cắm) trả về false
if
(Cáp mạng không được cắm) Throws an exception
NetworkInterface
if
(Internet có sẵn) Trả về True
if
(Internet không khả dụng và Cáp mạng đã được cắm) Trả về True
if
(Cáp mạng không được cắm) trả về false
[DLLImport ("Wininet.dll")]
if
(Internet có sẵn) Trả về True
if
(Internet không khả dụng và Cáp mạng đã được cắm) Trả về True
if
(Cáp mạng không được cắm) trả về false
Vì vậy, trong trường hợp [DllImport("Wininet.dll")]
và NetworkInterface
Không có cách nào để biết nếu kết nối internet có sẵn.
Không giải quyết vấn đề mạng đi xuống giữa việc kiểm tra và chạy mã của bạn nhưng khá đáng tin cậy
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;
}
Ping Google.com giới thiệu một phụ thuộc độ phân giải DNS. Pinging 8.8.8.8 vẫn ổn nhưng Google cách tôi vài bước. Tất cả những gì tôi cần làm là ping thứ gần nhất với tôi trên internet.
Tôi có thể sử dụng tính năng TTL của Ping để ping hop # 1, sau đó hop # 2, v.v., cho đến khi tôi nhận được câu trả lời từ một địa chỉ có thể định tuyến; nếu nút đó nằm trên một địa chỉ có thể định tuyến thì nó nằm trên internet. Đối với hầu hết chúng ta, hop # 1 sẽ là cổng / bộ định tuyến cục bộ của chúng tôi và hop # 2 sẽ là điểm đầu tiên ở phía bên kia của kết nối sợi quang của chúng tôi hoặc bất cứ điều gì.
Mã này hoạt động với tôi và phản hồi nhanh hơn một số đề xuất khác trong chủ đề này bởi vì nó đang ping bất cứ thứ gì gần tôi nhất trên internet.
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;
}
}
}
Đây là cách nó được thực hiện trong Android.
Để chứng minh khái niệm, tôi đã dịch mã này sang 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;
}
}
Một tùy chọn khác là API Trình quản lý danh sách mạng có sẵn cho Vista và Windows 7. Bài viết MSDN tại đây . Trong bài viết là một liên kết để tải xuống các mẫu mã cho phép bạn làm điều này:
AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());
Đảm bảo thêm một tham chiếu đến Thư viện loại 1.0 Danh sách mạng từ tab COM ... sẽ hiển thị dưới dạng NETWORKLIST.
Cố gắng tránh kiểm tra các kết nối bằng cách bắt ngoại lệ. bởi vì chúng tôi thực sự mong đợi rằng đôi khi chúng tôi có thể mất kết nối mạng.
if (NetworkInterface.GetIsNetworkAvailable() &&
new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
//is online
else
//is offline
Nếu bạn muốn thông báo cho người dùng / thực hiện hành động bất cứ khi nào thay đổi mạng / kết nối xảy ra.
Sử dụng API NLM:
Cá nhân tôi thấy câu trả lời của Anton và moffeltje là tốt nhất, nhưng tôi đã thêm một kiểm tra để loại trừ các mạng ảo được thiết lập bởi VMWare và những người khác.
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
vẫn đúng ngay cả khi mạng không được kết nối với internet.
Phiên bản đa luồng của ping:
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";
}
}
}
Tôi sẽ không nghĩ rằng điều đó là không thể, chỉ là không đơn giản.
Tôi đã xây dựng một cái gì đó như thế này, và vâng, nó không hoàn hảo, nhưng bước đầu tiên là điều cần thiết: kiểm tra xem có kết nối mạng nào không. Windows Api không làm tốt công việc, vậy tại sao không làm tốt hơn?
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;
}
Điều này khá đơn giản, nhưng nó thực sự giúp cải thiện chất lượng kiểm tra, đặc biệt là khi bạn muốn kiểm tra các cấu hình proxy khác nhau.
Vì thế:
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;
}
}
Sử dụng NetworkMonitor để theo dõi trạng thái mạng và kết nối internet.
Mẫu vật:
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");
}
}
}
Giới thiệu
Trong một số trường hợp, bạn cần kiểm tra xem internet có khả dụng hay không sử dụng mã C # trong các ứng dụng Windows. Có thể tải xuống hoặc tải lên một tệp bằng internet ở dạng cửa sổ hoặc để lấy một số dữ liệu từ cơ sở dữ liệu ở vị trí xa, trong những tình huống này, việc kiểm tra internet là bắt buộc.
Có một số cách để kiểm tra tính khả dụng của internet bằng C # từ mã phía sau. Tất cả các cách như vậy được giải thích ở đây bao gồm cả những hạn chế của họ.
API 'wininet' có thể được sử dụng để kiểm tra hệ thống cục bộ có kết nối internet hoạt động hay không. Không gian tên được sử dụng cho điều này là 'System.R.78.InteropService' và nhập dll 'wininet.dll' bằng cách sử dụng DLLImport. Sau đó, tạo một biến boolean với extern static với tên hàm InternetGetConnectedState với hai tham số mô tả và reservedValue như trong ví dụ.
Lưu ý: Công cụ sửa đổi bên ngoài được sử dụng để khai báo một phương thức được triển khai bên ngoài. Một cách sử dụng phổ biến của công cụ sửa đổi bên ngoài là với thuộc tính DLLImport khi bạn đang sử dụng các dịch vụ Interop để gọi vào mã không được quản lý. Trong trường hợp này, phương thức cũng phải được khai báo là tĩnh.
Tiếp theo, tạo một phương thức với tên 'IsINETAv Available' là boolean. Hàm trên sẽ được sử dụng trong phương thức này trả về trạng thái internet của hệ thống cục bộ
[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;
}
}
Ví dụ sau sử dụng phương thức GetIsNetworkAv Available để xác định xem có kết nối mạng không.
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");
}
Lưu ý (Theo MSDN): Kết nối mạng được coi là khả dụng nếu bất kỳ giao diện mạng nào được đánh dấu "lên" và không phải là giao diện loopback hoặc đường hầm.
Có nhiều trường hợp thiết bị hoặc máy tính không được kết nối với mạng hữu ích nhưng vẫn được coi là khả dụng và GetIsNetworkAv Available sẽ trở lại đúng. Ví dụ: nếu thiết bị chạy ứng dụng được kết nối với mạng không dây yêu cầu proxy, nhưng proxy không được đặt, GetIsNetworkAv Available sẽ trả về đúng. Một ví dụ khác khi GetIsNetworkAv Available sẽ trở lại đúng là nếu ứng dụng đang chạy trên máy tính được kết nối với một trung tâm hoặc bộ định tuyến nơi trung tâm hoặc bộ định tuyến bị mất kết nối ngược dòng.
Các lớp Ping và PingReply cho phép một ứng dụng xác định xem một máy tính từ xa có thể truy cập qua mạng hay không bằng cách nhận phản hồi từ máy chủ. Các lớp này có sẵn trong không gian tên System.Net.NetworkIn information. Ví dụ sau đây cho thấy cách ping máy chủ.
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;
}
Lưu ý (Theo MSDN): Các ứng dụng sử dụng lớp Ping để phát hiện xem máy tính từ xa có thể truy cập được hay không. Cấu trúc liên kết mạng có thể xác định xem Ping có thể liên hệ thành công với máy chủ từ xa không. Sự hiện diện và cấu hình của proxy, thiết bị dịch địa chỉ mạng (NAT) hoặc tường lửa có thể ngăn Ping thành công. Ping thành công chỉ ra rằng máy chủ từ xa có thể được truy cập trên mạng; sự hiện diện của các dịch vụ cấp cao hơn (như máy chủ Web) trên máy chủ từ xa không được đảm bảo.
Bình luận / Gợi ý được mời. Chúc mừng mã hóa ......!
Đối với ứng dụng của tôi, chúng tôi cũng kiểm tra bằng cách tải xuống tệp nhỏ.
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;
}
Cũng thế. Một số ISP có thể sử dụng máy chủ giữa để lưu trữ tệp. Thêm tham số không sử dụng ngẫu nhiên, ví dụ. https://www.microsoft.com/favicon.ico?req=random_number Có thể ngăn chặn bộ đệm.
Tôi gặp sự cố với các phương thức đó trên Bộ định tuyến / modem 3g của mình, vì nếu internet bị ngắt kết nối, bộ định tuyến sẽ chuyển hướng trang đến trang phản hồi của nó, vì vậy bạn vẫn nhận được hơi nước và mã của bạn nghĩ rằng có internet. Táo (hoặc những người khác) có trang phân tích điểm nóng luôn trả về một phản hồi nhất định. Mẫu sau trả về phản hồi "Thành công". Vì vậy, bạn sẽ chắc chắn chính xác rằng bạn có thể kết nối internet và nhận được phản hồi thực sự!
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;
}
Tôi có ba bài kiểm tra cho một kết nối Internet.
System.Net
vàSystem.Net.Sockets
Kiểm tra 1
public bool IsOnlineTest1()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
Kiểm tra 2
public bool IsOnlineTest2()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
Bài kiểm tra 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;
}
}
Thực hiện các bài kiểm tra
Nếu bạn thực hiện một Dictionary
số String
và Boolean
gọi CheckList
, bạn có thể thêm các kết quả của mỗi bài kiểm tra để CheckList
.
Bây giờ, lặp lại qua từng KeyValuePair
bằng cách sử dụng một for...each
vòng lặp.
Nếu CheckList
có chứa một Value
số true
, sau đó bạn biết có một kết nối Internet.
public static bool HasConnection()
{
try
{
System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
return true;
}
catch
{
return false;
}
}
Nó hoạt động