利用DELPHI如何检测到网络的计算机上线与下线 ( 积分: 100 )

  • 主题发起人 主题发起人 retun
  • 开始时间 开始时间
R

retun

Unregistered / Unconfirmed
GUEST, unregistred user!
请教如何用DEPHI写代码利用TCP/IP检测内网网络上,知道是否有计算机上线或下线
 
请教如何用DEPHI写代码利用TCP/IP检测内网网络上,知道是否有计算机上线或下线
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if GetSystemMetrics(SM_NETWORK) AND $01 = $01 then
ShowMessage('Machine is attached to network') else
ShowMessage('Machine is not attached to network');
end;
 
请问这段代码你有测试过吗
 
{功 能: 检测计算机是否上网
参 数: 无
返回值: 成功: True 失败: False;
备 注: uses Wininet}
function NetInternetConnected: Boolean;
const
// local system uses a modem to connect to the Internet.
INTERNET_CONNECTION_MODEM = 1;
// local system uses a local area network to connect to the Internet.
INTERNET_CONNECTION_LAN = 2;
// local system uses a proxy server to connect to the Internet.
INTERNET_CONNECTION_PROXY = 4;
// local system's modem is busy with a non-Internet connection.
INTERNET_CONNECTION_MODEM_BUSY = 8;
var
dwConnectionTypes : DWORD;
begin
dwConnectionTypes := INTERNET_CONNECTION_LAN+INTERNET_CONNECTION_MODEM
+INTERNET_CONNECTION_PROXY;
//Result := InternetGetConnectedState(@dwConnectionTypes, 1);
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;
 
ID:3055054的朋友,$01 是指01号机吗?
你的方法,是不是局域网内任一台电脑的开关机,该方法都能检测到?
 
自己写程序不断的ping那个电脑
如果ping不到
在网络没有断开的情况下就可以知道了
不过对方不能关掉ping
 
--寻路:
GetSystemMetrics(SM_NETWORK)好像不行,只能检测自己是否在网上,不能对局域网中的计算机在线情况进行统计

--楼主
Windows好像自动在内网上面维护一个计算机列表,Win2000和WinXp中还有一个专门的服务程序叫Computer Browser,应该就是它来维护网上邻居里的计算机列表,楼主想要的应该就是知道这个列表信息,然后就能简单判断一台计算的上线下线。

或者不断的Ping从1到255这些地址的电脑,或者Ping依据网关算出的相应地址范围,这样可能还会准确点
 
请问如何得知本机的本地连接的状态
procedure TForm1.Button1Click(Sender: TObject);

function GetOnlineStatus : Boolean;
var ConTypes : Integer;
begin
ConTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;
if (InternetGetConnectedState(@ConTypes, 0) = False)
then Result := False
else Result := True;
end;

begin
if GetOnlineStatus then
ShowMessage(' Connected')
else ShowMessage(' not Connected');
end;
 
代码:
--bennykgd,
你的程序好像是来检测Internet连接状态的,好像不合楼主要求的“内网”

如下是我的测试代码,非常简陋,不过能够达到目的

废话:想不到Indy控件使用起来如此方便简单,呵呵,真是让人欣赏这高手所著的程序,同时也当然很感谢高手所作的系列Indy控件.

{*
  如下代码使用Ping来维护内网的计算机列表
  Win Xp +Delphi2005测试通过
               2005-4-24凌晨
}
unit Unit1;

...
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Timer1: TTimer;
    IdIcmpClient1: TIdIcmpClient;
    procedure FormDblClick(Sender: TObject);
    procedure IdIcmpClient1Reply(ASender: TComponent;
      const AReplyStatus: TReplyStatus);
    procedure Timer1Timer(Sender: TObject);
...
var
  Form1: TForm1;

implementation

{$R *.dfm}
const
  ipHead :string ='192.168.0.';
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:Integer;
begin
  ListBox1.Clear;
  IdIcmpClient1.ReceiveTimeout :=1000;
  for i:=1 to 255 do
  begin
    IdIcmpClient1.Host :=ipHead +IntToStr(i);
    [red]IdIcmpClient1.Ping;[/red]
    Application.ProcessMessages;
  end;
end;

procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
var
  sTime :string;
begin
  Caption :=IdIcmpClient1.Host;
  if [red][black]AReplyStatus.ReplyStatusType=rsEcho[/black][/red] then
  begin
    ListBox1.Items.Add(AReplyStatus.FromIpAddress);
  end;
end;

procedure TForm1.FormDblClick(Sender: TObject);
var
  i:Integer;
begin//仅仅为了自己测试
  ListBox1.Clear;
  IdIcmpClient1.ReceiveTimeout :=100;
  for i:=1 to 255 do
  begin
    IdIcmpClient1.Host :=ipHead +IntToStr(i);
    IdIcmpClient1.Ping;
    Application.ProcessMessages;
  end;
end;

end.
 

Similar threads

回复
0
查看
848
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部