Wykrywanie połączenia z netem

0

Wiem, wiem, napiszecie, że było, że mam szukać - szukałem i nie znalazłem tego, co mnie interesuje :)

Chodzi o to, jak wykryć, czy komputer jest on-line (nie ogólnie podlączony do neta, tylko teraz, w tym momencie).

Od razu napiszę, że porada z FAQ "Jak wykryć połączenie z netem" nie działa ;-)

0

spróbuj użyć funkcji AllocateAndGetTcpExTableFromStack i AllocateAndGetUDPExTableFromStack

Wylistują Ci one wzystkie połączenia ze zdalnymi hostami podobnie jak w programie netstat

0

A nie da się prościej? Piszę program na kompie, który nie ma dostępu do neta, więc testowanie jest utrudnione :].

Myślałem np o pingowaniu czy czymś takim...

Mam komponent TINetDetector, ale nie wiem, jak go używać :-P

0

Mi sprawnie działa... także pod XP (pierwszy przykład):

uses WinInet;

function Connected: Boolean;
var
 Flags: DWORD;
begin
 Flags := INTERNET_CONNECTION_MODEM or INTERNET_CONNECTION_LAN or
 INTERNET_CONNECTION_PROXY or INTERNET_CONNECTION_MODEM_BUSY;
 Result := InternetGetConnectedState(@Flags, 0);
end;

//Wywołanie
 if Connected = True then // jest net
 else
 if Connected = False then // nie ma neta


//LUB w sekcji "Interface" dodaj nagłówek:
function InetIsOffline(Flag: Integer): Boolean; stdcall; external 'URL.DLL';

//Wywołanie
if InetIsOffline(0) then ShowMessage('Jestem offline')
else ShowMessage('Jestem online');
0

Hmm... Mam win 98, zupełnie niepodlaczony do neta (zadnego sprzetu nawet w odleglosci 5m :P) i pierwsza metoda mnie informuje, ze jestem online :)

0

Opi Twoj sposob jest do bani bo praktycznie nie dziala na wiekszoci kompow.

Ja np robie tak ze jesli chce wykryc polaczenie z netem to robie ping jakiegos serwera, ktory teoretycznie zawsze jest aktywny np. google
jesli ping sie nie powiedzie to robie ping innego serwera np. yahoo i jesli tez sie nie powiedzie to stwierdzam ze nie ma netu.

0

Gumiś, to nie jest mój sposób lecz ogólnie przyjęta funkcja... jeśli znasz lepszą to przedstaw swój przykład, a nie teorię.

0

Ja wiem ze to ogolnie przyjeta funkcja tylko co z tego jak ona nie dziala?!
Poza tym nie napisalem teorii tylko gotowe rozwiazanie.
Jak ktos potrzebuje sprawdzenie czy jest net to raczej bedzie umial wyslac 2 pingi i sprawdzic rezultat wiec kod jest zbedny w tym przypadku.

0

a tu prosze przyklad jak mozna to szybciutko napisac
komponent TidICMPclient (lub dowolny inny icmp)
:

  serv  : byte;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  serv:=0;
  try
    IdIcmpClient1.Host:='www.google.pl';
    IdIcmpClient1.Ping;
    if serv=1 then ShowMessage('jest net') else begin
      IdIcmpClient1.Host:='www.yahoo.com';
      IdIcmpClient1.Ping;
    end;
  finally
    if serv=0 then ShowMessage('brak neta') else ShowMessage('jest net');
  end;
end;

procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
begin
  if AReplyStatus.BytesReceived>0 then
    inc(serv);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1