找。。FJGoodGood(_FJ_强中强)

bhwhy 2005-01-17 03:27:26
FJGoodGood(_FJ_强中强),SystemInformation.NetWork,如果我把连接禁用了,仍然显示true啊,这样实际上并没有连接到网络啊,是不是要把网线断掉才是false,如果那样的话,意义不大啊。
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhwhy 2005-01-17
  • 打赏
  • 举报
回复
多谢。已解决
FJGoodGood 2005-01-17
  • 打赏
  • 举报
回复
这还有一个更强大的API方法,你可以借鉴:
如何能够判断网络已经断线



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

C/C++ - Internet编程

Visual Basic - Internet编程

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

A回答:

我对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;
}

}
FJGoodGood 2005-01-17
  • 打赏
  • 举报
回复
用Window API 吧:
using System.Runtime.InteropServices;

[DllImport("wininet.dll", CharSet=CharSet.Auto)]
public static extern int InternetGetConnectedState(ref int dwFlags, int dwReserved);
......
int flags = 0;
int result = InternetGetConnectedState(ref flags, 0);
if (result == 1) //连接,
else //无连接

这样作是可以判断的,不过有5秒左右的延迟。
bhwhy 2005-01-17
  • 打赏
  • 举报
回复
多谢了。
FJGoodGood 2005-01-17
  • 打赏
  • 举报
回复
哦,sorry,我没考虑这个问题。
以前我做过一个拨号计时程序,用API可以判断,我再帮你找找。
bhwhy 2005-01-17
  • 打赏
  • 举报
回复
????

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