Zpracování chyb soketů v MS Windows - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Zpracování chyb soketů v MS Windows

cpp net

24. března 2003, 00.00 | 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é.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: