|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
![]() |
|||||||||
![]() |
![]() |
|||||||||
![]() ![]() ![]() |
||||||||||
![]() |
![]() |
|||||||||
|
![]() |
![]() |
||||||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
Dnes se podíváme na způsob identifikace a zpracování chyb soketů v operačním systému Linux. V mých článcích jsem dodnes popsal mnoho soketových funkcí. Vždy jsem upozornil jak poznat, že funkce proběhla bez chyb. Většinou se jedná o přečtení návratové hodnoty funkce, která nám oznámila, jestli operace proběhla bez chyby nebo s chybou. Například jsem napsal, že funkce gethostbyname vrací v případě chyby NULL. Nebo funkce connect vrací v případě chyby -1. Nám ale mnohdy nestačí zjistit, že došlo k chybě. Zajímá nás ještě k jaké chybě došlo. V operačním systému Linux existuje obecný mechanizmus pro zjišťování chyb při volání knihovních funkcí. Vše se točí kolem externí proměnné errno. Mechanizmus, který si zde popíšeme je použitelný pro jakékoliv funkce standardní knihovny nebo knihovních funkcí jádra. Můžeme dokonce do proměnné errno ve svých funkcích zapisovat. Proměnná errno se používá velice často. Přesto jsem zjistil, že například funkce gethostbyname (a další funkce pro práci s DNS) ji nepoužívá. Místo ní používá rovněž externí proměnnou h_errno. Princip práce s h_errno je velmi podobný principu práce s errno. Externí proměnná errnoChceme-li používat proměnnou errno, musíme vložit (include) hlavičkový soubor errno.h. Ve svém programu deklarujeme proměnnou errno s modifikátorem extern.
Pro úplnost připomínám, že tento modifikátor nám (a hlavně linkeru)
oznamuje, že proměnná je ve skutečnosti deklarována v jiném modulu a my
jí chceme používat. Budeme ji tedy vlastně sdílet s jiným modulem.
Proměnná errno je typu int. Takže deklarace vypadá takto:
Parametrem funkce strerror a prvním parametrem strerror_r je většinou hodnota proměnné errno. Doporučuji používat raději tyto funkce než přímo indexovat pole sys_errlist. Indexem pole sys_errlist je také většinou hodnota proměnné errno. Při přímém přístupu k prvkům pole sys_error může nastat situace, že errno > sys_nerr - 1. Je to způsobeno tím, že některé nové chyby nemusí mít svou textovou reprezentaci. Zvláště u starších jader operačního systému. Budete-li přímo přistupovat k poli sys_errlist, nesmíte nikdy na tuto věc zapomenout. Nyní si pro ukázku předvedeme, jak by vypadalo ošetření chyb při volání funkce connect. Ošetření chyb funkce connect
Můžete zkusit zaplnit strukturu serverSock sice platnou IP adresou, ale špatným číslem portu. Mám na mysli číslo portu, na kterém na dané adrese určitě žádná aplikace neposlouchá. Zjistíte, že vznikne chyba, kterou nemám v konstrukci switch ošetřenou. Já jsem vycházel z manuálových stránek funkce connect, kde jsou jen některé chyby. Je u nich napsáno upozornění, že se nejedná o všechny chyby. Více chyb můžete například nalézt v manuálových stránkcách k pojmu TCP nebo IP. Externí proměnná h_errnoPomocí errno můžeme rozpoznávat chyby vzniklé při volání celé škály funkcí, nejen funkcí majících nějakou souvislost se sokety. Aby to ale nebylo tak jednoduché, existuje ještě proměnná h_errno. Je používána nám již známou funkcí gethostbyaddr, která slouží pro překlad doménových jmen na IP adresy. Proměnná h_errno je používána více funkcemi, které mají nějakou souvislost s DNS. Práce s proměnnou h_errno je velmi podobná práci s proměnnou errno. Zavoláme funkci gethostbyname a v případě že volání končí chybou (funkce vrací NULL), je kód chyby uložen v proměnné h_errno. Pro práci s proměnnou h_errno můžeme použít funkci herror.
Možná vám teď připadá, že proměnná h_errno je zbytečná. Že je to něco navíc. Že by jsme mohli používat errno ve všech případech. Alespoň mě to tak připadá. Zavedení dvou proměnných podle mne jen dělá zdrojový text nepřehledným. Jestli někdo zná důvod zavedení proměnné h_errno pro některé funkce, ať jej prosím napíše jako komentář pod článek. S důvodem zavedení proměnné h_errno můžeme polemizovat a můžeme s ním dokonce i nesouhlasit. Ale to je tak asi všechno, co s tím můžeme udělat. Proto nám nezbývá nic jiného, než se podívat na ošetření chyb při volání funkce gethostbyname. Ošetření chyb funkce gethostbyname
Tím jsme si ukázali, jak identifikovat a ošetřit chyby soketových funkcí. Dnes není nic ke stažení. Bylo by zbytečné vytvářet nějaké příklady. Zdrojové texty z článku si můžete sami vepsat do mých příkladů z předchozích článků. V programech by měly být ošetřeny všechny možné chyby. Já to ale ve svých budoucích článcích dělat nebudu. Mé příklady jsou jednoduché ukázky a nechci je mít příliš složité a nepřehledné. Příště se podíváme na ošetření chyb soketových funkcí v MS Windows®. |
![]() |
![]() |
![]() |