নেট ব্যবহার করে ইন্টারনেট সংযোগের জন্য যাচাই করার সেরা উপায় কী?


237

। নেট এ ইন্টারনেট সংযোগের জন্য যাচাই করার দ্রুত এবং সবচেয়ে কার্যকর উপায় কী?


6
ব্যবহারকারীর যদি ইন্টারনেট সংযোগ থাকে। ব্যবহারকারী যদি ইন্টারনেটে সংযোগ করতে পারেন। একটি ইমেল লগ প্রেরণ করার জন্য।
মোহিত দেশপাণ্ডে

11
শুধু ইমেল প্রেরণ করুন। যদি ব্যবহারকারী সংযুক্ত না থাকে তবে আপনি সম্ভবত একরকম ব্যতিক্রম পাবেন (যা আপনাকে সম্ভবত হ্যান্ডেল করতে হবে)।
শেঠ

15
এছাড়াও, নোট করুন যে ব্যবহারকারী ইন্টারনেটের সাথে সংযুক্ত কিনা তা পরীক্ষা করার কোনও উপায় নেই ; আপনি যা বলতে পারেন তা হ'ল তারা যদি অতীতে সংযুক্ত ছিল । ধরুন আপনার কাছে একটি পদ্ধতি ছিল: "বুল সি = আইস কানেক্টেড (); যদি (গ) {ডোজোমিংথিং ();}" - ইসকনেক্টেড এবং ডোসোমথিং-এর কলটির মধ্যে, ওয়্যারলেস নেটওয়ার্ক রাউটারটি আনপ্লাগড করা হতে পারে। ইসকনেক্টেডকে সত্যই ওয়াশআরেন্টালি সংযুক্ত বলা উচিত।
এরিক লিপার্ট

Windows NLM APIএই জন্য সেরা হওয়া উচিত। stackoverflow.com/questions/5405895/…
মাহবুবুর রহমান

উত্তর:


292

এর মতো কিছু কাজ করা উচিত।

System.Net.WebClient

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
            using (client.OpenRead("http://google.com/generate_204")) 
                return true; 
    }
    catch
    {
        return false;
    }
}

18
গুগলকে পিং করার চেয়ে এটি সম্ভবত আরও ভাল, কারণ আমার কাছে মনে হয় যে গুগল পিংসে প্রতিক্রিয়া জানাতে থাকবে তার কোনও গ্যারান্টি আমাদের নেই। অন্যদিকে, আমি এমন একটি বিশ্বব্যাপী ছবি তুলতে পারি না যেখানে www.google.com কিছু HTML এইচটিএমএল ফেরায় না :)
ড্যানিয়েল ভ্যাসালো

3
@ ড্যানিয়েল: একদিকে সত্য, তবে অন্যদিকে, ওয়েবসাইটটি ডাউনলোড করা একটু ওভারহেড ইমো
লিও

9
যে কোনও উপায়ে, 4KB পিছনে টানার কোনও কারণ নেই - কেবল ক্লায়েন্ট ব্যবহার করুন .অ্যাপ্রেইড (url) পরিবর্তে। যদি এটি কোনও ব্যতিক্রম না ফেলে তবে এটি সংযোগ করতে সক্ষম হয়েছিল।
জোশ এম ২

14
এটি আসলে এতটা দক্ষ নয়। এটি ব্যবহার করা যদি কোনও ইন্টারনেট না থাকে তবে আমার প্রোগ্রামটি 1 মিনিটেরও বেশি শুরু করে। সম্ভবত ডিএনএস সমাধান করার চেষ্টা করার কারণে। ৮.৮.৮.৮ (গুগল ডিএনএস) পিং করছে এটি পরিবর্তন করে 3 সেকেন্ডে।
ম্যাডবয়

8
I cannot image a world where www.google.com does not return some HTMLউদাহরণস্বরূপ চীনে @ ড্যানিয়েলভ্যাসালো ...
জের্মে মেভেল ২

84

কোনও ইন্টারনেট সংযোগ আছে কিনা তা আপনি নির্ভরযোগ্যভাবে পরীক্ষা করতে পারবেন এমন কোনও উপায় নেই (আমি ধরে নিই যে আপনি ইন্টারনেটের অ্যাক্সেস বলতে চাইছেন)।

