Makale Özeti

Tasarladığımız uygulamalarda bazı işlevlerin sorunsuz çalışabilmesi için uygulamanın çalıştığı cihazda internet bağlantısının olup olmadığı çalışma esnasında tespit edilmelidir. İnternet bağlantınsın mevcudiyeti tespit edildikten sonra internet erişimi gerektiren işlevler geçici olarak devre dışı bırakılabilir ve kullanıcı bir uyarı mesajı aracılığı ile durumdan haberdar edilebilir. Aksi takdirde uygulama çalışma esnasında hata verip sonlanabilir veyahut kullanıcı açısından sinir bozucu bazı durumlara sebebiyet verebilir. Ben bir dizi farklı yöntem ile bu sorunu nasıl çözebileceğimizi anlatmaya çalışacağım.

Makale

Tasarladığımız uygulamalarda bazı işlevlerin sorunsuz çalışabilmesi için uygulamanın çalıştığı cihazda internet bağlantısının olup olmadığı çalışma esnasında tespit edilmelidir.  İnternet bağlantınsın mevcudiyeti tespit edildikten sonra internet erişimi gerektiren işlevler geçici olarak devre dışı bırakılabilir ve kullanıcı bir uyarı mesajı aracılığı ile durumdan haberdar edilebilir. Aksi takdirde uygulama çalışma esnasında hata verip sonlanabilir veyahut kullanıcı açısından sinir bozucu bazı durumlara sebebiyet verebilir.

Ben bir dizi farklı yöntem ile bu sorunu nasıl çözebileceğimizi anlatmaya çalışacağım.

Method 1: WebRequest

 Her zaman aktif olduğunu umduğumuz bir web sitesine, mesela google.com’a erişim isteğinde bulununca yanıt alabiliyorsak uygulamamızın çalıştığı bilgisayarımız/mobil aygıtımız internete bağlı demektir.

  public static bool WebRequestTest()

        {

            string url = "http://www.google.com";

            try

            {

                System.Net.WebRequest myRequest = System.Net.WebRequest.Create(url);

                System.Net.WebResponse myResponse = myRequest.GetResponse();

            }

            catch (System.Net.WebException)

            {

                return false;

            }

            return true;

        }

 

Method 2: TCP Socket

Web erişim isteğine geç yanıt verilebilir bu nedenle ilk yöntem bazı uygulamalar için yeterince hızlı olmayabilir. Web isteğinde bulunmak yerine web erişimi yapabileceğimiz 80 nolu portun aktif olup olmadığı kontrol etmek aynı görevi daha hızlı yerine getirecektir.

        public static bool TcpSocketTest()

        {

            try

            {

                System.Net.Sockets.TcpClient client =

                    new System.Net.Sockets.TcpClient("www.google.com", 80);

                client.Close();

                return true;

            }

            catch (System.Exception ex)

            {

                return false;

            }

        }

 

 

Method 3: Ping

Bir diğer yöntem ise bilinen bir adresi pinglemek. Aşağıdaki örnekte zaman aşımı süresini (timeout) 1000 ms olarak belirttim ama uygulamayı kullanacağınız platforma, ülkeye vs göre süreyi değiştirmenizi tavsiye ederim (mesela internet erişiminin çok yavaş olduğu yerler için 3000 ms daha mantıklı olacaktır).  

        public bool PingTest()

        {

            System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();

 

            System.Net.NetworkInformation.PingReply pingStatus =

                ping.Send(IPAddress.Parse("208.69.34.231"),1000);

 

            if (pingStatus.Status == System.Net.NetworkInformation.IPStatus.Success)

            {

                return true;

            }

            else

            {

                return false;

            }

        }

Bu yöntemi Compact Framework te kullanamazsınız zira NetworkInformation isim uzayı CF de mevcut değil. Ama OpenNETCF tarafından geliştirilen Smart Device Framework (http://www.opennetcf.com, Community Editin ücretsiz olarak indirilebilmekte )    dot NET CF tarafından sunulmayan birçok aracı sunmakta bunlar arasında Ping metodu da var.

Ayrıca dikkat ederseniz  208.69.34.231 nolu IP Google’a ait.Bu IP adresi yerine www.google.com adresi doğrudan kullanılarak da Ping atılabilirdi:

System.Net.NetworkInformation.PingReply pingStatus = ping.Send("www.google.com",1000);

fakat bu defa arka planda DNS sorgusu yapılıp www.google.com a ait IP adresi tespit edilecek dolayısıyla zaman kaybı olacaktır.

 

Method 4: DNS Sorgusu

Bu yöntem internet erişiminin mevcudiyeti konusunda verilecek karar için daha tutarlı bir yöntemdir. Düşününki tam test yaptığınız sırada Ping atmaya veyahut WebRequest/TcpClient ile bağlanmaya çalıştığınız sunucu bir iki saniye de olsa geçici olarak servis dışı oldu. Google için bu durumun söz konusu olacağını sanmıyorum ama dünya hali nolucağı belli olmuyor :-). Bu durumda internet bağlantınız olmasına rağmen yanlış karara varacaksınız. Dns sorgusu yapılarak internet bağlantısını test etmek biraz daha sağlıklı bir yöntem olacaktır zira sunucu servis dışı olsada da DNS sunucuları sürekli aktif durumdadır. Ayrıca yanıt alınana kadar birkaç farklı DNS sunucuya sorgu gönderileceği için hata olasılığı daha düşüktür.

 public static bool DnsTest()

        {

            try

            {

                System.Net.IPHostEntry ipHe =

                    System.Net.Dns.GetHostByName("www.google.com");

                return true;

            }

            catch

            {

                return false;

            }

        }

 

Method 5: Windows Internet API (WinINet)

Son olarak WinINet arayüzü tarafından sunulan InternetCheckConnection  ve InternetGetConnectedState  fonksiyonları kullanılabilir. Bu fonksiyonların arka planda ne tür işlem yaptığı konusunda bir bilgim yok. İsteyenler MSDN üzerinden bu arayüzün dokümantasyonuna ulaşabilirler (http://msdn.microsoft.com/en-us/library/aa385473(v=VS.85).aspx). Örnek bir kullanımı şu şekilde olabilir:

[DllImport("wininet.dll")]

        private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

 

        public static bool IsConnectedToInternet()

        {

            int Desc;

            return InternetGetConnectedState(out Desc, 0);

        }

 

 

 

Bu yazımızda çalışma esnasında (run-tıme) uygulamanın çalıştığı sistemde internet bağlantısı olup olmadığını nasıl test edeciğimizi öğrendik. Ben kişisel olarak method 5 te belirttiğim WinINet arayüzü tarafından sunulan fonksiyonları veya Method 4 teki DNS Sorgusu testini kullanmanızı tavsiye ederim. Eğer method 4 ü kullanacksanız belirli periyodlarda aktif olup DnsTest i çağıran ayrı bir thread oluşturmanızı tavsiye ederim.

Bir sonraki yazıda görüşmek dileğiyle.

Özcan İLİKHAN