|
[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing] | |||||||||
|
||||||||||
|
V minulém článku jsme si ukázali překlad doménových jmen na IP adresy v OS Linux. Dnes vytvoříme stejný program jako minule, ale pro OS MS Windows®. Nejprve zopakuji, proč vlastně překládat doménová jména. Ti, kteří četli minulý článek, mohou přeskočit následující odstavec. V úvodním článku jsem si řekli, že IP adresa je číslo. Problém je v tom, že pamatovat si čísla
je velice nepraktické. Například kdo by si pamatoval http://212.80.76.3. Proto byly zavedeny
tak zvané doménové jména. Jedná se o textové řetězce, které se lépe pamatují. Například
http://www.seznam.cz zná u nás snad každý. Málo kdo ale ví, že předchozí dvě adresy jsou stejné.
Důvod, proč se zavedly doménové jména je čistě praktický. Rozhodneme-li se v našem programu v MS Windows® používat sokety, musíme inicializovat knihovnu soketů pomocí funkce WSAStartup. Nejprve si ale musíme povědět něco o struktuře WSADATA. Zkratka WSA umístěná před názvy některých funkcí a struktur znamená Win Socket Api. Všechny deklarace, které je potřeba vložit (include) do našich zdrojových textů jsou v hlavičkovém souboru winsock.h. Ten je ale vkládán do hlavičkového souboru windows.h. Patrně v každém Windowsovském programu je potřeba vkládat soubor windows.h, není proto potřeba se o deklarace soketových funkcí starat. Já budu ve svých příkladech vytvářet pro jednoduchost a názornost konzolové aplikace (o oknech tenhle seriál není), nemusel bych vkládat windows.h. Stačilo by winsock.h. Ale abych nikoho nemátl, budu používat jen windows.h. Další nutná věc je přilinkovat správnou knihovnu. V prostředí DEV-C++ je nutné přidat jako parametr pro linker -lwsock32. Používáte-li "čisté" MinGW32, je to parametr pro linker z příkazové řádky. U jiných vývojových prostředí se bude asi knihovna přilinkovávat trochu jinak. Struktura WSADATAInstance struktury WSADATA slouží k uchovávání informací o implementaci soketů (o knihovně soketů) na lokálním počítači. Tedy na počítači, na kterém běží program. Struktura obsahuje atributy:
Funkci WSAStartup předáme ukazatel na instanci této struktury. Funkce nám instanci naplní smysluplnými údaji. Funkce WSAStartupFunkce WSAStartup inicializuje knihovnu soketů. Je nutné funkci zavolat VŽDY, chceme-li pracovat se sokety. Samozřejmě se volá jen 1x v programu. Není nutné ji volat před každou "soketovou" funkcí. Nesmíme na to ale zapomenout. Jinak žádná funkce ze soketového API nebude fungovat. Hlavička funkce:
Tato funkce by měla být zavolána po ukončení práce se sokety. Typicky na konci programu. Samotný překladTím jsme vyřešili ty nejpodstatnější rozdíly při práci se sokety v MS Windows® a v Unixových OS. Sice ještě na nějaké rozdíly narazíme, ale ty nebudou až tak podstatné. Nyní v podstatě můžeme použít velkou část zdrojového textu z minulého dílu. Nyní zopakuji v podstatě věci, které jsme probrali v minulém díle. Ještě než se začneme věnovat samotnému výkladu potřebných datových struktur a funkcí, musím upozornit na jednu věc. Jak jsem napsal v úvodním článku, sokety byly jako první na operačním systému BSD. V Unixových operačních systémech jsou API funkce v podstatě stejné. V MS Windows® se funkce trochu liší, navíc také záleží na verzi použité knihovny. MS začíná v nových knihovnách zavádět nové funkce, které se dají použít místo starých. Já jsem zvyklý (a hlavně se snažím) používat stejné funkce v obou prostředích. Tím pádem ale používám některé funkce, které mohou být v oficiální dokumentaci označeny jako "staré" a může tam být doporučena některá z nových funkcí. Zvyk je železná košile, proto já tady budu "propagovat" soketové API verze 1.1. Dnes se ale používá dll verze 2.*. Nemusíte se ale bát, zpětná kompatibilita existuje. Můj přístup má hlavně tu výhodu, že zdrojové texty pro MS Windows® i pro Linux budou téměř stejné. Nikomu ale tyto funkce nevnucuji. Bude-li existovat k nějaké mnou uváděné funkci novější alternativa, upozorním na ni. StrukturyNejprve se podívejme na důležité struktury hostent a in_addr. Pro jejich deklarace a deklarace všech dalších struktur nebo funkcí je nutné vložit hlavičkový soubor windows.h. Ten už ale máme vložený kvůli WSAStartup. Struktura hostentInstance struktury slouží k uchování charakteristických informací o vzdáleném počítači. Atributy má v podstatě stejné jako její "Unixová obdoba". Popsal jsem je v minulém článku, nebudu je zde opisovat. Můžete se podívat na popis struktury hostent v minulém díle. Nebo se můžete rovnou podívat na oficiální dokumentaci strutkury hostent. Struktura v MS Windows® se od té, která je v Linuxu, liší pouze typem atributů h_addr_type a h_length, které nejsou int ale short int. Není to ale nijak podstatný rozdíl. Struktura in_addrInstance struktury je IP adresa. Vnitřek struktury nemusíme příliš znát. Uvnitř struktury se nalézá unie, která umožní různým funkcím pracovat s různě formátovanou adresou. Musíme ale vědět, že tato struktura existuje. Někdy na ní budeme přetypovávat adresy ve tvaru 1 prvku pole h_addr_list struktury hostent. Funkce pro práci s adresami a doménovými jményPro překlad doménového jména na IP adresu (resp. pro získání struktury hostent z doménového jména) slouží funkce gethostbyname. Chceme-li získat strukturu hostent na základě známe IP adresy, slouží nám k tomu funkce gethostbyaddr. Chceme-li získat IP adresu v pro člověka čitelném tvaru, použijeme funkci inet_ntoa. Jak vidíte, funkce v MS Windows® se jmenují stejně jako funkce v Unixových OS, které jsme probrali v minulém článku. Mají i stejné typy a pořadí parametrů. Je-li vše v pořádku, tak se dokonce i stejně chovají. Rozdíl je pouze v případě, že něco selže. V MS Windows ® při selhání nějaké funkce týkající se soketového API zjistíme kód chyby pomocí funkce WSAGetLastError.
Jako ukázkový příklad těchto funkcí si ukážeme program pro překlad doménových jmen. Program bude jednoduchá konzolová aplikace, která jako svůj parametr získá doménové jméno a vrátí informace o zadaném počítači.
Ukázkový příklad je ke stažení zde. Jedná se o projekt nástroje DEV-C++. Obsahuje také soubor Makefile pro překladač MinGW. Můžete program spustit a experimentovat. Chcete-li si zkusit adresu s alternativními názvy, můžete zkusit dát jako parametr našemu programu například adresu www.root.cz. Chcete-li vidět počítač s více IP adresami, můžete zkusit dát třeba www.post.cz PříštěPříště vytvoříme TCP klienta v Linuxu. Navážeme taky první TCP spojení. V dalším článku vytvoříme TCP klienta pro MS Windows® |