Ĺadny brzuch
Witam
W swoim programie pobieram za pomocą idhttp plik tekstowy z mojego serwera i wrzucam do memo.
memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt);
Ale czasami (np dzisiaj) serwer nie działa i podczas próby połączenia wyskakuje komunikat "Socet error #10060 conection timer out" trochę mnie to drażni ponieważ w tym momencie zwiesza mi się cała aplikacja. Taka sytuacja też jest w momencie gdy padnie mi internet.
Pomyślałem aby przed przystąpieniem do pobrania pliku sprawdzić ping strony czy działa. Zrobiłem to za pomocą IdIcmpClient
kod
procedure TForm1.Button3Click(Sender: TObject); var i : integer; begin //ustawiamy czas oczekiwania IdIcmpClient1.ReceiveTimeout := 1000; //wyłączamy dostępność przycisku button button1.Enabled := False; try //ustawiamy adres IP IdIcmpClient1.Host := Edit1.Text; //wykonujemy pętlę 20 razy for i := 1 to 5 do begin //wysyłamy polecenie Ping IdIcmpClient1.Ping; //pozwalamy odetchnąć systemowi ? obsłużyć komunikaty Windows Application.ProcessMessages; //dodatkowo można wykonać opóźnienie ? w tym przypadku 1 sekundy sleep(1000); end; finally //finalizując włączamy dostępność przycisku button button1.Enabled := True; end; end;
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus); var sTime: string; //nowa zmienna typu string begin //sprawdzanie błedów odpowiedzi ping'a (AReplyStatus.MsgType?) if (AReplyStatus.MsRoundTripTime = 0) then sTime := '<1' //ustawienie wartości zmiennej dla wartości mniejszych niż 1 else sTime := '='; //ustawienie wartości zmiennej //wypełnienie komponentu Memo odpowiednio: ilością przesłanych bajtów, //kolejnym numerem ID, czasem życia, zmienną sTime, czasem oczekiwania na odpowiedź Memo1.Lines.Add(Format('%d bytes from %s: Sequence ID=%d TTL=%d Time%s%d ms', [AReplyStatus.BytesReceived, AReplyStatus.FromIpAddress, AReplyStatus.SequenceId, AReplyStatus.TimeToLive, sTime, AReplyStatus.MsRoundTripTime])); end;
jeśli jest połączenie to wiadomo wyświetli się w memo np
72 bytes from 32.435.543.67 : Sequence ID=3489 TTL=55 Time=180 ms //ip przykładowe
a jeśli nie ma to
0 bytes from 0.0.0.0: Sequence ID=3489 TTL=0 Time=1112 ms
i sprawdzam czy ip = 0.0.0.0 jesli nie to wchodzę na stronę memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt);
ale chciałbym się dowiedzieć czy to nie jest głupi pomysł może jest coś prostszego i lepszego do zastosowania ??
Użytkownik ari123 edytował ten post 04 marzec 2009, 18:23
1. Można przecież sprawdzić, czy jest połączenie z netem, co zresztą było na forum - przykładowo http://forum.ks-eksp...showtopic=15489.
2. Czasami pingi są blokowane przez serwer...
Cyrkiel gdzieś czytałem, że ten sposób nie działa prawidłowo na wszystkich komputerach dlatego próbowałem to jakoś obejść aby mieć pewność, że zadziała ... serwer na którym mam stronę nie blokuje pinga
a próbowałeś:
try memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt) except begin ShowMessage('Nie można pobrać pliku'); Close; end;
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
W swoim programie pobieram za pomocą idhttp plik tekstowy z mojego serwera i wrzucam do memo.
memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt);
Ale czasami (np dzisiaj) serwer nie działa i podczas próby połączenia wyskakuje komunikat "Socet error #10060 conection timer out" trochę mnie to drażni ponieważ w tym momencie zwiesza mi się cała aplikacja. Taka sytuacja też jest w momencie gdy padnie mi internet.
Pomyślałem aby przed przystąpieniem do pobrania pliku sprawdzić ping strony czy działa. Zrobiłem to za pomocą IdIcmpClient
kod
procedure TForm1.Button3Click(Sender: TObject); var i : integer; begin //ustawiamy czas oczekiwania IdIcmpClient1.ReceiveTimeout := 1000; //wyłączamy dostępność przycisku button button1.Enabled := False; try //ustawiamy adres IP IdIcmpClient1.Host := Edit1.Text; //wykonujemy pętlę 20 razy for i := 1 to 5 do begin //wysyłamy polecenie Ping IdIcmpClient1.Ping; //pozwalamy odetchnąć systemowi ? obsłużyć komunikaty Windows Application.ProcessMessages; //dodatkowo można wykonać opóźnienie ? w tym przypadku 1 sekundy sleep(1000); end; finally //finalizując włączamy dostępność przycisku button button1.Enabled := True; end; end;
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus); var sTime: string; //nowa zmienna typu string begin //sprawdzanie błedów odpowiedzi ping'a (AReplyStatus.MsgType?) if (AReplyStatus.MsRoundTripTime = 0) then sTime := '<1' //ustawienie wartości zmiennej dla wartości mniejszych niż 1 else sTime := '='; //ustawienie wartości zmiennej //wypełnienie komponentu Memo odpowiednio: ilością przesłanych bajtów, //kolejnym numerem ID, czasem życia, zmienną sTime, czasem oczekiwania na odpowiedź Memo1.Lines.Add(Format('%d bytes from %s: Sequence ID=%d TTL=%d Time%s%d ms', [AReplyStatus.BytesReceived, AReplyStatus.FromIpAddress, AReplyStatus.SequenceId, AReplyStatus.TimeToLive, sTime, AReplyStatus.MsRoundTripTime])); end;
jeśli jest połączenie to wiadomo wyświetli się w memo np
72 bytes from 32.435.543.67 : Sequence ID=3489 TTL=55 Time=180 ms //ip przykładowe
a jeśli nie ma to
0 bytes from 0.0.0.0: Sequence ID=3489 TTL=0 Time=1112 ms
i sprawdzam czy ip = 0.0.0.0 jesli nie to wchodzę na stronę memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt);
ale chciałbym się dowiedzieć czy to nie jest głupi pomysł może jest coś prostszego i lepszego do zastosowania ??
Użytkownik ari123 edytował ten post 04 marzec 2009, 18:23
1. Można przecież sprawdzić, czy jest połączenie z netem, co zresztą było na forum - przykładowo http://forum.ks-eksp...showtopic=15489.
2. Czasami pingi są blokowane przez serwer...
Cyrkiel gdzieś czytałem, że ten sposób nie działa prawidłowo na wszystkich komputerach dlatego próbowałem to jakoś obejść aby mieć pewność, że zadziała ... serwer na którym mam stronę nie blokuje pinga
a próbowałeś:
try memo.Text:=IdHTTP1.Get('http://moja_strona.pl/tekst.txt) except begin ShowMessage('Nie można pobrać pliku'); Close; end;