Witam. Pisze program do obslugi poczty e-mail. Chcialbym napisac funkcje ktora sprawdzala mi obecny stan polaczenia z internetem, lecz nie wiem jak sie za to zabrac. Dodam że piszę pod Windowsa i wygooglowalem ze mozna jakos tak: system("ping blablabla"); ale to mnie nie satysfakcjonuje gdyz wielu programistow nie raz juz mi odradzalo uzywanie system("xx"); Bylbym wdzieczny gdyby ktos naprowadzil mnie na jakis latwy sposob rozwiazania mojego problemu.
I będziesz tak sprawdzał co chwila? Co będziesz pingował? A jeśli host pingowany będzie leżał?
Nie ma sensu się w to bawić. Jak dostaniesz błąd połączenia przy sesji SMTP/POP3/IMAP, to znaczy że z połączeniem prawdopodobnie jest coś nie tak. Jednakże nie ma znaczenia czy padło połączenie z netem, czy serwer poczty, czy user przez pomyłkę namieszał w konfiguracji firewalla. Istotną informacją jest, że klient poczty nie może się połączyć z serwerem.
Chyba wyraznie napisalem ze wlasnie nie chce stosowac tej metody. Fakt informacja ,że klient poczty nie może połączyć sie z serwerem jest wystarczająca, ale skoro już założyłem temat może ktorys z panów programistów udzieli mi jakiejś sensownej odpowiedzi... Nawet jeśli nie w tym programie to na pewno przyda mi się na przyszłość;)
Możesz pingować do stu różnych serwerów i jeżeli do żadnego nie dojdzie, to połączenia nie ma.
Tutaj masz najgorsze :D
Ale widzisz, nie ma uniwersalnej metody sprawdzenia czy jest połączenie z Internetem. Bo co to znaczy "połączenie z Internetem" od strony klienta? Czy połączenie z Internetem to jest wyjście ze szkieletu operatora? Do tego musisz znać topologię sieci ISP. A może wyjście ze szkieletu danego regionu? Albo państwa? Tutaj jest jeszcze gorzej, bo np. może paść nitka do Frankfurtu i hosty na Zachodzie Europy nie będą dostępne, ale te w Polsce będą odpowiadały bez problemu. Albo będą odpowiadały tylko te z danego regionu i np. do Poznania z Warszawy nie będziesz miał działającej drogi. Czy wtedy klasyfikujemy to jako brak dostępu do Internetu?
Internet to jest złożona sieć, a nie czarne pudełko, które działa lub nie. Ping jest najprostszą metodą testu czy mamy drogę do danego hosta (i czy ten host odpowiada), a nie do całego Internetu. Innego wiarygodnego testu nie ma, bo cała komunikacja opiera się na wysyłaniu pakietów w nadziei, że one dotrą do odbiorcy. Możesz dostać komunikat ICMP "no route to host", ale bez znajomości szczegółowej topologii i wszystkich możliwych tras nie wiesz czy to jest problem Twojego ISP, czy jakiegoś rutera hen daleko w świecie na drodze do hosta, czy też może host jest wyłączony.
Dlatego nigdzie nie masz sprawdzania dostępu do Internetu, tylko komunikaty w przypadku niepowodzenia połączenia z serwerem danej usługi.
Okej dotarło do mnie :D W sumie masz racje, z tej strony nie pomyślałem. Ale żeby chociaż nie zamykać tak szybko tematu moze podasz jakis sposob na pingowanie danego hosta?
Jeżeli zdecydujesz się na pisanie w .NET to w bardzo łatwy sposób można to zrobić. Swojego czasu, gdy miałem problem z łączem, a mianowicie co jakiś czas występowały na kilka, kilkanaście sekund takie duże skoki pingu i wyjątkowo bezczelnie UPC mnie zbywało (niech pan udowodni, u nas jest wszystko ok), napisałem sobie program, który je loguje.
mto9 napisał(a)
Ale żeby chociaż nie zamykać tak szybko tematu moze podasz jakis sposob na pingowanie danego hosta?
Jeśli używasz socketów, to możesz sam budować pakiety ICMP Echo Request, wysyłać i odbierać ICMP Echo Response. W Internecie znajdziesz różne źródła programów pingujących (np. ping.c z BSD).