vfp 如何判断是否连接互联网
请教各位大佬如何判断是否连接互联网#DEFINE INTERNET_CONNECTION_MODEM 1
#DEFINE INTERNET_CONNECTION_LAN 2
#DEFINE INTERNET_CONNECTION_PROXY 4
#DEFINE INTERNET_CONNECTION_MODEM_BUSY 8
#DEFINE INTERNET_RAS_INSTALLED 16
#DEFINE INTERNET_CONNECTION_OFFLINE 32
#DEFINE INTERNET_CONNECTION_CONFIGURED 64
DECLARE SHORT InternetGetConnectedState IN Wininet.dll;
INTEGER @lpdwFlags,;
INTEGER dwReserved
LOCAL nState,lpdwFlags
lpdwFlags=0
nState=InternetGetConnectedState(@lpdwFlags,0)
IF nState=1
netzt=.T.
=MESSAGEBOX("Modem 连接:"+_Ok(lpdwFlags,INTERNET_CONNECTION_MODEM)+;
CHR(13)+"LAN 连接:"+_Ok(lpdwFlags,INTERNET_CONNECTION_LAN)+;
CHR(13)+"代理服务器:"+_Ok(lpdwFlags,INTERNET_CONNECTION_PROXY)+;
CHR(13)+"离线连接 :"+_Ok(lpdwFlags,INTERNET_CONNECTION_OFFLINE)+;
CHR(13)+"连接配置 :"+_Ok(lpdwFlags,INTERNET_CONNECTION_CONFIGURED))
ELSE
netzt=.f.
=MESSAGEBOX("网络连接错误!")
ENDIF
FUNCTION _Ok(nBase,nValue)
RETURN IIF(BITAND(nBase,nValue)=nValue,"是","否")
ENDFUNC
**********************************************************这种方法是不行的
方法2:
Public intnetlj
intnetlj=.F.
Do cslj
******************************
If intnetlj=.T.
Do lj
Release intnetlj
Else
Return
ENDIF
**************************
Procedure lj
*连接后处理代码
*************
Procedure cslj
Declare Integer InternetGetConnectedState In wininet.Dll ;
Integer @lpdwFlags, ;
Integer dwReservednReserved
If internetgetconnectedstate(7, 0) = 0
*Messagebox("未连结到互联网!请进行拨号连接或检查网络状态。", 0, "错误")
intnetlj=.F.
Else
Do Case
Case internetgetconnectedstate(7, 0) = 1
*Messagebox("拨号已经连通!",0,"提示")
intnetlj=.T.
Case internetgetconnectedstate(7, 0) = 2
*Messagebox("网络已经连通",0,"提示")
intnetlj=.T.
Otherwise
*Messagebox("通过代理连通!")
intnetlj=.T.
Endcase
Endif
**************************************************这种也是不行的
上面两种方法其实都差不多,都是硬性判断,一旦IP地址有错,或者DNS有错,或者DHCP没问题,但外网断了,内网没问题,这种方法就直接芭比Q了,不能解决实质上的问题。
方法3:
Declare Integer GetRTTAndHopCount In Iphlpapi;
INTEGER DestIpAddress, Long @HopCount,;
INTEGER MaxHops, Long @RTT
Declare Integer inet_addr In ws2_32 String cp
Local lnDst, lnHop, lnRTT
lnDst = inet_addr("119.75.216.20") && 百度 IP, 或者你自己的 IP 地址
Store 0 To lnHop, lnRTT
If GetRTTAndHopCount(lnDst, @lnHop, 50, @lnRTT) = 0
Messagebox("你没有连接到 Internet")
Else
Messagebox("你已经连接到 Internet")
Endif
Clear Dlls GetRTTAndHopCount, inet_addr
*******************************************************************
这种方法,直接也可行,也就是使用了ping命令
优点:确实可以判断是否联网
缺点:运行程序后,好像程序要卡那么一会,好像死机了一样,大概10来秒(因为执行ping命令有个过程!)
问题:有没有哪位大佬可以解决一下让程序变得不卡。
或者其他判断方式也可以,前提是能真正的判断是否联网,感谢!
[此贴子已经被作者于2023-3-17 10:35编辑过]