请问各位了,网络不通时会触发什么事件呢?(100分)

  • 主题发起人 主题发起人 cavalise
  • 开始时间 开始时间
C

cavalise

Unregistered / Unconfirmed
GUEST, unregistred user!
我试过了,socket的disconnect事件是不被触发的,而且onerror也不触发
郁闷!
 
disconnect是正常状态下的断开连接才会触发,如果要知道非正常的断开,可以每隔一段时间
发数据验证,因为你用的socket控件所以只能这么做,

如果你用的API直接写,或者用的租塞方式的SOCKET组件就能实时侦测到断开了
 
顺便插一句﹐客戶端ado连结ms-sql,
如果掉线了﹐怎幺知道(可以立即告诉用户而不要用户给我电话说﹕又死机啦)?
不会是用select 1 where 1>0 不停的连sql吧?[:(]
 
TCP/IP 协议本身就是考虑了硬件的不稳定性,所以会有一定的容忍度
OnError 是会触发的,不过要看你超时的设置,
如果你想立即知道,可以用别的办法:
1.比如每隔10秒钟检查一下Ras的连接状态,并配合调用
GetHostName, GetHostByName, 之后得到的Host结构了解本机的IP地址(拨
号成功之后如果PPP/SLIP协议握手成功,本机就会多一个IP地址,断开之后
恢复原状),问题应该就算解决了

2.调用微软 Internet API
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;

3.据说查注册表也可以,我自己未用过:
在注册表的HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/RemoteAcces分支下,
当未连通因特网时,Remote Connection的键值为00 00 00 00,当连通时,其键值为01 00 00 00,
通过这一键值就可以作出判断。
 
你们说的方法除了注册表我都试了,还是不行阿
 
socketerror
 
colorcat:
socketerror事件不是时时触发的,好像要等待一段时间,你能告知这段时间怎么设置吗?
而且这个时间好像不固定阿
 
我这里有一个检测网络通断的函数:

// Addr : 需要连接的IP
// port : 要连接的端口号
// Timeout : 超时时间设置
// 返回值为0说明正常,其它值时有错误发生。

function ServerIsActive(const Addr: string;
port: cardinal; Timeout: cardinal = 5000): integer;
var
sktTest: TClientSocket;
time1: cardinal;
begin
sktTest := TClientSocket.Create(nil);
try
sktTest.Address := Addr;
sktTest.Port := port;
sktTest.OnError := SocketError; // 出错处理,自己定义 SocketError.
sktTest.Active := true;
time1 := GetTickCount;
while (GetTickCount - time1 < Timeout) and
not sktTest.Active do
Application.ProcessMessages;
finally
if sktTest.Active then
Result := 0
else
Result := FEC; // FEC 全局的错误码,可以在 SocketError 里赋值。
sktTest.Close;
sktTest.Free;
end;
end;
 
socketerror
 
后退
顶部