怎样确定网络是否连通?(想听听大家是怎么做的) (100分)

  • 主题发起人 BlackHawk
  • 开始时间
B

BlackHawk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ADOCONNECTION和ADOQUERY连接局域网上的另一台机器(服务器)上的SQL SEVER数据库,
ADOCONNECTIONSTRING是事先指定好的,ADOCONNCTION的CONNECTED属性默认为FALSE,程序运行时
我用一个按钮控制ADOCONNECTION的CONNECTED属性,在网络接通的情况下,下面一段代码运行
没有问题:
procedure TForm1.button1.click(sender:Tobject);
begin
try
adoconnection1.connected:=true;
except
messagedlg('网络不通!',mtwarning,[mbok],0);
end;
end;
我们单位的网络经常不通,在网络不通时,运行这段程序就死机(try后面这句过不去)

请问我用什么办法可以知道网络是否连通?
 
先设置 TAdoConnection 的连接超时:ConnectionTimeout。
 
设为15,但不管用
 
何不用 IdICMP 来 Ping 一下,通了再连啊。
 
检测计算机是否联网比较简单的做法可以通过一个 Win32 Internet(WinInet) 函数
InternetQueryOption 来实现
以下是一个判断当前计算机是否可以获得 Internet 服务的例子:

function TForm1.CheckOffline: boolean;

var

ConnectState: DWORD;

StateSize: DWORD;

begin

ConnectState:= 0;

StateSize:= SizeOf(ConnectState);

result:= false;

if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then

if (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if CheckOffline then

edit1.text:= 'Connect To ISP'

else

edit1.text:= 'Disconnect To ISP';

end;

 
设置 AdoConnection 的ConnectionTimeout
在AdoConnection的AfterDisconnect事件中加入代码
adoconnection1.connected:=true;
??:= '网络已中断,正在重新连接';
...
想办法排除网络故障

 
1.搂住的过程再我的机器成不死机,执行正常
2。AdoConnection的AfterDisconnect事件,在连接失败后 无法触发
3。触发AdoConnection的BeforeConnect时间
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin
messagedlg('22网络不通!',mtwarning,[mbok],0);
end;

delphi5 + win2k(英文)
 
还是先PING一下好,也不麻烦,在程序中可以这样实现:做个FORM,在主程序界面上加
个BUTTON或菜单项调用这个FORM(我平时的做法),完整代码如下:
interface

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

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;
TFtest = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);

private
{ Private declarations }
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle:TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
WSAData:TWSAData;
end;

var
Ftest: TFtest;
i:integer;
implementation

{$R *.dfm}
uses main;
procedure TFtest.FormCreate(Sender: TObject);
var hiCMPdll:HMODULE;

{ IPOpt:TIPOptionInformation;
FIPAddress:DWORD;
pReqData,pRevData:pChar;
pIPE:pIcmpEchoReply;
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD; }
begin
i:=0;
WSAStartup(2,WSAData);
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP :=IcmpCreateFile;
memo1.Text:='';
memo1.Lines.Add('数据中心连接测试信息:');

{FIPAddress:=inet_addr(pchar('127.0.0.1'));
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
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
memo1.Lines.Add(PChar('127.0.0.1') + '-----'
+IntToStr(pIPE^.DataSize) + '-----' +IntToStr(pIPE^.RTT));
end;
except

memo1.Text:='';
memo1.Lines.Add('数据中心连接失败!请检查一下您的网络连接!');
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end; }
end;

procedure TFtest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
wsacleanup();
Action:=caFree;
end;

procedure TFtest.Timer1Timer(Sender: TObject);
var
IPOpt:TIPOptionInformation;
FIPAddress:DWORD;
pReqData,pRevData:pChar;
pIPE:pIcmpEchoReply;
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;

begin
i:=i+1;
FIPAddress:=inet_addr(pchar('127.0.0.1'));
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
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
memo1.Lines.Add(' '+PChar(inttostr(i)+' '+'连接数据中心') + ' ----- 发送信息(字节):'
+IntToStr(pIPE^.DataSize) + ' ----- 返回时间(毫秒):' +IntToStr(pIPE^.RTT)+' ----- TTL:'+inttostr(pipe^.options.ttl));

end;
except

//memo1.Text:='';
memo1.Lines.Add(' 数据中心连接失败!请检查一下您的网络连接!');
memo1.Lines.Add(' '+PChar(inttostr(i)+' '+'连接数据中心') + ' ----- 发送信息(字节):'
+IntToStr(pIPE^.DataSize) + ' ----- 返回时间(毫秒):' +IntToStr(pIPE^.RTT)+' ----- TTL:'+inttostr(pipe^.options.ttl));

end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;

end.
 
procedure TForm1.button1.click(sender:Tobject);
begin
try
adoconnection1.open
finally
if adoconnection1.connected:=true then
begin
............
end
else
messagedlg('网络不通!',mtwarning,[mbok],0);
end;
end;
这样不会死机
 
楼上的代码不行啊,死的很难看。

继续关注!
 
ICS控件包里有一个Ping控件,首先Ping一下, 通了以后,再连接数据库。
 
顶部