Code Challenge #1

Dün Emre (nam-ı diğer kara) arkadaşımla internette gezerken, bir youtube video’suna denk geldik. Emre’nin bilgisayarındaki hosts dosyasında güncel youtube ip adresleri olmadığı için videoyu izleyemedik.

Aklımıza, youtube domainine ait ip adreslerini otomatik olarak bulacak ve hosts dosyasını güncelleyecek bir uygulama yazmak geldi. Öğle yemeğine çıkmamıza 15 dakika olduğu için, bunu bir yarışa dönüştürmeye karar verdik.

İşte Yarışmanın Kuralları;

  • youtube.com, www.youtube.com, img.youtube.com alan adlarının ve v{1-24}.lscache{1-8}.c.youtube.com formatındaki alan adlarının ip adresleri otomatik olarak çözümlenecek
  • Domain adından IP adresini çözen bir servis kullanılacak (Ben böyle bir web service bulamadım, o yüzden http://www.hcidata.info/host2ip.cgi adresindeki formu kullandık)
  • Sonuç bilgisi C:\Windows\System32\drivers\etc\ altındaki hosts dosyasına otomatik olarak yazılacak
  • Uygulamayı yazma - test etme ve çalıştırma sonucunda, ilk kimin uygulaması hosts dosyasını güncellerse kazanmış olacak YoutubeHostDuzenleyici_2

Sizinde 15 dakikanız var, code challenge‘ımıza katılmak ister misiniz?

Benim çözümümü görmek için 

Ben öncelikle http://www.hcidata.info/host2ip.cgi adresindeki formu inceleyerek başladım;

YoutubeHostDuzenleyici_1

WebRequest sınıfından bir örnek oluşturdum, sayfanın çıktısını GetResponse() methodu ile alarak WebResponse sınıfında bir nesnede sakladım. StreamReader nesnesini kullarak, sayfanın HTML çıktısını string tipinde bir değişkene atadım.

v{1-24}.lscache{1-8}.c.youtube.com adreslerinin ip adreslerini bulmak için içiçe iki paralel for döngüsü kurdum.

response değişkeninde oluşan HTML’i parse ederek, ip adresine ulaştım.

hosts dosyasında youtube.com adresli satırları bulmak ve güncellemek için .Net Regular Expression (Regex) classını kullandım.

Son olarak, bu kodları fonksiyon haline getirdim;

private void btnIPBul_Click(object sender, EventArgs e) { txtHosts.Clear(); StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“youtube.com”), “youtube.com”)); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“www.youtube.com”), “www.youtube.com”)); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(“img.youtube.com”), “img.youtube.com”)); Parallel.For(1, 9, iLoop => { Parallel.For(1, 25, yLoop => { string url = string.Format(“v{0}.lscache{1}.c.youtube.com”, yLoop, iLoop); sb.AppendLine(string.Format(“{0}\t{1}”, FindIP(url), url)); }); });

txtHosts.Text = sb.ToString(); }

private string FindIP(string AddressToLookUp) { WebRequest r = WebRequest.Create(string.Format(“http://www.hcidata.info/host2ip.cgi?domainname={0}&findIP=Find IP Address&ipaddress=127.0.0.1”, AddressToLookUp)); WebResponse s = r.GetResponse();

StreamReader sr = new StreamReader(s.GetResponseStream(), Encoding.UTF8);
string response = sr.ReadToEnd();

sr.Close();
s.Close();

string ipAddress = response.Substring(response.IndexOf("IP Address : ") + 13, 16);

return ipAddress.Substring(0, ipAddress.IndexOf("\n")); }

private void btnHostsGuncelle_Click(object sender, EventArgs e) { if (txtHosts.Text == “”) btnIPBul.PerformClick();

Regex r = new Regex(@"^(.*youtube\.com)");
StringBuilder sb = new StringBuilder();

foreach (string line in File.ReadAllText(@"C:\Windows\System32\drivers\etc\hosts").Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
    if (!r.IsMatch(line))
        sb.AppendLine(line);

sb.AppendLine();
sb.AppendLine();
sb.AppendLine("# youtube.com IP'leri Buradan Başlıyor");
sb.Append(txtHosts.Text);

File.WriteAllText(@"C:\Windows\System32\drivers\etc\hosts", sb.ToString()); }

Uygulamanın kodlarını buradan indirebilirsiniz.

İlgili diğer makaleler

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı