热情软件屋

 

如何能够判断网络已经断线


编号:QA003175
建立日期: 2000年7月18日 最后修改日期:2002年4月28日
所属类别:

qqj:
    操作系统:win98
    编程工具:bcb3
    问题:请问专家有没有WIN32API函数能够判断网络已经断线,若没有,有可其它方法?谢谢!!!
    水平: 刚入门

回答:

    我对C++ Builder不太了解,这里给你一个使用VB的解决方案,你可以将它移植到C++中。
    'API函数定义
    Dim eR As EIGCInternetConnectionState
    Dim sMsg As String
    Dim sName As String
    Dim bConnected As Boolean
    
    Private Declare Function InternetSetDialState Lib "wininet.dll" _
     (ByVal lpszConnectoid As String, ByVal dwState As Long, _
     ByVal dwReserved As Long) As Long
    
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
    (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
    ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    
    Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" _
     Alias "InternetGetConnectedStateExA" _
     (ByRef lpdwFlags As Long, _
     ByVal lpszConnectionName As String, _
     ByVal dwNameLen As Long, _
     ByVal dwReserved As Long _
     ) As Long
    Private Enum EIGCInternetConnectionState
     INTERNET_CONNECTION_MODEM = &H1&
     INTERNET_CONNECTION_LAN = &H2&
     INTERNET_CONNECTION_PROXY = &H4&
     INTERNET_RAS_INSTALLED = &H10&
     INTERNET_CONNECTION_OFFLINE = &H20&
     INTERNET_CONNECTION_CONFIGURED = &H40&
    End Enum
    
    'InternetConnected 函数判断是否连接到Internet的函数
    '获得是否以及通过何中方式连接到Internet上
    Private Function InternetConnected(Optional ByRef eConnectionInfo _
     As EIGCInternetConnectionState, Optional ByRef _
     sConnectionName As String) As Boolean
    
     Dim dwFlags As Long
     Dim sNameBuf As String
     Dim lR As Long
     Dim iPos As Long
    
     sNameBuf = String$(513, 0)
     lR = InternetGetConnectedStateEx(dwFlags, sNameBuf, 512, 0&)
     eConnectionInfo = dwFlags
     iPos = InStr(sNameBuf, vbNullChar)
     If iPos > 0 Then
     sConnectionName = Left$(sNameBuf, iPos - 1)
     ElseIf Not sNameBuf = String$(513, 0) Then
     sConnectionName = sNameBuf
     End If
     InternetConnected = (lR = 1)
    End Function
    
    'InternetConnected 函数的调用
    
     '检测是否已经以及使用什么方法连接到Internet
     bConnected = InternetConnected(eR, sName)
    
    
     '根据获得的结果输出
     If (eR And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then
     sMsg = sMsg & "使用modem连接到Internet." & vbCrLf
     End If
     If (eR And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then
     sMsg = sMsg & "使用内部网连接到Internet." & vbCrLf
     End If
     If (eR And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then
     sMsg = sMsg & "通过代理服务器连接到Internet." & vbCrLf
     End If
     If (eR And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then
     sMsg = sMsg & "现在连接处于离线状态." & vbCrLf
     End If
     If (eR And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then
     sMsg = sMsg & "连接已经被设定." & vbCrLf
     Else
     sMsg = sMsg & "没有设定好的连接." & vbCrLf
     End If
     If (eR And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then
     sMsg = sMsg & "本机已经安装了远程访问服务功能." & vbCrLf
     End If
    
     '显示连接名称
     If bConnected Then
     sMsg = "已连接到Internet,连接名称: " & sName & vbCrLf & vbCrLf & sMsg
     Else
     sMsg = "没有连接到Internet,连接名称: " & sName & vbCrLf & vbCrLf & sMsg
     End If
    
    

    http://www.applevb.com/
    panxixue的意见:
    可以向某个节点发ping 命令。如果没有回来的包,则表明网络已经 不通了。
    
    jame 的意见:
    有一个ras的api函数RasEnumConnections可以查出现在系统中所有的连接,返回是0就是没有连接了。
    下面是一个例子:
    BOOL WINAPI IsModemOnline()
    
{
    
RASCONN ras[20];
    
DWORD dSize,dNumber,dCount;
    
    
ras[0].dwSize = sizeof(RASCONN);
    
    
dSize = sizeof( ras );
    
    
if( RasEnumConnections( ras, &dSize, &dNumber ) == 0 )
    
if(dNumber>0)return TRUE;
    
return FALSE;
    
    
}
    
    

    如果返回TRUE就表示有连接。该例子在VC 6.0 pack2 + Win2000 pro通过。
    
    hzzh的意见:
    用Win32 API 函数,定义在Wininet.h中:
    BOOL InternetGetConnectedState()
    VC/BC/BCB 都可用。
    
    ShenBin的意见:
    在线返回 TRUE, 掉线返回 FALSE。遍历系统中所有 RAS 连接判断连接情况。Win2K/98 VC6 通过
    BOOL CRasThread::GetConnectState()
    
{
    
    
LPRASCONN lpRasConn = NULL;
    
DWORD cbBuf = 0;
    
DWORD cConn = 0;
    
DWORD dwRet = 0;
    
HRASCONN hrasconn;
    
RASCONNSTATUS rasStatus;
    
UINT ndx;
    
    
// enumerate connections
    
cbBuf = sizeof(RASCONN);
    
    
if ( (lpRasConn = ( LPRASCONN ) malloc((UINT)cbBuf)) != NULL)
    
{
    
lpRasConn->dwSize = sizeof( RASCONN );
    
dwRet = RasEnumConnections( lpRasConn, &cbBuf, &cConn );
    
for (ndx = 0; ndx < cConn; ndx++)
    
{
    
// get to HRASCONN
    
hrasconn = lpRasConn[ndx].hrasconn;
    
// get connection status
    
rasStatus.dwSize = sizeof(RASCONNSTATUS);
    
dwRet = RasGetConnectStatus( hrasconn, &rasStatus );
    
if ( dwRet )
    
return 0;
    
else
    
{
    
if (rasStatus.rasconnstate == RASCS_Connected)
    
return 1;
    
else return 0;
    
}
    
}
    
}
    
else
    
{
    
return 0;
    
}
    
    
}
    

此问题由Chen回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, Visual Basic, VB, Internet编程, INET, www, internet, ie

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio