如何监视局域网所有端点的网络通断(100分)

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

renzhm

Unregistered / Unconfirmed
GUEST, unregistred user!
我的系统安全性要求非常高,控制中心监视所有客户端的网络通断,若有客户端不在网,则
及时报警通知控制中心。
恳请大侠给点思路!
 
客户端定时发送消息到服务器,如果没有消息或超过一定时间没有消息,则认为不在网
 
同意楼上
 
听说联想新出的个什么服务器就带有这么个管理系统找找看
 
能不能换一种角度,由服务器发信息,如果ping不通,则提示断网,当然要知道客户端的
ip或name
 
如果使用dhcp服务器动态分配IP地址,通过dhcp服务器提供的管理功能可以知道客户端是
不是活动的,若是活动的,证明这台机器是通的,反之这台机器是不通的。
若不是通过dhcp服务器动态分配IP地址,只有自己手工编写一个程序,在程序中实现ping的
功能,前提是你要有一个各个站点的IP地址分配表,通过对此IP地址ping是否成功,确定是
否通
 
写个软件ping客户端!
 
好像有个什么函数,可以得到当前网上邻居的个数,然后循环。如果我找到了再发给你。
 
谢谢大家!有没有实现此类功能的代码?
姚哥:renzhm@163.net
 
http://delphi.mychangshu.com/dispdoc.asp?id=377
http://delphi.mychangshu.com/dispdoc.asp?id=893
http://www.playicq.com/dispdoc.asp?id=429
我想只要稍做修改,其中任意一个都可以满足你的要求。
 
我有一个多线程的PING的程序,
//================================================================
//
//
// 对一个IP列表进行监控的线程
// 作者:孙辉 sunhuiNO1@hotmail.com
//
//================================================================
unit SpyThread;

interface

uses
Classes,Windows,Messages,Winsock,Ping;

const WM_NOTIFYMSG=WM_USER+$100;
WM_ONLINE=WM_USER+$101;
WM_OULINE=WM_USER+$102;
WM_END=WM_USER+$103;
SPYCOUNT=20;

type
TIPtype=record
onLine:boolean;
count:integer;
end;

TSpyIP = class(TThread)
private
{ Private declarations }
FHandle:THandle;
FIPlist:TStringList;
FDelayTime:integer;
FPort:integer;
FNextTime:integer;
protected
procedure Execute; override;
public
property IPlist:TStringList write FIPlist;
property DelayTime:integer write FDelayTime default 2000;
property Port:integer write FPort;
property NextTime:integer write FNextTime default 10000;
constructor SpyIP(Handle:THandle);
destructor Destroy;override;
end;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure TSpyIP.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ TSpyIP }
constructor TSpyIP.SpyIP(Handle:THandle);
begin
inherited Create(true);
FHandle:=Handle;
Freeonterminate:=true;
FDelayTime:=2000;
FNextTime:=10000;
end;

destructor TSpyIP.Destroy;
begin
PostMessage(FHandle,WM_END,0,0);
inherited destroy;
end;

procedure TSpyIP.Execute;
var
i,j:integer;
onLine:boolean;
ouLine:array[0..SPYCOUNT-1]of TIPtype;
begin
for i:=0 to SPYCOUNT-1 do
begin
ouLine.onLine:=false;
ouLine.count:=0;
end;

if (FIPlist.Count=0) and (FIPlist.Count>20) then exit;

while not Terminated do
begin

for i:=0 to FIPlist.Count-1 do
begin
if ouLine.onLine then
begin
inc(ouLine.count);
if ouLine.count<10 then
break
else
ouLine.count:=0;
end;

onLine:=PingServer(FIPlist.Strings,FDelayTime);

if onLine then //如果能PING通
begin
if not ouLine.onLine then
PostMessage(FHandle,WM_ONLINE,i,0);
ouLine.onLine:=true;
ouLine.count:=0;
end
else //如果不能PING通
begin
if ouLine.onLine then //如果该机开始是在线
begin
PostMessage(FHandle,WM_OULINE,i,0);
ouLine.onLine:=false;
ouLine.count:=0;
end;
end;

end;
Sleep(FNextTime);
end;
end;