আপনি যাইহোক, গুগল ডটকমকে পিন করার মতো অনুরূপ এমন কোনও সংস্থার জন্য অনুরোধ করতে পারেন যা কার্যত কখনও অফলাইনে নেই। আমি মনে করি এটি দক্ষ হবে।

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;
}

24
+1 "কোনও ইন্টারনেট সংযোগ আছে কিনা তা আপনি নির্ভরযোগ্যভাবে পরীক্ষা করতে পারবেন এমন কোনও উপায় নেই"
ওয়াজ

6
এইগুলি যা আপনাকে পিন করে দিলে গুগল আপ রয়েছে তা যাচাই করে। আপনার সফল পিং ইন্টারনেটের পরের তাত্ক্ষণিকভাবে যদি ইন্টারনেট ডাউন হয়ে যায় তবে কী? করার আগে চেক করার কোনও মানে নেই।
dbasnett

12
এবং এটি কীভাবে আমার উত্তরের মূল বক্তব্যটির সাথে বিরোধিতা করে?
লিও

10
"Google.com" ব্যবহার করতে আরও সময় লাগবে কারণ এটি সমাধান করা দরকার be পরিবর্তে, সরাসরি আইপি ব্যবহার করে পিং করা দ্রুত হবে। গুগল পাবলিক ডিএনএস আইপি ঠিকানাগুলিতে পিং করা ( 8.8.8.8বা 8.8.4.4) আমার পক্ষে ভাল কাজ করে।
মঙ্গেশ

8
আমি সেই বক্তব্যটি পুনরায় বলতে চাই যে Beware - many schools and offices block the ping protocol.আপনি যদি কোনও অ্যাপ্লিকেশনটির জন্য এই পদ্ধতিটি ব্যবহার করেন যা ক্লায়েন্টরা ব্যবহার করবেন আমি ইন্টারনেট চেক করার এই পদ্ধতির বিরুদ্ধে পরামর্শ দেব
ব্যবহারকারী ১

42

যাচাইয়ের পরিবর্তে, কেবল ক্রিয়াটি সম্পাদন করুন (ওয়েব অনুরোধ, মেল, এফটিপি, ইত্যাদি) এবং অনুরোধটি ব্যর্থ হওয়ার জন্য প্রস্তুত থাকুন, যা আপনার চেক সফল হয়েছিল, এমনকি আপনাকে যা করতে হবে তা করতে হবে।

নিম্নোক্ত বিবেচনা কর:

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

9
রাইট! কেবল এটি করুন - তবে সমস্ত ফলাফলের জন্য প্রস্তুত থাকুন।
কর্নেল আতঙ্ক

3
নিম্নলিখিতটি বিবেচনা করুন: নেটওয়ার্কটি খুব অল্প সময়ের জন্য নিচে থাকলে আপনার কিছু করা দরকার (যেমন ট্রেসলগ, রাউটার রিসেট)
আবির

2
ওপি নয়, তবে যে কারণটি আমি এটি করতে চাই তা হ'ল যদি ইন্টারনেট সংযোগ না পাওয়া যায় তবে ডিফল্ট 100 সেকেন্ড টাইমিয়ুট এড়ানো। এইচটিটিপি অনুরোধটি একটি পটভূমির থ্রেডে সম্পন্ন হয়েছে, সুতরাং ইউআই থ্রেডটি অবরোধ করা হচ্ছে না, তবে পটভূমি থ্রেডটি HTTP অনুরোধটি থেকে ফিরে না আসা এবং শেষ না হওয়া পর্যন্ত আমার অ্যাপটি প্রস্থান করতে পারে না। কিছু "হ্যাপি মিডিয়াম" টাইমআউট মান সন্ধান করার পরিবর্তে, আমি যদি ইন্টারনেট সংযোগটি বন্ধ হয়ে যায় জানি তবে আমি সম্পূর্ণ অনুরোধটি এড়াতে চাই।
স্কট স্মিথ

2
আমার বক্তব্যটি হ'ল আমরা যখন রিমোট পরিষেবাটি উপলভ্য / অনুপলব্ধ হয়ে যায় তখন তার জন্য আমরা অ্যাকাউন্ট করতে পারি না। এছাড়াও, পিংসে প্রতিক্রিয়া জানায় না এমন সাইটগুলি সম্পর্কে কী বলা যায়?
dbasnett

