[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (58811)
ASP (1464)
ActiveX (163)
Allegro (126)
Assembler (3699)
C++ Builder (21656)
C/C++ (39174)
Databáze (27980)
Delphi (71030)
DelphiX (1575)
DirectX (1427)
Java (34885)
JavaScript (11036)
Matematické programy (1906)
OOP a UML (579)
OpenGL (6612)
Php (61391)
PowerBuilder (457)
Problémy a algoritmy (8579)
Programování v Linuxu (1837)
Právo a programování (3146)
Python (1076)
Ruby (128)
Visual Basic (11529)
Visual C++ (12469)
Wap (56)
Web (10262)
Web servery (5238)
Win32 (12737)
Windows CE (830)
XML/XSL (1655)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • 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.
    Sokety a C++
    Předchozí díl: Zpracování chyb soketů v Linuxu

    Autor: Radim Dostál
    Rubrika: C/C++
    Publikováno: 24.03. 2003
     Tisk článku
    Poslat odkaz emailem
     

    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é.


    Zpět na začátek stránky

    Autor: Radim Dostál
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.70
    (Počet známek: 9498)

    Komentáře k článku
    Josef Chmel14.06.20:27Zpracování chyb soketů v MS Windows
    petriiik26.06.15:57RE: Zpracování chyb soketů v MS Windows
    Radim Dostál29.05.8:59POKRAČOVÁNÍ
    Grant25.07.17:10RE: POKRAČOVÁNÍ - nová adresa
    Pavel03.04.13:27dial-up
    Radim Dostál29.05.8:53RE: dial-up
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena