reklama

Poznáváme C# a Microsoft .NET – 70. díl – Práce s DNS a další užitečné třídy pro práci v síti

Po několika minulých dílech, které se zabývali problematikou síťového software pro platformu .NET si dnes něco povíme o několika třídách, které nám v určitých situacích mohou zpříjemnit náš „programátorský“ život při vývoji síťových aplikací.

Třídy pro práci s URI

Během našeho probírání se světem síťového programování jsme v příkladech, které přistupovali ke vzdáleným zdrojům pro vyjádření cíle používali adresy URI v podobě řetězce. Poměrně užitečnou třídou, jejíž instance se v určitých případech může vyplatit vytvořit, je třída Uri, která se nachází v základním jmenném prostotu System.

Díky instancí této třídy jsme schopni analyzovat jednotlivé složky adresy URI a kromě toho také tyto adresy zpracovávat, porovnávat a spojovat. Využití této třídy může být užitečné i například ve spojení se třídou WebRequest, kde jedna s přetížených verzí metody Create očekává právě instanci třídy System.Uri.

Pomocí instančních vlastností určených pro čtení této třídy jsme tedy schopni získat informace o jednotlivých složkách adresy URI jak ukazuje následující příklad.

public static void UseUri()
{
  Uri ziveWeb = new Uri("
/SomePage.aspx?param=true");
  //?param=true
  Console.WriteLine("Dotazovaci retezec : {0}", ziveWeb.Query);
  //http
  Console.WriteLine("Schema URI : {0}", ziveWeb.Scheme);
  //www.zive.cz
  Console.WriteLine("DNS jmeno serveru : {0}", ziveWeb.Host);
  //Dns
  Console.WriteLine("Typ adresy v URI : {0}", ziveWeb.HostNameType);
  //SomePage.aspx
  Console.WriteLine("Absolutni cesta: {0}", ziveWeb.AbsolutePath);
  //80
  Console.WriteLine("Port : {0}", ziveWeb.Port);
  //True
Console.WriteLine("Port je vychozi pro dane schema : {0}", ziveWeb.IsDefaultPort);
}

Jednou z mnoha operací, ke kterým lze instanci třídy Uri použít je získání relativní cesty ke zdroji na základě jiné adresy URI a to použitím metody MakeRelative (v případě .NET 2.0 použijte MakeRelativeUri). Této instanční metodě předáme adresu, která směřuje na vnořený zdroj a výsledkem se nám dostane relativní cesta k adrese, na jejíž reprezentaci byla metoda zavolána. Pro lepší pochopení je zde pár řádek kódu.

Uri ziveWeb = new Uri("/SomePage.aspx");
Uri zive = new Uri("
");
string relativePath = zive.MakeRelative(ziveWeb);
//Vysledek je SomePage.aspx
Console.WriteLine(relativePath);

Druhou třídou pro práci s URI adresami je třída UriBuilder, která nám umožňuje sestavit adresu po složkách a hodí se v situacích, kdy kvůli změně jedné složky adresy URI nechceme vytvářet novou instanci třídy System.Uri (její instanční vlastnosti pro vyjádření složek jsou pouze pro čtení). Instanci třídy Uri z instance třídy UriBuilder získáme přečtením její instanční vlastnosti Uri.

UriBuilder builder = new UriBuilder("http", "www.zive.cz", 80, "SomePage.aspx", "?param?true");
///SomePage.aspx?param?true
Console.WriteLine(builder.Uri.ToString());
builder.Path = "AnotherPage.aspx";
///AnotherPage.aspx?param?true
Console.WriteLine(builder.Uri.ToString());

Využití DNS

Věřím, že většina čtenářů ví o tom, jakým způsobem jsou rozpoznávány jednotlivé uzly v síti internet. Tedy, že se tak děje na základě IP adres, které umožňují jednoznačné určení uzlu v této rozlehlé síti. Pro ty co toto slovo slyší poprvé je zde pouze velmi stručné info.

IP adresa ve verzi IPv4, což je ještě v dnešní době používaná verze, se zapisuje čtveřicí čísel od 0 do 255, tedy například 192.168.1.1. Jistě mi dáte zapravdu, že kdyby se pro vyhledávání uzlů v internetu používal tento způsob, nebylo by surfování zrovna jednoduché. Naštěstí existuje systém DNS, který umožňuje používat pro lidi mnohem srozumitelnější vyjádření typu . Systém DNS po tom pomocí takzvaných jmenných serverů tento název přeloží na IP adresu a vlastní požadavek je tedy proveden na ni.

Ale zpátky k programování v .NET. Samozřejmě je možné služeb toho systému využívat i z našich aplikací pomocí několika, k tomu určených tříd. První z těchto tříd je třída IPAddress, která jak název napovídá, zastupuje vlastní IP adresu ;-) Pomocí statických vlastností této třídy můžeme získat instance představující takzvanou všesměrovou adresu (broadcast) nebo adresu vlastního počítače (loopback neboli localhost).

IPAddress broadcastAddress = IPAddress.Broadcast;
IPAddress loopbackAddress = IPAddress.Loopback;
string broadcast = broadcastAddress.ToString();
string loopback = loopbackAddress.ToString();
Console.WriteLine(broadcast);
Console.WriteLine(loopback);

Cestou k získání instance třídy IPAddress na základě konkrétního číselného vyjádření je použití statické metody Parse. Naopak pro získání známého číselné vyjádření zastoupené IP adresy je možné použít překryté metody ToString.

Console.Write("Zadejte IP adresu (napr. (192.168.1.1.) : ");
try
{
  string addressString = Console.ReadLine();
  IPAddress address = IPAddress.Parse(addressString);
  Console.WriteLine(address.AddressFamily);
  Console.WriteLine(address.ToString());
  Console.WriteLine(IPAddress.IsLoopback(address));
}
catch(FormatException)
{
  Console.WriteLine("Zadana adresa nema spravny format");
}

Na takto vytvořené instanci můžeme využit její vlastnosti k určení typu adresy nebo zjistit jestli se například nejedná o adresu vlastního uzlu (loopback), jak je ukázáno ve zdrojovém kódu příkladu.

Pro využití služeb systému DNS je v základní knihovně tříd .NET frameworku třída příhodně nazvaná Dns ze jmenného prostoru System.Net. Takže pokud budeme chtít zjistit srozumitelný název pro nějakou adresu IP využijeme metody právě této třídy a to metody GetHostByAddress (v .NET 2.0 je doporučeno použit metody GetHostEntry) jak ukazuje následující příklad.

Console.Write("Zadejte IP adresu (napr. (194.228.50.104) : ");
try
{
  string addressString = Console.ReadLine();
  //vytvoreni instance tridy IPAddress
  IPAddress address = IPAddress.Parse(addressString);
  //ziskani DNS zaznamu
  IPHostEntry hostEntry = Dns.GetHostByAddress(address);
  Console.WriteLine(hostEntry.HostName);
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString());
}