end.
unit Ping;

interface

uses
Windows,Winsock,Sysutils;

Const
{ Exception Message }
SInitFailed = 'Winsock version error';
SInvalidAddr = 'Invalid IP Address';
SNoResponse = 'No Response';
STimeOut = 'Request TimeOut';

type
DWORD=LongWord;
THandle=LongWord;
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;

PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply =
record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize:Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;

function IcmpCreateFile():THandle;stdcall external 'ICMP.dll';
function IcmpCloseHandle(Handle:THandle):Boolean;stdcall external 'ICMP.dll';
function IcmpSendEcho(Handle:THandle;
DestAddr:DWORD;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWORD;
Timeout: DWORD): DWORD;stdcall external 'ICMP.dll';
procedure ValidCheck();
procedure FreeWinsock();
function PingServer(IPAddr:String;TimeOut:Word):boolean;

var
hICMP:THandle;

implementation

procedure ValidCheck();
var
WSAData:TWSAData;
begin
if (WSAStartup($202,WSAData)<>0) then
raise Exception.Create(SInitFailed);
hIcmp:=IcmpCreateFile();
if hICMP=INVALID_HANDLE_VALUE then
raise Exception.Create('Create ICMP Failed');
end;

procedure FreeWinsock();
begin
IcmpCloseHandle(hIcmp);
WSACleanUP;
end;

function PingServer(IPAddr:String;TimeOut:Word):boolean;
var
IPOpt:TIPOptionInformation;// IP Options for packet to send
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
temp:Integer;
pIPAddr:Pchar;
begin
GetMem(pIPAddr,Length(IPAddr)+1);
FillChar(pIPAddr^,Length(IPAddr)+1,0);
StrPCopy(pIPAddr,IPAddr);

FIPAddress := inet_addr(pIPAddr);

FreeMem(pIPAddr);

if FIPAddress=INADDR_NONE then
begin
result:=false;//Exit
exit;
end;


FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);

FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Ping Digital Data';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);

IPOpt.TTL := 64;
//time out
FTimeOut := TimeOut;
//go!!!
temp:=IcmpSendEcho(hICMP,//dll handle
FIPAddress,//target
pReqData,//data
Length(MyString),//data length
@IPOpt,//addree of ping option
pIPE,//
BufferSize,//pack size
FTimeOut);//timeout value

if temp=0 then
begin
Result:=false;
exit;
end;

if pReqData^ = pIPE^.Options.OptionsData^ then
Result:=true
else
Result:=false;

FreeMem(pRevData);

FreeMem(pIPE);

end;



end.
 
哪个PING单元是别人写的,其他部分是我写的,很容易看懂的,
如果对方上线了,就间隔时间长一点,下线后就重新调整间隔时间
 
谢谢楼上的老大,我想应该可以!
我又想:
耗费的资源太大了!
这几天我在考虑另一个方案:
让客户端自己监视自己,现在流行的10M/100M网卡就能实现类似的功能,网线插好,连接正常,
网线一拔,提示不在网上,这样的功能如何实现!
--------------------------------------------------------------------------------
各位老大,分数一定给,不是我贪得无厌,我是想得到一个最佳解决方案!
 
定时PING别人资源消耗不大,我用过几天,效果还不错。
 
TO renzhm
我知道你的意思了,你是想通过一种方法判断这个IP是不是有效的IP,
如果网卡断开了,路由或者HUB可能会做出一些响应,你想通过着来
判断对不?
 
to 张少侠:

ping别人必须知道别人的IP或Name,我想做的是一种无状态的。

背景:

网卡:10M/100MTopStar
系统:Windows 2000

网线:RJ45对等
主机:2台

-------------------------------------------------------------------------------
连接两台电脑,任务栏显示网络连接正常,拔掉网线,任务栏提示网络电缆未插好!

此功能属网卡驱动所带,我想做一段程序实现类似的功能(不针对某类网卡),就能

实现:客户端自己监视自己。

没有必要知道对方的IP或Name。
 
那就用GetHostByname()就够了,如果网卡禁用了,返回的是nil!
 
多谢张无忌!
 
后退
顶部