|
|
|
|
|
Zpracování chyb soketů v MS Windows
Dnes
si ukážeme jak rozpoznat a ošetřit chyby soketů v operačním systému
Windows. Popíšeme si funkce WSAGetLastError a WSASetLastError.
Předvedeme si příklad na funkci listen.
|
|
Zpracování chyb soketů v MS Windows
V dnešním článku se podíváme na způsob detekování chyb soketových
funkcí. Jedná se o velice jednoduché téma. Možná až trapně jednoduché (v
podstatě si ukážeme jen dvě jednoduché funkce).
Myslím ale, že pro člověka, který se sokety začíná, je rozumné se s
funkcemi WSAGetLastError a WSASetLastError seznámit.
V mých článcích jsem dodnes popsal mnoho soketových funkcí. Vždy jsem
uvedl 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 hodnotu makra SOCKET_ERROR. Nám ale mnohdy nestačí zjistit, že došlo k chybě. Zajímá nás ještě
k jaké chybě došlo.
Funkce WSAGetLastError
Jestliže návratová hodnota nějaké soketové funkce oznamuje chybu, můžeme zavolat funkci WSAGetLastError
a získat tak kód chyby. Význam chybového kódu zjistíme vždy z
dokumentace dané funkce. Seznam všech chybových stavů soketů je na
adrese http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp.
- int WSAGetLastError(void); - funkce vrací chybový kód poslední soketové funkce, která neproběhla úspěšně.
Funkce WSASetLastError
Funkce nám umožní nastavit chybový kód, který vrátí funkce WSAGetLastError při příštím zavolání. Jestliže mezi voláním WSASetLastError a WSAGetLastError je volána soketová funkce, která skončí chybou, bude WSAGetLastError
vracet kód poslední chyby, nikoliv kód nastavený funkcí WSASetLastError. Má-li naše aplikace více vláken, zavolání funkce WSASetLastError nebo chyba v soketové funkci v jednom vlákně nemá vliv na výsledek volání WSAGetLastError ve vláknech jiných. Hlavička funkce:
Jako příklad si uvedeme kousek zdrojového textu, který nám ošetří chyby, které mohou vzniknout při volání funkce
listen.
if (listen(mainSocket, 10) == SOCKET_ERROR)
{
cerr << "Problém s vytvořením fronty" << endl;
switch (WSAGetLastError())
{
case WSANOTINITIALISED:
cerr << "Nebyla inicializována knihovna soketů \
pomocí WSAStartup" << endl; break;
case WSAENETDOWN:
cerr << "Nepracuje síť" << endl; break;
case WSAEADDRINUSE:
cerr << "Adresa nebo port jsou již používány. \
Jedná se spíše o chybu funkce bind. \
Někdy se ale projeví až u listen." <<endl;break;
case WSAEINPROGRESS:
cerr << "Zároveň probíhá blokovací operace." <<endl;break;
case WSAEINVAL:
cerr << "Soket není svázán s adresou síťové \
karty a číslem portu. Nejprve musíte \
zavolat funkci bind. Až poté listen."<<endl;break;
case WSAEISCONN:
cerr << "Soket je již spojen." << endl; break;
case WSAEMFILE:
cerr << "Příliš mnoho otevřených soketů." << endl; break;
case WSAENOBUFS:
cerr << "Nepodařilo se vytvořit frontu požadavků. \
Není dostatek místa pro buffer." << endl; break;
case WSAENOTSOCK:
cerr << "První parametr funkce listen není \
identifikátor soketu." << endl; break;
case WSAEOPNOTSUPP:
cerr << "Nelze zavolat funkci listen na daný typ \
soketu." << endl; break;
default :
cerr << "Nechápu co se stalo :-]" << endl;
}
}
|
|
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ý text 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é.
Hodnocení článku |
1 |
2 |
3 |
4 |
5 Aktuální známka: 2.70 (Počet známek: 9498)
|
|
|
|
|
|