Program - problem z brakiem internetu

dział ogólny

Program - problem z brakiem internetu

Postprzez mko000 » niedziela, 7 lutego 2010, 13:35

Witam. Pisze program który korzysta za pomocą soketów z internetu. Na początku programu sprawdzam czy połączenie z internetem jest. Problem pojawia się gdy w trakcie pracy programu nagle zabraknie internetu. Wywala mi błąd =-coś z soketem. Jak przechwycić ten błąd ?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez polymorphism » niedziela, 7 lutego 2010, 13:41

Błąd czy wyjątek? Jeśli to drugie, patrz try...catch (ESocketError?).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » niedziela, 7 lutego 2010, 15:56

Wyjątek możesz przechwycić tak:

Kod: Zaznacz cały
// Funkcja zwracająca błąd:
void ErrorExit(String lpFun)
{
   LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;

    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
      (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(lpFun.t_str())+40)*sizeof(TCHAR));
    wsprintf((LPTSTR)lpDisplayBuf,
        TEXT("%s failed with error %d: %s"),
      lpFun, dw, lpMsgBuf);
   MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
   ExitProcess(dw);
}
//---------------------------------------------------------------------------

// gdzieś w kodzie, w miejscu z którego chcesz przechwycić wyjątek wstawiasz taki kod:

ErrorExit("Twoja treść komunikatu: ");  // twoja treść komunikatu - to dowolny tekst, który opisuje błąd, resztę doda funkcja ErrorExit


To rozwiązanie jest lepsze od try catch, ale może być użyte w połączeniu z tą metodą.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez mko000 » niedziela, 7 lutego 2010, 16:33

Podczas działania aplikacji wyskakuje MessageBox z napisem Asynchronous socket error 10065 i aplikacja kończy działanie. Problem z tym try catch jest taki ze mam dużo kodu i trudno by było umieścić wszytko.

Z braku innych opcji postanowiłem wszystkie wysylania i odbierania danych dac w try catch lecz niestety nic nie pomaga. Gdy internet przestanie działać wyjątek się pokazuje znów.
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » niedziela, 7 lutego 2010, 18:10

To niewiele mówi o problemie. Przechwyć tylko wyjątek związany z aktywnością sieciową.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez polymorphism » niedziela, 7 lutego 2010, 22:37

Cyfrowy Baron napisał(a):Wyjątek możesz przechwycić tak: (...)

Nie bardzo rozumiem, jakim cudem ta funkcja ma przechwycić jakikolwiek wyjątek?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » poniedziałek, 8 lutego 2010, 10:12

Przechwycić to źle powiedziane, chodziło mi raczej o wyświetlenie komunikatu ostatniego błędu, wywołanie tej funkcji w dowolnym miejscu programu zaowocuje wyświetleniem komunikatu o ostatnim błędzie.

Patrz fragment:

Kod: Zaznacz cały
DWORD dw = GetLastError();


Tyle to już chyba potrafisz się domyśleć?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez polymorphism » poniedziałek, 8 lutego 2010, 10:39

Owszem, tylko w kontekście tego, o co pytał mko000, Twój przykład z funkcją ma się nijak do tematu, stąd moje pytanie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » poniedziałek, 8 lutego 2010, 11:04

Ma się jak najlepiej do tematu, gdyż pozwala wychwycić błąd.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez polymorphism » poniedziałek, 8 lutego 2010, 11:28

No nie bardzo. Problemem jest niemożność przechwycenia błędu/wyjątku, w sensie zapewnienia jego obsługi, a nie wyświetlenie jego pełnej treści. Zresztą twierdziłeś, że Twoja funkcja jest lepszym rozwiązaniem niż użycie bloków try/catch, co jest zupełnym nieporozumieniem, ponieważ przeciwstawiasz dwie różne sprawy.




@mko000, próbowałeś dać obsługę zdarzenia TBaseSocket::OnError, bo z tego, co mam napisane w dokumentacji wynika, że brak obsługi tego zdarzenia spowoduje, że sockety wszelkie błędy będą zgłaszać poprzez rzucenie wyjątkiem.

Myślę, że to to...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez mko000 » poniedziałek, 8 lutego 2010, 17:07

polymorphism napisał(a):Błąd czy wyjątek? Jeśli to drugie, patrz try...catch (ESocketError?).

Tak. To jest właśnie ten błąd. Tylko problem że nie wiem w którym miejscu on występuje. Dałem w try catch wszystkie polecenia związane z ClientSocket1 a dalej po nagłym odcięciu internetu pojawia się ten wyjątek. Czy może to być spowodowane funkcją OnRead ClientSocket1?
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » poniedziałek, 8 lutego 2010, 17:28

A możesz podać jakiś kod?

To w C++Builder 2010 są sockety?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez polymorphism » poniedziałek, 8 lutego 2010, 17:54

mko000, czytałeś to, co do Ciebie napisałem w poprzednim poście?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez Cyfrowy Baron » poniedziałek, 8 lutego 2010, 19:22

W C++builder 2010 występuje klasa TBaseSocket ale nie jako komponent.

Najpierw należy odpowiedzieć na pytanie z jakich socketów korzystasz? Czy z tych dostępnych na zakładce DataSnap Client, czy też doinstalowałeś sobie stare sockety?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Program - problem z brakiem internetu

Postprzez mko000 » poniedziałek, 8 lutego 2010, 19:40

Doinstalowałem stare sokety z BCB6 ponieważ na tych nowych połączenie z gg nie działało. A co do tego co napisałeś polymorphism to w zdarzeniu OnError wyłączam ClientSocket1 (ClientSocket1->Active = false;) lecz to nic nie daje.
Avatar użytkownika
mko000
Homos antropiczny
Homos antropiczny
 
Posty: 74
Dołączył(a): sobota, 19 grudnia 2009, 00:30
Podziękował : 35
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2010
    Windows XPFirefox

Następna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości