标题:vfp 如何判断是否连接互联网
只看楼主
hytizj023
Rank: 1
等 级:新手上路
帖 子:166
专家分:7
注 册:2023-3-2
结帖率:100%
已结贴  问题点数:20 回复次数:2 
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编辑过]

搜索更多相关主题的帖子: DEFINE MESSAGEBOX 连接 INTEGER 判断 
2023-03-17 10:34
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:18 
方法太多了,这样大概也行:
程序代码:
oHttp = NewObject('Msxml2.ServerXMLHTTP')
oHttp.setTimeouts(5000, 5000, 1000, 5000)
oHttp.open('POST', 'http://www.baidu.com', .t.)
Try
    oHttp.send()
    lOk = .t.
Catch
    lOk = .f.
EndTry
If lOk
    te = Datetime() + 10        && 最多等 10 秒
    Do while oHttp.readyState != 4 and Datetime() <= te and Inkey(0.1) != 27
        Wait window nowait noclear ;
            Textmerge('正在测试互联网连接 <<te - Datetime()>> ...... 按 Esc 取消')
    EndDo
    Wait clear
    lOk = (oHttp.readyState == 4)
EndIf
MessageBox(Iif(lOk, 'ok', 'unknow'))

为预防百度真的瘫痪了,再多测一个其他的大网站可能保险点


[此贴子已经被作者于2023-3-17 11:26编辑过]

2023-03-17 11:22
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:2 
回复 2楼 csyx
学习啦,谢谢!
2023-03-17 18:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511576-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035805 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved