  | 
	
 | 
  | 
  | 
  | 
| 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)  
 |   
 |   
 
 
 | 
  | 
  | 
  |