। নেট এ ইন্টারনেট সংযোগের জন্য যাচাই করার দ্রুত এবং সবচেয়ে কার্যকর উপায় কী?
Windows NLM API
এই জন্য সেরা হওয়া উচিত। stackoverflow.com/questions/5405895/…
। নেট এ ইন্টারনেট সংযোগের জন্য যাচাই করার দ্রুত এবং সবচেয়ে কার্যকর উপায় কী?
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
উদাহরণস্বরূপ চীনে @ ড্যানিয়েলভ্যাসালো ...
কোনও ইন্টারনেট সংযোগ আছে কিনা তা আপনি নির্ভরযোগ্যভাবে পরীক্ষা করতে পারবেন এমন কোনও উপায় নেই (আমি ধরে নিই যে আপনি ইন্টারনেটের অ্যাক্সেস বলতে চাইছেন)।
আপনি যাইহোক, গুগল ডটকমকে পিন করার মতো অনুরূপ এমন কোনও সংস্থার জন্য অনুরোধ করতে পারেন যা কার্যত কখনও অফলাইনে নেই। আমি মনে করি এটি দক্ষ হবে।
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
) আমার পক্ষে ভাল কাজ করে।
Beware - many schools and offices block the ping protocol.
আপনি যদি কোনও অ্যাপ্লিকেশনটির জন্য এই পদ্ধতিটি ব্যবহার করেন যা ক্লায়েন্টরা ব্যবহার করবেন আমি ইন্টারনেট চেক করার এই পদ্ধতির বিরুদ্ধে পরামর্শ দেব
যাচাইয়ের পরিবর্তে, কেবল ক্রিয়াটি সম্পাদন করুন (ওয়েব অনুরোধ, মেল, এফটিপি, ইত্যাদি) এবং অনুরোধটি ব্যর্থ হওয়ার জন্য প্রস্তুত থাকুন, যা আপনার চেক সফল হয়েছিল, এমনকি আপনাকে যা করতে হবে তা করতে হবে।
নিম্নোক্ত বিবেচনা কর:
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
নেটওয়ার্কটি ডাউন থাকলে আপনার ক্রিয়া পিং ইত্যাদির মতো দ্রুত ব্যর্থ হবে etc.
1 - start to perform action
2 - if the net is down(or goes down) the action will fail
NetworkInterface.GetIsNetworkAvailable
খুব বিশ্বাসযোগ্য না। কেবলমাত্র কিছু ভিএমওয়্যার বা অন্যান্য ল্যান সংযোগ আছে এবং এটি ভুল ফলাফল ফিরে আসবে। 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);
}
গুগলকে পিং করে ইন্টারনেট সংযোগের জন্য একটি পরীক্ষা:
new Ping().Send("www.google.com.mx").Status == IPStatus.Success
আমি যারা বলছেন তাদের সাথে আমি একমত নই: "কোনও কাজ সম্পাদনের আগে কানেক্টিভিটির জন্য যাচাই করার অর্থ কী, চেক করার সাথে সাথেই সংযোগটি নষ্ট হয়ে যেতে পারে"। বিকাশকারী হিসাবে আমরা অনেক প্রোগ্রামিংয়ের কাজগুলিতে অবশ্যই কিছুটা অনিশ্চয়তা রয়েছি, তবে গ্রহণযোগ্যতার স্তরে অনিশ্চয়তা হ্রাস করা চ্যালেঞ্জের অংশ।
আমি সম্প্রতি একটি অ্যাপ্লিকেশন তৈরি করতে এই সমস্যায় পড়েছি যা একটি ম্যাপিং বৈশিষ্ট্য যা একটি অন-লাইনের টাইল সার্ভারের সাথে যুক্ত রয়েছে including এই কার্যকারিতাটি অক্ষম করতে হবে যেখানে ইন্টারনেট সংযোগের অভাব উল্লেখ করা হয়েছিল।
এই পৃষ্ঠায় কিছু প্রতিক্রিয়া খুব ভাল ছিল, তবে তবে মূলত সংযোগের অভাবে ক্ষেত্রে ঝুলিয়ে দেওয়ার মতো পারফরম্যান্সের অনেকগুলি সমস্যার কারণ ঘটেছে।
এর কয়েকটি উত্তর এবং আমার সহকর্মীদের সহায়তায় আমি এখানে সমাধানটি শেষ করেছিলাম:
// 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
}));
}
}
আমি উপরে তালিকাভুক্ত সমস্ত অপশন দেখেছি এবং ইন্টারনেট পাওয়া যায় কিনা তা পরীক্ষা করার একমাত্র কার্যকর বিকল্পটি হল "পিং" বিকল্প। আমদানি [DllImport("Wininet.dll")]
এবং System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
বা NetworkInterface
শ্রেণীর অন্য কোনও প্রকারের নেটওয়ার্কের উপলব্ধতা সনাক্তকরণে ভাল কাজ করে না se এই পদ্ধতিগুলি কেবল কেবল কেবল কেবল তারের প্লাগ ইন করা হয়েছে কিনা তা পরীক্ষা করে।
"পিং বিকল্প"
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;
}
পিংিং google.com একটি ডিএনএস রেজোলিউশন নির্ভরতা প্রবর্তন করে। ৮.৮.৮.৮ পিং করা ঠিক আছে তবে গুগল আমার থেকে বেশ কিছু দূরে। আমাকে যা করতে হবে তা হ'ল ইন্টারনেটে আমার কাছে নিকটতম জিনিসটি পিং করা is
আমি পিংয়ের টিটিএল বৈশিষ্ট্যটি পিং হপ # 1, তারপরে হপ # 2 ইত্যাদি ইত্যাদিতে ব্যবহার করতে পারি, যতক্ষণ না আমি রাউটেবল ঠিকানায় থাকা কোনও জিনিসের উত্তর পাই; যদি সেই নোডটি রাউটেবল ঠিকানায় হয় তবে তা ইন্টারনেটে is আমাদের বেশিরভাগের জন্য, হপ # 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;
}
}
}
এটি অ্যান্ড্রয়েডে কীভাবে প্রয়োগ করা হয় তা এখানে ।
ধারণার প্রমাণ হিসাবে, আমি এই কোডটি সি # তে অনুবাদ করেছি:
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;
}
}
আরেকটি বিকল্প নেটওয়ার্ক তালিকা পরিচালক API যা ভিস্তা এবং উইন্ডোজ 7 দুটিই MSDN নিবন্ধটি জন্য পাওয়া যায় এখানে । নিবন্ধে কোডের নমুনাগুলি ডাউনলোড করার একটি লিঙ্ক রয়েছে যা আপনাকে এটি করতে অনুমতি দেয়:
AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());
COM ট্যাব থেকে নেটওয়ার্ক তালিকার 1.0 টাইপ লাইব্রেরির একটি রেফারেন্স যোগ করার বিষয়ে নিশ্চিত হন ... যা নেটওয়ার্কলিস্ট হিসাবে প্রদর্শিত হবে।
ব্যতিক্রমটি ধরে টেস্ট সংযোগগুলি এড়াতে চেষ্টা করুন। কারণ আমরা সত্যই প্রত্যাশা করি যে কখনও কখনও আমরা নেটওয়ার্ক সংযোগ হারাতে পারি।
if (NetworkInterface.GetIsNetworkAvailable() &&
new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
//is online
else
//is offline
আপনি যদি ব্যবহারকারীকে অবহিত করতে চান / যখনই কোনও নেটওয়ার্ক / সংযোগ পরিবর্তন ঘটে তখনই পদক্ষেপ নিন।
এনএলএম এপিআই ব্যবহার করুন:
আমি ব্যক্তিগতভাবে অ্যান্টন এবং মফেল্টেজে উত্তরটি সবচেয়ে ভাল খুঁজে পেয়েছি তবে ভিএমওয়্যার এবং অন্যদের দ্বারা সেট আপ করা ভার্চুয়াল নেটওয়ার্কগুলি বাদ দিতে আমি একটি চেক যুক্ত করেছি।
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";
}
}
}
আমি এটাকে অসম্ভব বলে মনে করব না, কেবল সোজা নয়।
আমি এই জাতীয় কিছু তৈরি করেছি এবং হ্যাঁ এটি নিখুঁত নয়, তবে প্রথম ধাপটি প্রয়োজনীয়: কোনও নেটওয়ার্ক সংযোগ আছে কিনা তা পরীক্ষা করতে। উইন্ডোজ এপি একটি দুর্দান্ত কাজ করে না, তবে কেন আরও ভাল কাজ করবেন না?
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");
}
}
}
ভূমিকা
কিছু পরিস্থিতিতে আপনার উইন্ডোজ অ্যাপ্লিকেশনগুলিতে সি # কোড ব্যবহার করে ইন্টারনেট পাওয়া যায় কি না তা পরীক্ষা করে দেখতে হবে। উইন্ডোজের ফর্মগুলিতে ইন্টারনেট ব্যবহার করে কোনও ফাইল ডাউনলোড বা আপলোড করা হতে পারে বা দূরবর্তী অবস্থানের ডাটাবেস থেকে কিছু তথ্য পাওয়া যায়, এই পরিস্থিতিতে ইন্টারনেট চেক করা বাধ্যতামূলক।
কোডটি পিছনে থেকে সি # ব্যবহার করে ইন্টারনেট উপলব্ধতা যাচাই করার কয়েকটি উপায় রয়েছে। এ জাতীয় সমস্ত উপায় তাদের সীমাবদ্ধতা সহ এখানে ব্যাখ্যা করা হয়েছে।
'উইনিনেট' এপিআই স্থানীয় সিস্টেমে সক্রিয় ইন্টারনেট সংযোগ আছে কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে। এর জন্য ব্যবহৃত নেমস্পেসটি হ'ল 'সিস্টেম.আরটাইম.আইন্টার্ন সার্ভিসস' এবং ডেল ইম্পোর্ট ব্যবহার করে dll 'wininet.dll' আমদানি করুন। এর পরে দুটি প্যারামিটারের বিবরণ এবং রিজার্ভভ্যালু সহ উদাহরণ হিসাবে দেখানো হয়েছে এমন একটি ফাংশন নাম InternetGetConnectedState সহ বাহ্যিক স্ট্যাটিক সহ একটি বুলিয়ান ভেরিয়েবল তৈরি করুন।
দ্রষ্টব্য: বহিরাগত প্রয়োগকারী কোনও পদ্ধতি ঘোষণা করার জন্য বাহ্যিক সংশোধক ব্যবহার করা হয়। এক্সটার্নাল মডিফায়ারের সাধারণ ব্যবহার DllImport অ্যাট্রিবিউটের সাথে হয় যখন আপনি নিয়ন্ত্রণহীন কোডে কল করতে ইন্টারপ পরিষেবাগুলি ব্যবহার করছেন। এই ক্ষেত্রে, পদ্ধতিটি স্থির হিসাবেও ঘোষণা করতে হবে।
এরপরে বুলিয়ান হিসাবে 'ইসআইন্টারনেট অ্যাভায়বল' নামের একটি পদ্ধতি তৈরি করুন। উপরোক্ত ফাংশনটি এই পদ্ধতিতে ব্যবহৃত হবে যা স্থানীয় সিস্টেমের ইন্টারনেটের স্থিতি ফিরিয়ে দেয়
[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;
}
}
কোনও নেটওয়ার্ক সংযোগ উপলব্ধ কিনা তা নির্ধারণ করতে নিম্নলিখিত উদাহরণটি getIsNetworkAv উপলভ্য পদ্ধতি ব্যবহার করে।
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");
}
মন্তব্যসমূহ (এমএসডিএন অনুসারে): কোনও নেটওয়ার্ক ইন্টারফেস যদি "আপ" চিহ্নিত থাকে এবং লুপব্যাক বা টানেল ইন্টারফেস না থাকে তবে একটি নেটওয়ার্ক সংযোগ উপলব্ধ বলে বিবেচিত হয়।
এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে কোনও ডিভাইস বা কম্পিউটার একটি দরকারী নেটওয়ার্কের সাথে সংযুক্ত না থাকলেও এটি এখনও উপলব্ধ বলে বিবেচিত হয় এবং গেটআইস নেটওয়াকঅ্যাভ্যালেবল সত্য হয়ে যাবে। উদাহরণস্বরূপ, যদি অ্যাপ্লিকেশনটি চালিত ডিভাইসটি যদি একটি ওয়্যারলেস নেটওয়ার্কের সাথে সংযুক্ত থাকে যার জন্য প্রক্সি প্রয়োজন হয় তবে প্রক্সিটি সেট না করা থাকে তবে getIsNetworkAv উপলভ্য সত্য হয়ে যাবে। যখন getIsNetworkAv উপলভ্য সত্য হবে তখন এর আর একটি উদাহরণ হ'ল বা রাউটারের সাথে সংযুক্ত এমন একটি কম্পিউটারে যদি অ্যাপ্লিকেশনটি চলমান থাকে যেখানে হাব বা রাউটার আপস্ট্রিম সংযোগটি হারিয়ে ফেলেছে।
পিং এবং পিংরপ্লি ক্লাসগুলি কোনও অ্যাপ্লিকেশনটিকে হোস্টের কাছ থেকে উত্তর পেয়ে নেটওয়ার্কের মাধ্যমে কোনও দূরবর্তী কম্পিউটার অ্যাক্সেসযোগ্য কিনা তা নির্ধারণের অনুমতি দেয়। এই ক্লাসগুলি সিস্টেম.নেট. নেট ওয়ার্ক ইনফর্মেশন নেমস্পেসে উপলব্ধ। নিম্নলিখিত উদাহরণটিতে হোস্টকে কীভাবে পিং করা যায় তা দেখানো হয়েছে।
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;
}
মন্তব্যসমূহ (এমএসডিএন অনুসারে): অ্যাপ্লিকেশনগুলি রিমোট কম্পিউটারে পৌঁছনীয় কিনা তা সনাক্ত করতে পিং ক্লাস ব্যবহার করে। নেটওয়ার্ক টপোলজি নির্ধারণ করতে পারে যে পিং সফলভাবে কোনও দূরবর্তী হোস্টের সাথে যোগাযোগ করতে পারে কিনা। প্রক্সি, নেটওয়ার্ক ঠিকানা অনুবাদ (NAT) সরঞ্জাম, বা ফায়ারওয়ালের উপস্থিতি এবং কনফিগারেশন পিংকে সফল হতে বাধা দিতে পারে। একটি সফল পিং কেবলমাত্র ইঙ্গিত দেয় যে দূরবর্তী হোস্টটি নেটওয়ার্কে পৌঁছানো যায়; দূরবর্তী হোস্টে উচ্চ স্তরের পরিষেবাগুলির উপস্থিতি (যেমন একটি ওয়েব সার্ভার) গ্যারান্টিযুক্ত নয়।
মন্তব্য / পরামর্শ আমন্ত্রিত করা হয়। শুভ কোডিং ......!
আমার আবেদনের জন্য আমরা ছোট ফাইল ডাউনলোড করেও পরীক্ষা করি test
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;
}
এছাড়াও। কিছু আইএসপি ফাইল ক্যাশে মিডল সার্ভার ব্যবহার করতে পারে। এলোমেলোভাবে অব্যবহৃত প্যারামিটার যুক্ত করুন। https://www.microsoft.com/favicon.ico?req=random_number ক্যাচিং প্রতিরোধ করতে পারে।
আমার 3 জি রাউটার / মডেমগুলিতে আমি সেই পদ্ধতিটি নিয়ে সমস্যা বোধ করছি, কারণ যদি ইন্টারনেট সংযোগ বিচ্ছিন্ন হয় তবে রাউটারটি পৃষ্ঠাটি তার প্রতিক্রিয়া পৃষ্ঠায় পুনঃনির্দেশ করে, তাই আপনি এখনও একটি বাষ্প পেয়ে যান এবং আপনার কোড মনে করে সেখানে ইন্টারনেট আছে। আপেলগুলির (বা অন্যদের) একটি হট স্পট-ডেডিকেশন পৃষ্ঠা রয়েছে যা সর্বদা একটি নির্দিষ্ট প্রতিক্রিয়া দেয়। নিম্নলিখিত নমুনা "সাফল্য" প্রতিক্রিয়া প্রদান করে। সুতরাং আপনি নিশ্চিত হয়ে উঠবেন যে আপনি ইন্টারনেট সংযোগ করতে পেরেছিলেন এবং সত্যিকারের প্রতিক্রিয়া পেতে পারেন!
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;
}
}
ওই কাজগুলো