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

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

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 36

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 133

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

** Každý bastlíř se po čase neobjede bez armády švábů ** Dnes si některé z nich vyzkoušíme ** Třeba zázračný posuvný registr

19.  2.  2017 | Jakub Čížek | 39

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

AMD oficiálně představilo procesory Ryzen. Známe i jejich české ceny

** AMD uvedlo první tři procesory Ryzen 7 ** Všechny budou pracovat s osmi jádry a šestnácti vlákny ** Na pulty obchodů se dostanou už za týden

22.  2.  2017 | Stanislav Janů | 131

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

EU se děsí Windows 10. Prý o nás vědí až příliš. Microsoft chystá změny

** Evropští úředníci chtějí, aby byly Desítky transparentnější ** Microsoft od jara skutečně chystá změny ** Ochráncům soukromí to ale nestačí

21.  2.  2017 | Jakub Čížek | 218

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

Remix Singularity: Microsoft si na tom vylámal zuby. Jak dopadne Android?

** Microsoft do svých telefonů integroval desktopové prostředí ** Moc to ale nevyšlo, chyběl pořádný výkon ** Teď to zkoušejí ex-googleři s Remix Singularity

23.  2.  2017 | Jakub Čížek | 73


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných špuntových sluchátek

Příslušenství do USB-C

reklama
reklama