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

Vyzkoušeli jsme FM štěnici: Když si vtipálci hrají na pirátské rozhlasové vysílání

Vyzkoušeli jsme FM štěnici: Když si vtipálci hrají na pirátské rozhlasové vysílání

** Dnes žádnou elektroniku programovat nebudeme ** Štěnice totiž funguje sama o sobě ** Stačí připojit baterii a naladit frekvenci

Včera | Jakub Čížek | 28

Microsoft: Zbavte se už konečně zastaralých a děravých Windows 7

Microsoft: Zbavte se už konečně zastaralých a děravých Windows 7

** Microsoft pomalu začíná kritizovat svůj nejpopulárnější OS ** Chce konečně dostat podniky na Desítky ** Bezpečnostní podpora Sedmiček vydrží ještě necelé tři roky

17.  1.  2017 | Jakub Čížek | 408

Takto si špičkoví grafici představují nový Facebook. S čistým vzhledem a bez reklam

Takto si špičkoví grafici představují nový Facebook. S čistým vzhledem a bez reklam

** Design Facebooku se delší dobu nemění a pro mnohé je nudným ** Grafici zkouší navrhovat nové koncepty toho, jak by mohla síť vypadat ** Hlasujte pro nejzdařilejší návrh

Včera | Stanislav Janů | 63

Umělá inteligence dokáže ze snímků srdce předpovědět, kdy zemřete

Umělá inteligence dokáže ze snímků srdce předpovědět, kdy zemřete

** Strojové učení lze skvěle použít pro vylepšení modelů pro předpověď srdečních komplikací ** Nová technologie umožňuje přesněji určit rizikové pacienty ** Dřívější diagnostika může díky včasně léčbě do budoucna zachránit životy

21.  1.  2017 | Karel Javůrek | 7

8 produktů, o kterých byste neřekli, že nesou značku Apple

8 produktů, o kterých byste neřekli, že nesou značku Apple

** Věděli jste, že Apple vyvinul celkem 45 modelů tiskáren? ** ** Monitor na výšku, plotter nebo herní konzole - to vše měl Apple ve své nabídce ** Většinu z těchto produktů pohřbil Steve Jobs

19.  1.  2017 | Stanislav Janů | 43


Aktuální číslo časopisu Computer

99 nejlepších programů pro váš počítač

Zvykejte si na umělou inteligenci

Velké testy PC zdrojů a gamepadů

Alternativní zdroje energie

reklama
reklama