Oca
08

C#’da Internet IP adresini almak: Get WAN IP Address

C#’da Internet IP adresini almak: Get WAN IP AddressAraştırdım. Kendi çapımda çok araştırdım ama bulamadım. Internette, Internet’e çıkış yaptığım IP adresimi nasıl bulacağım konusunda bir kaynak yok sonucuna vardım. Biraz kafa yordum bir yöntem buldum sonunda.

ADSL’im dinamik IP’li ve bazen IP’mi değiştirmem gerekiyordu (Rapidshare‘den dolayı sanmayın rapid hesabım var, başka işler için :) ) ve her seferinde değişmiş mi yoksa aynısını mı almış, görmek için ipadresimne.com‘a girmekle uğraşmak istemiyordum. Maxthon kurunca, durum çubuğunda Wan Ip adresimi gösterdiğini görünce “bende böyle bişey yapmalıyım” dedim. Bir uygulamacık yapmalıyım ve bana WAN IP adresimi göstermeli. Önce, “kolay bişeydir, bir nesnesi, bir sınıfı vardır, rahatça bulurum” diye düşündüm ama baktım ki hiç de öyle değil. Internet’teki bütün sitelerde LAN IP adresini bulmayı sağlayan örnekler var. Kafayı yorup pratik bir şey bulmam gerektiğini anladım.

Peki WAN IP adresimi nasıl buluyordum? ipadresimne.com vb. sitelere girerek veya ADSL’in arayüzüne girip, oradan bakarak. Immmm… Bu arada başka şeylerde geldi mi gelmedi mi hatırlamıyorum (mesela ADSL’in arayüzüne girmek gelmişti) ama sonunda WAN IP adresimi öğrendiğim siteden bu adresi çekmek geldi aklıma.

Peki hadi deneyelim.

        private string fncGetSiteSource(string siteAddress)
        {
            string retVal = “”;
            WebResponse webResponse = null;
            try
            {
                WebRequest webRequest = WebRequest.Create(siteAddress);
                webResponse = webRequest.GetResponse();
                Stream stream = webResponse.GetResponseStream();
                StreamReader streamReader = new StreamReader(stream);
                retVal = streamReader.ReadToEnd();
            }
            catch (WebException)
            {
                //Error
            }
            return retVal;
        }
  
bu metod ile adresini girdiğimiz Internet sitesinin kaynak koduna ulaşabiliyoruz.

ipadresimne.com’un kaynak kodunu aldım. Aldım daaa!!! Bunun içinden IP adresini bulup çıkarmak deve hendek olayı gibi birşey. Bu arada kimilerine “saçmalık” dedirtecek fikirler aklıma gelmedi değil hani (saçmalık dersiniz söylemeyeyim), ip adresini bulmak için… Sonra “bu işi çözerse regex(Regular Expressions - Düzenli İfadeler) çözer” dedim. Regex belirli bir kalıptaki ifadeleri algılayabilmek için kullanılan taslak tanımlarına deniyor. Internet sitesi adresi, email adresi, telefon numarası gibi veriler için kullanılır genelde. O zaman Ip adresi taslağı bulmamız gerekecek. Bir arama ile

string ipPattern = @”\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b”;

taslağını buldum.

        private ArrayList fncGetWanIpAddressListFromSource(string source)
        {
            ArrayList retVal = new ArrayList();
            string ipPattern = @”\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b”;
            Regex myRegex = new Regex(ipPattern);
            MatchCollection myMatchCollection = myRegex.Matches(source);
            foreach (Match myMatch in myMatchCollection)
            {
                retVal.Add(myMatch.Groups[0].Value);
            }
            return retVal;
        }
  
bu metod ile de gönderdiğimiz metin içerisinden IP formatındaki verileri bulup liste olarak alabiliyoruz.

Şimdi de bir başka sorun çıkmıştı. Buraya kadar hep ipadresimne.com’u örnek verdim fakat bu kodu denerken www.whatismyipaddress.com’u kullanıyordum ve buradan dönen listede farklı IP’ler vardı. İçlerinden birisi benim IP adresim, diğerleri ise sayfadaki paragraflar içinde yer alanlardı. Bunada bir çözüm bulmam gerekiyordu ve yine biraz zorladıktan sonra onu da buldum.

  private string fncFindWanIpAddress()
        {
            ArrayList aryLst_SiteIpAddresses = null;
            ArrayList aryLst_SiteIpAddressesTemp = null;
            aryLst_IpSites = new ArrayList();
            aryLst_IpSites.Add(”http://www.ipadresimne.com/“);
            aryLst_IpSites.Add(”http://www.ip-adress.com/“);
            aryLst_IpSites.Add(”http://whatismyipaddress.com/“);
            aryLst_IpSites.Add(”http://www.ipaddressworld.com/“);
            aryLst_IpSites.Add(”http://www.ipchicken.com/“);

            aryLst_SiteIpAddresses = new ArrayList();
            for (int i = 0; i < aryLst_IpSites.Count; i++)
            {
                aryLst_SiteIpAddressesTemp = new ArrayList();
                aryLst_SiteIpAddressesTemp = fncGetWanIpAddressListFromSource(fncGetSiteSource(aryLst_IpSites[i].ToString()));
                aryLst_SiteIpAddresses.AddRange(aryLst_SiteIpAddressesTemp);
            }

            aryLst_SiteIpAddressesTemp.Clear();
            for (int i = 0; i < aryLst_SiteIpAddresses.Count; i++)
            {
                if (!aryLst_SiteIpAddressesTemp.Contains(aryLst_SiteIpAddresses[i].ToString()))
                {
                    aryLst_SiteIpAddressesTemp.Add(aryLst_SiteIpAddresses[i].ToString());
                }
            }
            int count = 0, maxm = 0;
            string maxFoundedIpAdress = “”;

            for (int i = 0; i < aryLst_SiteIpAddressesTemp.Count; i++)
            {
                for (int j = 0; j < aryLst_SiteIpAddresses.Count; j++)
                {
                    if ((aryLst_SiteIpAddresses[j].ToString() == aryLst_SiteIpAddressesTemp[i].ToString()) && (i != j))
                    {
                        count++;
                    }
                }
                if (count > maxm)
                {
                    maxm = count;
                    maxFoundedIpAdress = aryLst_SiteIpAddressesTemp[i].ToString();
                }
                count = 0;
            }

            if (maxFoundedIpAdress.Length<7)
            {
                maxFoundedIpAdress = “Unknown”;
            }
            return maxFoundedIpAdress;
        }
  

Girdiğimde IP adresimi gösteren bir kaç internet sitesini aldım. Bu sitelerin kaynak kodlarına ulaşıp her birindeki IP adreslerini listeledim ve hepsinde en fazla bulunan ortak IP adresini aldım. İş o benim WAN IP adresimdi ve artık bendeydi.

Not : “Ya niye bu kadar kastın kolayı vardı” diyeniniz olursa yöntemini öğrenmek isterim. C#’da eğlenmek için geliştirilmiş bir proje metodları bunlar, maksat vakit geçirmekti ve hedefe ulaşmaktı. İkisi de yapıldı.

Slayt Gösterisi Başlat PicLens

4 Yorum

Yorum yap
  • Deniz Said:

    www.whatismyip.com sürekli sitesini wanIP’sini öğrenmek için parse edenler için bir sayfa açtı, sadece wanIP yazıyor bu sayfada (yalnızca 1 IP yani) adresi:

    http://www.whatismyip.com/automation/n09230945.asp

    bu sayfayı kullanırsan bir çok siteden aldığın IP’leri karşılaştırmak zorunda kalmamış olursun. Böylece “fncGetSiteSource” - “fncGetWanIpAddressListFromSource” fonksiyonlarıyla amacına ulaşırsın ;) hem de gayet temiz bir kod olmuş olur. Ancak güzel olmuş, dediğin gibi wanIP için kaynak kod çok az.

    İyi Çalışmalar

  • Deniz Said:

    ayrıca bu sayfaya da gözatabilirsin.
    http://www.codeproject.com/KB/system/routeripmonitor.aspx

    ancak bu sayfada wanIP’yi sayfadan parse etmek yerine modemden okuyor ve öncekiyle faklıysa e-mail gönderiyor.

  • frknc Said:

    @Deniz bu sayfanın varlığından haberdar değildim :) Gerçekten güzel bir sayfa ve dediğin gibi uğraşmadan çözüme ulaşmayı sağlayabilir.

    Aslında kendime yaptığım MyIP programcığı için sadece giren kişinin IP adresini yazan bir sayfa yapmayı düşünmüştüm aynen adresini verdiğin sayfa gibi. Böylece onu kullanabilir ve hiçbir sitede arama yapmak, bulduklarımı karşılaştırmak zorunda kalmazdım. Ancak o sayfayı yayınlamak için bir sunucu kullanmam gerekecekti falandı filandı. Ben bir yere bağımlı kalmak istemedim. Birden fazla siteyi taramamın nedeni de bu zaten. Hani olurda bu sitelerden biri veya birkaçı artık IP adresi yayınlamazlarsa diğerleri ile çalışmaya devam edebileyim.

  • Dark Said:

    Çok güzel bir kod az önce deneyip test ettim gayet başarılı eline sağlık

Yorumlar için RSS   Sitenizden Geri izleme

Yorum yap

Başa dön