Pokud záznam pro danou adresu IP není v databázi systému DNS nalezen je vyhozena výjimka SocketException, ale v případě úspěšného nalezení záznamu je tento záznam navrácen v podobě instance třídy IPHostEntry, kde pomocí její instanční vlastnosti HostName zjistíme požadovaný srozumitelný název.

Dost často ovšem budeme potřebovat využít služeb systému DNS z opačné strany, tedy tak, že na základě srozumitelného názvu získáme asociovanou adresu či adresy. K tomuto účelu využijeme opět třídy Dns, ale nyní metodu Resolve (v .NET 2.0 je doporučeno použit opět metody GetHostEntry) a následně přečteme vlastnost AddressList na získaném objektu IPHostEntry.

Console.Write("Zadejte adresu cile (napr. www.zive.cz) : ");
string hostName = Console.ReadLine();
try
{
  //vyuziti systemu DNS pro ziskani IP adresy podle nazvu
  IPHostEntry host = Dns.Resolve(hostName);
  IPAddress[] addressList = host.AddressList;
  foreach(IPAddress address in addressList)
  {
    Console.WriteLine(address.ToString());
  }
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString());
}

Příklady ke článku naleznete zde.

Témata článku: Software, Microsoft, Programování, Catch, Nema

2 komentáře

Nejnovější komentáře

  • Pavel Polívka 24. 11. 2007 13:58:10
    Programovou oflline verzi seriálu naleznete ke stažení na...
  • Milan 24. 4. 2006 8:12:01
    Nevite prosim jak ziskat IP adresu klienta, tj, uživatele který si...
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 102

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74


reklama