来自:Another_eYes 时间:99-8-29 21:55:08 ID:129673 
用个ICMP控件直接在程序里ping吧 
不用控件也简单. 用api一样 
uses winsock; p_ip_options=^t_ip_options; 
t_ip_options=packed record 
Ttl: byte; 
Tos: byte; 
flags: byte; 
optionssize: byte; 
optionsdata: pointer; 
end; p_icmp_echo_reply=^t_icmp_echo_reply; 
t_icmp_echo_reply=packed record 
address: u_long; 
status: u_long; 
rttime: u_long; 
datasize: word; 
reserved: word; 
data: pointer; ip_options:t_ip_options; 
end; function icmpcreatefile: THandle; stdcall; external 'icmp.dll' name 'ICMPCreateFile'; function ICMPSendEcho:function(ICMPHandle: THandle; 
DestAddress:longint; 
Requestdata:pointer; 
requestsize:word; 
RequestOptns: p_ip_options; 
ReplyBuffer:pointer; 
Replysize:dword; 
Timeout: DWord ):dword; stdcall; external 'icmp.dll' name 'ICMPSendEcho'; function ICMPCloseHandle:function(ICMPHandle:THandle):Boolean; stdcall; external 'icmp.dll' name 'ICMPCloseHandle'; function Ping(Ip: string): boolean; 
var 
f_ICMP_Handle: THandle; 
f_address: LongInt; 
f_timeout: Integer; 
f_blocksize: Integer; 
f_replysize: Integer; 
requestoptions: T_ip_options; 
reqyestdatam replybuffer: Pointer; 
begin 
f_ICMP_Handle:=icmpcreatefile; 
f_timeout:=1000; f_blocksize:=64; 
f_replysize:=16+sizeof(t_icmp_echo_reply)+f_blocksize; 
GetMem(requestdata,f_blocksize); 
fillchar(requestdata^,64,#$32); 
GetMem(replybuffer,f_replysize); 
requestoptions.ttl:=255; 
requestoptions.tos:=0; 
requestoptions.flags:=0; 
requestoptions.optionssize:=0; 
requestoptions.optionsdata:=NIL; 
f_address := Inet_Addr(PChar(Ip)); if f_address = SOCKET_ERROR then 
begin 
result := false; 
ICMPCloseHandle(f_icmp_handle); 
exit; 
end; if ICMPSendEcho(f_icmp_handle,f_address, 
requestdata,f_blocksize, @requestoptions, 
replybuffer,f_replysize, 
f_timeout)<>1 then 
result := false 
else 
result := true; 
icmpclosehandle(f_icmp_handle); 
end; 来自:曹晓钢 时间:99-8-31 02:35:06 ID:130028 
这个问题不是刚讨论过吗? 
pega说, 
监视本机IP的变化,如果挂上了internet,就会多出一个新的IP来. 
(是局域网就歇菜了.) 
还有老外由这个思路写了控件了.不长,我就直接贴出来了. { ****************************************************************** } 
{ } 
{ VCL component TKZInternetDetect } { } 
{ Internet detector component } 
{ } 
{ Code generated by Component Create for Delphi } 
{ } 
{ Generated from source file d:\compon~1\intern~1\d3\kzintdet.cd } 
{ on 7 July 1999 at 21:52 } 
{ } 
{ Copyright ?1999 by Kire Zvezdakoski } 
{ } 
{ ****************************************************************** } unit KZIntDet; interface uses Messages, SysUtils, Classes, Controls, Forms, Graphics, 
Windows, Extctrls, RAS; type 
TKZInternetDetect = class(TComponent) 
private 
{ Private fields of TKZInternetDetect } 
FCheckInterval : Integer; 
FConnected : Boolean; 
FIP : String; 
{ Pointer to application's OnConnect handler, if any } 
FOnConnect : TNotifyEvent; 
{ Pointer to application's OnDisconnect handler, if any } 
FOnDisconnect : TNotifyEvent; 
Timer : TTimer; { Private methods of TKZInternetDetect } 
{ Method to set variable and property values and create objects } 
procedure AutoInitialize; 
{ Method to free any objects created by AutoInitialize } 
procedure AutoDestroy; procedure SetConnected(Value : Boolean); 
procedure SetIP(Value : String); 
procedure Check(Sender:TObject); protected 
{ Protected fields of TKZInternetDetect } { Protected methods of TKZInternetDetect } 
{ Method to generate OnConnect event } 
procedure Connect(Sender : TObject); virtual; 
{ Method to generate OnDisconnect event } 
procedure Disconnect(Sender : TObject); virtual; 
procedure Loaded; override; public 
{ Public fields and properties of TKZInternetDetect } { Public methods of TKZInternetDetect } constructor Create(AOwner: TComponent); override; 
destructor Destroy; override; 
function Execute : Boolean; published 
{ Published properties of TKZInternetDetect } 
property OnConnect : TNotifyEvent read FOnConnect write FOnConnect; 
property OnDisconnect : TNotifyEvent read FOnDisconnect write FOnDisconnect; 
property CheckInterval : Integer 
read FCheckInterval write FCheckInterval 
default 1000; 
property Connected : Boolean 
read FConnected write SetConnected 
default False; 
property IP : String read FIP write SetIP; end; procedure Register; implementation procedure Register; 
begin 
{ Register TKZInternetDetect with KireZ as its 
default page on the Delphi component palette } 
RegisterComponents('KireZ', [TKZInternetDetect]); 
end; { Method to set variable and property values and create objects } 
procedure TKZInternetDetect.AutoInitialize; 
begin 
Timer := TTimer.Create(Self); 
FCheckInterval := 1000; 
FConnected := False; 
FIP := '127.0.0.1'; 
end; { of AutoInitialize } { Method to free any objects created by AutoInitialize } 
procedure TKZInternetDetect.AutoDestroy; 
begin 
Timer.Free; 
end; { of AutoDestroy } procedure TKZInternetDetect.SetConnected(Value : Boolean); begin 
FConnected := Value; 
end; procedure TKZInternetDetect.SetIP(Value : String); 
begin 
FIP := Value; 
end; { Method to generate OnConnect event } 
procedure TKZInternetDetect.Connect(Sender : TObject); 
begin 
{ Has the application assigned a method to the event, whether 
via the Object Inspector or a run-time assignment? If so, 
execute that method } 
if Assigned(FOnConnect) then 
FOnConnect(Sender); 
end; { Method to generate OnDisconnect event } 
procedure TKZInternetDetect.Disconnect(Sender : TObject); 
begin 
{ Has the application assigned a method to the event, whether 
via the Object Inspector or a run-time assignment? If so, 
execute that method } 
if Assigned(FOnDisconnect) then 
FOnDisconnect(Sender); 
end; procedure TKZInternetDetect.Check(Sender:TObject); var 
RASConns:TRasConn; 
dwSize:dword; 
dwCount:dword; 
RASpppIP:TRASpppIP; 
T:Boolean; 
r:string; 
begin 
r:=''; 
RASConns.dwSize:=SizeOf(TRASConn); 
RASpppIP.dwSize:=SizeOf(RASpppIP); 
dwSize:=SizeOf(RASConns); 
If RASEnumConnections(@RASConns, dwSize, dwCount)=0 Then If dwCount > 0 Then begin 
dwSize := SizeOf(RASpppIP); 
If RASGetProjectionInfo(RASConns.hRasConn, RASP_PPPIP, @RasPPPIP, dwSize)=0 Then 
r:=strPas(RASpppIP.szIPAddress); 
End; 
t:=Connected; 
Connected:=(r<>'127.0.0.1') and (r<>'') and (r<>' '); 
FIP:=r; 
if ((not t) and Connected) then Connect(Sender); 
if (t and (not Connected)) then Disconnect(Sender); 
end; constructor TKZInternetDetect.Create(AOwner: TComponent); begin 
inherited Create(AOwner); 
AutoInitialize; { Code to perform other tasks when the component is created } 
Timer.OnTimer:=Check; 
CheckInterval:=1000; 
end; destructor TKZInternetDetect.Destroy; 
begin 
AutoDestroy; 
inherited Destroy; 
end; function TKZInternetDetect.Execute : Boolean; 
begin 
{ Perform the component operation } { Return True if the operation was successful, False otherwise } 
Result := True 
end; procedure TKZInternetDetect.Loaded; 
begin 
inherited Loaded; { Perform any component setup that depends on the property values having been set } end; 
end. 
来自:DNChen 时间:99-8-31 07:30:18 ID:130040 
>2. windows登陆internet后,使用什麽消息变量传递的.我可否使用 
没有消息可以响应,只有你自己的程序拨号时,才可以提供一个回调函数给ras api, 
这个时候才可以获得拨号成功/失败信息。 来自:cytown 时间:99-8-31 17:53:46 ID:130196 
可以通过ping www.netscape.com是否通来判断, 不过, 如果你的局域网 
有一个机器或服务器是WWW.NETSCAPE.COM, 那么...... 
话说回来了, 谁会设这么一台机器呢? 可以用ics构件里的tping构件. 来自:Kim Wong 时间:99-8-31 22:50:32 ID:130290 
使用 idle 是否会比用 timer 节约资源呢? 
不过我以前就是用 timer 来实现的一个记费器,并没感觉事件响应有迟缓。 
其实 timer 也不是太占资源啦! 

解决方案 »

  1.   

    还有一个方法:直接在Delphi里做一个Ping的程序,当然Ping的目的地址可以找一个固定IP地址!这样就可以知道当前你是否已经连上Internet。
      

  2.   

    答案在:http://www.csdn.net/expert/topic/117/117385.shtm
      

  3.   

    function InetIsOffline(res:dword=0):boolean;stdcall;external 'url.dll' name 'InetIsOffline';function InternetGetConnectedState(uflag:dword;reverse:dword):boolean;stdcall;external 'wininet.dll' name 'InternetGetConnectedState';procedure TForm1.Button1Click(Sender: TObject);
    begin
    if not inetisoffline then
      showmessage('already connect to Internet');
    end;