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í, Jednotlivá adresa, Používaná verze, Catch, Adresa, Práce, Díl

Určitě si přečtěte

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

Velká podzimní aktualizace Windows 10 je tady: Co přináší Fall Creators Update

** Po půl roce je tu další aktualizace Windows ** A opět přináší hlavně hromadu drobných kosmetických vylepšení ** Podívali jsme se na ty nejzajímavější

17.  10.  2017 | Jakub Čížek | 182

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

Budoucností Windows 10 je Fluent Design. Takto bude jednou vypadat celý systém

** Fluent Design je vzhled, do kterého postupně Microsoft převleče celý systém ** Staví na průhlednosti a velkých plochách ** Do Windows 10 se z části dostane už zítra při vydání podzimní aktualizace

16.  10.  2017 | Stanislav Janů | 155

Nejlepší optické iluze: Z toho vám půjde hlava kolem

Nejlepší optické iluze: Z toho vám půjde hlava kolem

** Mozek se nechá snadno ošálit, a to mnoha způsoby ** Podívejte se na několik nejlepších optických iluzí ** Iluze dokazují, že vnímání reality může být značně zkreslené

16.  10.  2017 | Vojtěch Malý

Tesla nestíhá, přesto propustila stovky zaměstnanců

Tesla nestíhá, přesto propustila stovky zaměstnanců

15.  10.  2017 | Markéta Mikešová | 30


Aktuální číslo časopisu Computer

Nový seriál o programování elektroniky

Otestovali jsme 17 bezdrátových sluchátek

Jak na nákup vánočních dárků ze zahraničí

4 tankové tiskárny v přímém souboji