আর একটি ব্যবহারের ক্ষেত্রে হ'ল একটি অনলাইন চেকার যা আমার ইন্টারনেট ফিরে আসার সাথে সাথে আমাকে সতর্ক করবে
বেন ফিলিপ

28

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);         
}

পরীক্ষার সময়, আমি দেখতে পেলাম যে ভিএমওয়্যার প্লেয়ার ইনস্টল থাকা অবস্থায় (ইন্টারনেট সংযোগ বিচ্ছিন্ন) ইন্টারনেট গেট কানেক্টেড স্টেট সত্য হয়েছিল returned এটি নিয়ন্ত্রণ প্যানেল \ নেটওয়ার্ক এবং ইন্টারনেট \ নেটওয়ার্ক সংযোগগুলি (ভিএমনেট 1 এবং ভিএমনেট 8) এ অক্ষম করতে হয়েছিল।
হকিজে

ঠিক আছে জাস্টিন অরঞ্জার। যদিও আমি এটি পরীক্ষা করে দেখেছি তবে আবার যাচাই করতে হবে
কামরান শহীদ

2
আমার জন্য সর্বোত্তম পন্থা, আমি তারপরেও আমার পরিষেবা সংযোগটি পরীক্ষা করে দেখি, তারপরে রুটিনগুলি শুরু করুন ... আমি কেবল ব্যতিক্রমগুলি এড়াতে চেয়েছিলাম।
ওয়াগনার বার্টোলিনি জুনিয়র

4
এই কোডটি কেবল কেবল কেবল তারের প্লাগ ইন করা আছে কিনা তা যাচাই করে
হ্যাকারম্যান

14

গুগলকে পিং করে ইন্টারনেট সংযোগের জন্য একটি পরীক্ষা:

new Ping().Send("www.google.com.mx").Status == IPStatus.Success

7
এই উত্তরটির সাথে বর্ণিত বিবরণ কেবল প্রশ্নের মূল লেখকের চেয়ে বেশি লোকের পক্ষে উপকারী হবে।
বোকেকেম

13
সাবধান - অনেক স্কুল এবং অফিস পিং প্রোটোকল অবরোধ করে। বোকা, আমি জানি।
কর্নেল আতঙ্ক

আমি পিং ক্লাস পাই না। দয়া করে আমাকে একটু সাহায্য করবেন. আমি ইউডাব্লুপি এবং কম্পিউটারের তথ্য দিয়ে কাজ করার অন্য
পথে

12

আমি যারা বলছেন তাদের সাথে আমি একমত নই: "কোনও কাজ সম্পাদনের আগে কানেক্টিভিটির জন্য যাচাই করার অর্থ কী, চেক করার সাথে সাথেই সংযোগটি নষ্ট হয়ে যেতে পারে"। বিকাশকারী হিসাবে আমরা অনেক প্রোগ্রামিংয়ের কাজগুলিতে অবশ্যই কিছুটা অনিশ্চয়তা রয়েছি, তবে গ্রহণযোগ্যতার স্তরে অনিশ্চয়তা হ্রাস করা চ্যালেঞ্জের অংশ।

আমি সম্প্রতি একটি অ্যাপ্লিকেশন তৈরি করতে এই সমস্যায় পড়েছি যা একটি ম্যাপিং বৈশিষ্ট্য যা একটি অন-লাইনের টাইল সার্ভারের সাথে যুক্ত রয়েছে 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
            }));
        }
    }

11

আমি উপরে তালিকাভুক্ত সমস্ত অপশন দেখেছি এবং ইন্টারনেট পাওয়া যায় কিনা তা পরীক্ষা করার একমাত্র কার্যকর বিকল্পটি হল "পিং" বিকল্প। আমদানি [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 বুদ্ধিমান যদি ইন্টারনেট সংযোগ উপলব্ধ করার কোনো উপায় নেই।


এটি সত্য নয়, আমি উইনিনেট.ডিল আমদানি করেছি, প্লাগড নেটওয়ার্ক ক্যাবল এবং দৃশ্যের ইন্টারনেট উপলব্ধ না হওয়ার জন্য সঠিক ফলাফল পেয়েছি।
ওয়াল্ডেমার গাজিনোস্কি

8

আপনার কোডটি যাচাই করা এবং চালানোর মধ্যে নেটওয়ার্কের নীচে নেমে যাওয়ার সমস্যাটি সমাধান করে না তবে এটি বেশ নির্ভরযোগ্য

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;
}

দুর্দান্ত ধারণা, তবে আপনি যেমন বলেছিলেন নিখুঁত হতে পারে না। আপনি ভবিষ্যতের পরীক্ষার জন্য প্রেরিত / প্রাপ্ত বাইটগুলিও ক্যাশে করতে পারেন ache এখনও নিখুঁত না।
টড

এই কোডটি কাজ করে না, দয়া করে সংশোধন করুন। এটি কেবল নেটওয়ার্কের কেবলটি প্লাগ ইন করা হয়েছে কিনা তা পরীক্ষা করে।
হ্যাকারম্যান

5

পিংিং 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;
        }
    }
}

4

এটি অ্যান্ড্রয়েডে কীভাবে প্রয়োগ করা হয় তা এখানে

ধারণার প্রমাণ হিসাবে, আমি এই কোডটি সি # তে অনুবাদ করেছি:

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
    }
}

3
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;
    }
}

2

আরেকটি বিকল্প নেটওয়ার্ক তালিকা পরিচালক API যা ভিস্তা এবং উইন্ডোজ 7 দুটিই MSDN নিবন্ধটি জন্য পাওয়া যায় এখানে । নিবন্ধে কোডের নমুনাগুলি ডাউনলোড করার একটি লিঙ্ক রয়েছে যা আপনাকে এটি করতে অনুমতি দেয়:

AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());

COM ট্যাব থেকে নেটওয়ার্ক তালিকার 1.0 টাইপ লাইব্রেরির একটি রেফারেন্স যোগ করার বিষয়ে নিশ্চিত হন ... যা নেটওয়ার্কলিস্ট হিসাবে প্রদর্শিত হবে।


7
eeeeww। .NET এ COM হেল্প ব্যবহার করছেন?
jgauffin

@ jgauffin আপনি কী ব্যাখ্যা করতে পারেন যে কারনে নেট। এমে COM এড়ানো উচিত? আমি যে অন্যান্য সমাধান পেয়েছি তার তুলনায়, সিওএম সমাধানটি বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে।
ইনসিসিটাস

2

ব্যতিক্রমটি ধরে টেস্ট সংযোগগুলি এড়াতে চেষ্টা করুন। কারণ আমরা সত্যই প্রত্যাশা করি যে কখনও কখনও আমরা নেটওয়ার্ক সংযোগ হারাতে পারি।

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline

1
নেটওয়ার্কফর্মটি কোথা থেকে এসেছে? সম্পাদনা: আমি এটি খুঁজে পেয়েছি: System.Net.NetworkInifications
অনুপ্রেরণা_ কোডিং

1

আপনি যদি ব্যবহারকারীকে অবহিত করতে চান / যখনই কোনও নেটওয়ার্ক / সংযোগ পরিবর্তন ঘটে তখনই পদক্ষেপ নিন।
এনএলএম এপিআই ব্যবহার করুন:


1

আমি ব্যক্তিগতভাবে অ্যান্টন এবং মফেল্টেজে উত্তরটি সবচেয়ে ভাল খুঁজে পেয়েছি তবে ভিএমওয়্যার এবং অন্যদের দ্বারা সেট আপ করা ভার্চুয়াল নেটওয়ার্কগুলি বাদ দিতে আমি একটি চেক যুক্ত করেছি।

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));
}

GetIsNetworkAv উপলভ্য () ডক্স থেকে এফওয়াইআই: কোনও নেটওয়ার্ক ইন্টারফেস যদি "আপ" চিহ্নিত থাকে এবং লুপব্যাক বা টানেল ইন্টারফেস না হয় তবে একটি নেটওয়ার্ক সংযোগ উপলব্ধ বলে মনে করা হয়। আমি জানি না যে ভার্চুয়ালটি সর্বদা ইন্টারফেসের নাম বা বর্ণনায় থাকবে। এটা কি স্ট্যান্ডার্ড?
মাইক চিল

1
bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

if (bb == true)
    MessageBox.Show("Internet connections are available");
else
    MessageBox.Show("Internet connections are not available");

1
আপনি কি এর গতি সম্পর্কিত পোস্ট করতে পারেন এবং পোস্ট করা অন্যান্য সমাধানগুলির চেয়ে এটি কীভাবে ভাল। এটি আপনার উত্তরটি প্রশ্নের পুরোপুরি সমাধানে সহায়তা করবে।
রেন

8
এই বিকল্পটিতে সমস্যাটি হ'ল bbএমনকি যদি নেটওয়ার্কটি ইন্টারনেটের সাথে সংযুক্ত না থাকে তখনও এটি সত্য।
হাফপাস্টফোর.কম

2
যদিও এটি সত্য যে এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে আমি মনে করি যে গুগল ইত্যাদি পিং করার আগে প্রাক-চেক হিসাবে GetIsNetworkAv উপলভ্য এটি এখনও দরকারী
বেন হিউজ

3
এই কোডটি বলে না যে ইন্টারনেট সংযোগ উপলব্ধ কিনা। আপনি যদি ইন্টারনেট ব্যতীত কোনও তারের প্লাগ করেন তবে তা সত্য হবে।
হ্যাকারম্যান

1

পিংয়ের একাধিক থ্রেডেড সংস্করণ:

  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";
          }
      }
  }

0

আমি এটাকে অসম্ভব বলে মনে করব না, কেবল সোজা নয়।

আমি এই জাতীয় কিছু তৈরি করেছি এবং হ্যাঁ এটি নিখুঁত নয়, তবে প্রথম ধাপটি প্রয়োজনীয়: কোনও নেটওয়ার্ক সংযোগ আছে কিনা তা পরীক্ষা করতে। উইন্ডোজ এপি একটি দুর্দান্ত কাজ করে না, তবে কেন আরও ভাল কাজ করবেন না?

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;
}

এটি বেশ সহজ, তবে এটি চেকের মান উন্নত করতে সহায়তা করে বিশেষত যখন আপনি বিভিন্ন প্রক্সি কনফিগারেশন চেক করতে চান।

তাই:

  • নেটওয়ার্ক সংযোগ আছে কিনা তা পরীক্ষা করুন (এটিকে সত্যিই ভাল করুন, এমনকি নেটওয়ার্কআইএসএল উপলভ্য ফাংশনটি উন্নত করার জন্য ভুয়া পজিটিভ থাকাকালীন ডেভেলপারদের কাছে লগগুলি আবার পাঠানো হতে পারে)
  • এইচটিটিপি পিং
  • (প্রতিটিটিতে HTTP পিংসের সাথে প্রক্সি কনফিগারেশনের মাধ্যমে চক্র)

1
@ হ্যাকারম্যান এটি অ-সুস্পষ্ট প্রথম পদক্ষেপ। কোডাররা যদি দ্বিতীয় ধাপ হিসাবে সত্য হয় তবে তাদের নিজস্ব সার্ভারে দ্রুত পিং কাজ করতে পারে। গুরুত্বপূর্ণভাবে, এটি ত্রুটিযুক্ত উইন্ডোজ এপিআই পদ্ধতির বিকল্প সরবরাহ করে। বাকীটি বিশদ।
টড

3
মিথ্যা বলা যদি কোনও নেটওয়ার্ক ইন্টারফেস না থাকে তবে অবশ্যই কোনও ইন্টারনেট নেই। দেরি না করে, অন্য হোস্টের জন্য আর কোনও চেক না করেই ইউআইকে এখনই আপডেট করা যেতে পারে।
টড

0
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;
    }
}

আপনার উত্তর মন্তব্য করুন। শুধুমাত্র কোড সহ উত্তর অনুমোদিত নয়।
ganchito55

পলিসিংয়ের স্বার্থে এটি বেশ স্ব-বর্ণনামূলক, পুলিশিং?
রোলস

0

ব্যবহার করুন 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");
        }
    }
}

দুর্দান্ত ধারণা, তবে নেটওয়ার্ক উপলব্ধতা যাচাই করে নিন, ইন্টারনেট উপলভ্যতা নয়
জন দেমেট্রিউ

এই শ্রেণিটি ইন্টারনেটের সহজলভ্যতাও পরীক্ষা করে: সোর্সকোড

জিনিসটি হ'ল, আমি এটি চেষ্টা করেছিলাম, তবে কোনও নেটওয়ার্ক উপলব্ধ না হলে কেবল এটিই বরখাস্ত হয়েছিল
জন দেমেট্রিউ

0

ভূমিকা

কিছু পরিস্থিতিতে আপনার উইন্ডোজ অ্যাপ্লিকেশনগুলিতে সি # কোড ব্যবহার করে ইন্টারনেট পাওয়া যায় কি না তা পরীক্ষা করে দেখতে হবে। উইন্ডোজের ফর্মগুলিতে ইন্টারনেট ব্যবহার করে কোনও ফাইল ডাউনলোড বা আপলোড করা হতে পারে বা দূরবর্তী অবস্থানের ডাটাবেস থেকে কিছু তথ্য পাওয়া যায়, এই পরিস্থিতিতে ইন্টারনেট চেক করা বাধ্যতামূলক।

কোডটি পিছনে থেকে সি # ব্যবহার করে ইন্টারনেট উপলব্ধতা যাচাই করার কয়েকটি উপায় রয়েছে। এ জাতীয় সমস্ত উপায় তাদের সীমাবদ্ধতা সহ এখানে ব্যাখ্যা করা হয়েছে।

  1. InternetGetConnectedState (wininet)

'উইনিনেট' এপিআই স্থানীয় সিস্টেমে সক্রিয় ইন্টারনেট সংযোগ আছে কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে। এর জন্য ব্যবহৃত নেমস্পেসটি হ'ল 'সিস্টেম.আরটাইম.আইন্টার্ন সার্ভিসস' এবং ডেল ইম্পোর্ট ব্যবহার করে 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;
    }
}
  1. GetIsNetworkAvailable

কোনও নেটওয়ার্ক সংযোগ উপলব্ধ কিনা তা নির্ধারণ করতে নিম্নলিখিত উদাহরণটি 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 উপলভ্য সত্য হবে তখন এর আর একটি উদাহরণ হ'ল বা রাউটারের সাথে সংযুক্ত এমন একটি কম্পিউটারে যদি অ্যাপ্লিকেশনটি চলমান থাকে যেখানে হাব বা রাউটার আপস্ট্রিম সংযোগটি হারিয়ে ফেলেছে।

  1. নেটওয়ার্কে একটি হোস্টনাম পিং করা হচ্ছে

পিং এবং পিংরপ্লি ক্লাসগুলি কোনও অ্যাপ্লিকেশনটিকে হোস্টের কাছ থেকে উত্তর পেয়ে নেটওয়ার্কের মাধ্যমে কোনও দূরবর্তী কম্পিউটার অ্যাক্সেসযোগ্য কিনা তা নির্ধারণের অনুমতি দেয়। এই ক্লাসগুলি সিস্টেম.নেট. নেট ওয়ার্ক ইনফর্মেশন নেমস্পেসে উপলব্ধ। নিম্নলিখিত উদাহরণটিতে হোস্টকে কীভাবে পিং করা যায় তা দেখানো হয়েছে।

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) সরঞ্জাম, বা ফায়ারওয়ালের উপস্থিতি এবং কনফিগারেশন পিংকে সফল হতে বাধা দিতে পারে। একটি সফল পিং কেবলমাত্র ইঙ্গিত দেয় যে দূরবর্তী হোস্টটি নেটওয়ার্কে পৌঁছানো যায়; দূরবর্তী হোস্টে উচ্চ স্তরের পরিষেবাগুলির উপস্থিতি (যেমন একটি ওয়েব সার্ভার) গ্যারান্টিযুক্ত নয়।

মন্তব্য / পরামর্শ আমন্ত্রিত করা হয়। শুভ কোডিং ......!


-1

আমার আবেদনের জন্য আমরা ছোট ফাইল ডাউনলোড করেও পরীক্ষা করি 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 ক্যাচিং প্রতিরোধ করতে পারে।


-1

আমার 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;
}

-2

একটি ইন্টারনেট সংযোগের জন্য আমার তিনটি পরীক্ষা রয়েছে।

  • রেফারেন্স 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, তাহলে আপনি জানেন একটি ইন্টারনেট সংযোগ নেই।


-4
public static bool HasConnection()
{
    try
    {
        System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
        return true;
    }
    catch
    {
        return false;
    }
}

ওই কাজগুলো


46
আপনার ডিএনএস ক্যাশে যদি আপনার গুগলের আইপি থাকে তবে এটি কোনও ডিএনএস অনুরোধ প্রেরণ করবে না, সুতরাং আপনি সংযুক্ত না থাকলেও এটি সত্য হতে পারে
টমাস লেভস্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.