如何获取网络连接状态???(大家帮忙)(100分)

  • 主题发起人 主题发起人 gouer
  • 开始时间 开始时间
G

gouer

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中如何实时的监控网络连接的状态,最好可以给我一个例程参考一下马上给分!!!!!!!!
 
利用ping构件,ping各大服务器,ping通了就是连接上了

都ping不通就是没上网

ping构件可以在
www.vclxx.com下载
 
以前我答过的现在实在找不到了
 
试试WNetGetConnection
DWORD WNetGetConnection(
LPCTSTR lpLocalName, // local name
LPTSTR lpRemoteName, // buffer for remote name
LPDWORD lpnLength // buffer size
);
 
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;
 
好象不对,无论都是"'Machine is not attached to network"
 
如果有代码,希望可以给我mail一份,我可以继续加分
我的目的是在客户端实时的知道当前的网络连接状况(局域网tcp/ip协议)
那个函数我试过,和fxb说的一样啊,大家多多赐教
 
当本机连上互联网以后,Windows会修改注册表中的内容,地址为:

[HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/RemoteAccess]
"Version"="1.2c"
"NoLogon"=hex:00,00,00,00
"Remote Connection"=hex:00,00,00,00

把NoLogon改为01,00,00,00
把Remote Connection改为01,00,00,00

以上方法只能检测单机上网时,如果是局域网内的机器上网,以上方法只对服务器有效。
 
unit Unit1;

interface

uses
Windows, Messages, winsock,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, jpeg;

type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize: Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
TIcmpSendEcho = function(IcmpHandle:THandle;
DestinationAddress: DWORD;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;
Tmyping = class(TForm)
Panel1: TPanel;
pingedit: TEdit;
exebutton: TButton;
StatusShow: TMemo;
Label1: TLabel;
Image1: TImage;
Image2: TImage;
procedure FormCreate(Sender: TObject);
procedure exebuttonClick(Sender: TObject);
private
{ Private declarations }
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
end;

var
myping: Tmyping;

implementation

{$R *.DFM}

procedure Tmyping.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
begin
wsastartup($101,wsadata);
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := '';
//StatusShow.Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
end;

procedure Tmyping.exebuttonClick(Sender: TObject);
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;
begin
if PingEdit.Text <> '' then
begin
FIPAddress := inet_addr(PChar(PingEdit.Text));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hello,World';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
end;
except
messagedlg('没有找到该IP地址!',mtinformation,[mbok],0);
end;
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;

end.
 
绝对没有问题,我刚试过!是检查局域网的连接状态的!
 
only you 兄,我的消息怎么在连接,和没有连接都是
'Machine is attached to network'
jingtao 兄你的方法就是去ping目的ip,我用过了,很好,不过我改成线程调用了
这样不会因为没有连接而让程序在那里苦等啦,你认为呢?
我会为你们加分的,不过我还希望有更好的方法
 

jingtao
你的代码我发现了一个问题,我从新提了一个问题,题目是
"这段代码为何不能ping通由sygate代理出去的ip?????????????????"
 
将 jingtao 的程序稍微改一下.
使用 enumconnections 就可以确定连结数量, 为零即不在线
 
上面的一个长的程序,我已经调试
通过,它对存在的IP反映非常快,但是
对于不存在的IP反映太慢,至少5秒,
不知道怎么修改才可以使得对不存在的
IP反映迅速,我只要求PING IP
通或是不通的 结论。

begin
if ping(ip) then showmessage(存在这个IP')
else showmessage('不存在这个IP');
end
 
可以通过修改
FTimeOut := 4000;
来解决PING不到IP响应的时间
修改成
FTimeOut := 1;
这样速度就快了很多!
 
多人接受答案了。
 
有的机器用了第三方软件或是防火墙之后就把ping给屏蔽了,所以这个方法不太好,哪位大虾还有别的方法呀,谁知道QQ的实时检测网络是怎么实现的呀
 
后退
顶部