Internet detect???????

4 отговора 229 прегледа
#1

Internet detect???????

Niakoi da ima ideia kak da stane taka che programkata koito pisha da otkriva dali v momenta PC-to e online. Napravih variant( koito dosta ne mi se nravi) che chekva IP-to i ako to e razlichno ot 127.0.0.1(pone tak si mislia) to togava da sledva che e online. Samo che hem izpolzvam TCP (ocx component) za chekvane na IP i hem ne mi haresva tozi nachin. Noakoi da moje da pomogne? Ili pone metod koito da otkriva IP-to bez da polzvam TCP component. ? Ili moje bi drugi idei!
Mersi!

Отговор
в отговор на Sebastiano #2

Re: Internet detect???????

Това което си направил не е лошо. Ето ти една компонента която прави и двете. Отчита IP-то и дали компютъра е ОnLine. Разгледай я:
unit INetDetector;


interface

uses
Windows, Messages, Classes, Forms, Winsock;

type
TINetDetector = class(TComponent)
private
FEnabled: Boolean;
FDispatchInterval: Cardinal;
FWindowHandle: hWnd;
FOnline: Boolean;
FOnChanged: TNotifyEvent;

FCurrentIP : string; {<--RLM Diagnostics}
FpCurrHostEnt : PHostEnt; {<--RLM Diagnostics}

procedure UpdateTimer;
procedure SetEnabled(Value: Boolean);
procedure SetDispatchInterval(Value: Cardinal);
procedure SetNoneBool(Value: Boolean);
procedure WndProc(var Msg: TMessage);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

property CurrentIP : string read FCurrentIP; {<--RLM Diagnostics}
property pCurrHostEnt : PHostEnt read FpCurrHostEnt; {<--RLM Diagnostics}

published
property Enabled: Boolean read FEnabled write SetEnabled;
property DispatchInterval: Cardinal read FDispatchInterval write SetDispatchInterval;
property Online: Boolean read FOnline write SetNoneBool;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
end;

procedure register;

implementation

constructor TINetDetector.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled := True;
FDispatchInterval := 1000;
FWindowHandle := AllocateHWnd(WndProc);
UpdateTimer;
end;

destructor TINetDetector.Destroy;
begin
FEnabled := False;
UpdateTimer;
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TINetDetector.WndProc(var Msg: TMessage);
var
OldState: Boolean;
Key: hKey;
PC: array[0..4] of Char;
Size: Integer;
RegSays : Boolean; {<-- RLM 12/13/99}

function IsIPPresent: Boolean;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: array[0..63] of Char;
N: Integer;
GInitData: TWSAData;
IP: string;
begin
WSAStartup($101, GInitData);
Result := False;
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
FpCurrHostEnt := phe;
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
N := 0;
while pPtr^[N] <> nil do
begin
IP := inet_ntoa(pptr^[N]^);
Inc(N);
end;
FCurrentIP := IP;
WSACleanup;
Result := (IP <> '') and (IP <> '127.0.0.1');
end;

procedure FixOnlineState;
begin
if (not OldState and FOnline) or
(OldState and not FOnline) then
if Assigned(FOnChanged) then
FOnChanged(Self);
end;

begin
with Msg do
if Msg = wm_Timer then
try
OldState := FOnline;
FOnline := IsIPPresent;
FixOnlineState;

if RegOpenKey(HKEY_LOCAL_MACHINE,
'System\CurrentControlSet\Services\RemoteAccess',
Key) = ERROR_SUCCESS then
begin
Size := 4;
if RegQueryValueEx(Key, 'Remote Connection',
nil, nil, @PC, @Size) = ERROR_SUCCESS then
begin
{Original}
{ FOnline := PC[0] = #1;
FixOnlineState; }

{Changed 12/13/99 RLM -- AOL leaves PC bytes all 00's}
RegSays := PC[0] = #1;
FOnLine := FOnLine or RegSays;
FixOnlineState;
end
else
begin
FOnline := IsIPPresent;
FixOnlineState;
end;
RegCloseKey(Key);
end
else
begin
FOnline := IsIPPresent;
FixOnlineState;
end;
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;

procedure TINetDetector.UpdateTimer;
begin
KillTimer(FWindowHandle, 1);
if (FDispatchInterval <> 0) and FEnabled then
SetTimer(FWindowHandle, 1, FDispatchInterval, nil);
end;

procedure TINetDetector.SetEnabled(Value: Boolean);
begin
if Value <> FEnabled then
begin
FEnabled := Value;
UpdateTimer;
end;
end;

procedure TINetDetector.SetDispatchInterval(Value: Cardinal);
begin
if Value <> FDispatchInterval then
begin
FDispatchInterval := Value;
UpdateTimer;
end;
end;

procedure TINetDetector.SetNoneBool(Value: Boolean); begin {} end;

procedure register;
begin
RegisterComponents('UtilMind', [TINetDetector]);
end;

end.


Отговор
в отговор на Shveik #3

Re: Internet detect???????

Mersi....Shte ti kaja kakvo sym napravil.. Pravia edna programka da ti otchita telefonnata smetka za internet.. Ako se interesuvash mi praati mail na zennon@fmi.uni-sofia.bg

Отговор
в отговор на Shveik #4

Re: Internet detect???????

Да, за телефонни връзки това ще работи, но в общия случай е невалидно.
Например проверката на IP е само дали последното IP в списъка не е 127.0.0.1, а при мен това е 192.168.0.x - локална мрежа. Т.е. ако имаш машина в мрежа, тази проверка става безмислена. От своя страна мрежата може да има връзка към интернет през WinGate например, а може и да няма.
Проверката на registry-то - също. Там се закачат само RAS-връзките, не и останалите възможности за връзка.
Изобщо, проблема въобще не е елементарен, и до сега не съм видял свестен начин за проверка. А като се замисли човек, може да стигне до извода че самият въпрос е некоректен, защото веднага излиза на преден план въпроса "какво е интернет"? От различните отговори идват и различните начини на решаване на проблема.

На света има три вида хора: които могат да броят и които не могат.
Отговор
в отговор на Mandor #5

Re: Internet detect???????

аха:))

съгласен съм с това, че интернет и вързан ли си към интернет е широко понятие. но в конкретния случай на него му трябва да следи dial-up връзката, а тогава IP-то ще се смени. или се бъркам ?

може тогава да провери всички RAS connection-и и да види статуса им. ако има някой connected, може би се е вързал нейде ... току виж към интернет :)))

Отговор