C#’da Internet IP adresini almak: Get WAN IP Address
Araş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şlat4 Yorum
Yorum yapYorumlar için RSS Sitenizden Geri izleme
23 Şubat 2008 saat 18:00
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
23 Şubat 2008 saat 18:06
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.
24 Şubat 2008 saat 20:07
@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.
16 Temmuz 2008 saat 15:16
Çok güzel bir kod az önce deneyip test ettim gayet başarılı eline sağlık