以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [分享]外网IP地址和城市的获取、与IP地址无关性全自动登录和全自动升级  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=38453)

--  作者:shenyl0211
--  发布时间:2013/7/29 21:37:00
--  [分享]外网IP地址和城市的获取、与IP地址无关性全自动登录和全自动升级
如题,是狐友关注比较多的问题。

1、内网IP地址的获取在帮助中已有详述,但外网IP地址和城市的获取在帮助中只字不提,而在用户登录管理中获取IP地址是必需的,因为用户的初始密码都是“888”,通过记录IP地址和城市,开发者或管理者通过查询就可以协助证实是那台电脑、在什么时候、什么地点修改了用户的初始密码。我在lin_hailun的代码基础上调试后予以完善,比较适合实际。
2、与IP地址无关性的全自动登录有很多狐友提问,但论坛上都是答非所问,帮助中仅用扩展属性让用户登录时选择IP地址,这种做法显然是不可取的,我们编软件的必须对客户负责,尽量减少他们的额外操作。因此,我提供一种成熟的方法供大家参考,代码非常简单。

3、与IP地址无关性的全自动升级的代码我早已发在论坛上,见下文。

不妥之处,敬请斧正。若有更好的代码,敬请交流。谢谢!

1、外网IP地址和城市的获取

自定义用户登录窗口中的登录按钮的部分代码,用于获取登录用户的机器名、IP地址和城市,可记录在登录管理表中备查

Dim i As Integer

Dim HostName As String=System.Net.Dns.GetHostName \'获得本机的机器名

Dim IPAdress As System.Net.IPAddress=System.Net.Dns.GetHostByName(HostName).AddressList.GetValue(0) \'获得本机的IP地址

Dim ip99 As String=IPAdress.Tostring

If ip99.contains(mid(IP1,1,5))=0 Then \'如果不是通过公司局域网的IP1地址上网(即通过外网上网,或通过公司局域网内的路由器上网)

    \'由于不知道飞的代码如何转化为字符串,所以参考lin_hailun的代码,均在http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=24372&skin=0

    \'lin_hailun采用的http://city.ip138.com/city.asp提供的城市是错误的,至少我单位的解释是错误的,所以采用飞的http://ip.qq.com/,如果不需要获取城市代码,采用lin_hailun的代码更加简洁。

    Dim web As New System.Windows.Forms.WebBrowser()

    web.Navigate("http://ip.qq.com/")

    Do Until web.ReadyState = 4

        Application.DoEvents

    Loop

    Dim elems As System.Windows.Forms.HtmlElementCollection

    Elems = web.Document.GetElementsByTagName("Body")   \'根据标签得到数据集合

    Dim data As String = elems(0).InnerText

    Dim start As Integer = data.IndexOf("IP") + 4

    Dim ip91 As String =trim(data.SubString(start,15)) \'IP地址,最多15个字符

    Dim i As Integer

    Dim j As String

    For i =8 To 15 \'IP地址至少7

        j =mid(ip91,i,1)

        If j=chr(10) Then

            ip91=mid(ip91,1,i-1) \'最终的IP地址

            Exit For

        End If

    Next

    start = data.IndexOf("IP所在地为") + 9

    Dim ip92 As String=trim(data.SubString(start,15)) \'IP地址对应的城市,最多15个字符

    For i  =6 To 15 \'城市最少5个字符

        j =mid(ip92,i,1)

        If j=" " Then

            ip92=mid(ip92,1,i-1) \'最终的城市,忽略后面的运营商

            Exit For

        End If

    Next

    ip91=ip91 & "|" & ip92 \'合并

End If


2、与IP地址无关性的全自动登录

在BeforeConnectOuterDataSource事件中设置如下代码,不管外网内网都可自动登录。

下列代码中未定义的变量,见第3部分介绍的全局代码。

\'通用-根据是否开发状态以及内网和外网登录时服务器地址IP的不同,选择不同的连接字符串

Dim i As Integer=1 \'刚开始开发时用内部数据源,取i=0;基本成熟后测试或交付使用时用外部数据源,取i=1

If i=1 Or e.ProjectFile<> dpath & pfile Then \'这是开发时项目文件名

    Dim a As Boolean

    For i =1 To 5 \'ping5次

        a=Network.Ping(IP1,500) \'ping内网,每次500毫秒

        If a Then \'如果ping通就退出for循环

            Exit For

        End If

    Next

    If a Then \'如果内网Ping通,则用内网地址

        IPa=IP1

    Else \'否则用外网地址

        IPa=IP2

    End If

e.ConnectionString ="Provider=SQLOLEDB.1;Password=12345678;Persist Security Info=True;User ID=shenyl0211;Initial Catalog=" & sfile & ";Data Source=" & IPa

由于登录服务器SQL server的用户shenyl0211固定、密码12345678固定,所以无须引入变量

End If


3、与IP地址无关性的全自动升级的代码

详见:

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=37839&replyID=&skin=1

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=27687&replyID=&skin=1

注意:需要定义2个升级按钮,如:发布上传、系统升级

如果你本次发布时的狐表版本日期与上次一样,则使用发布上传按钮,升级文件包仅包含修改了的、你自己开发的软件文件;

否则使用系统升级按钮,但要预先查看狐表升级了哪些文件(根据文件的修改日期)、然后修改一个批命令文件(即更改狐表的升级文件名),升级文件包除了比发布上传多增加该批命令文件外,还要增加该批命令文件提及的狐表系统文件,但这种增加是全自动的。






--  作者:小刚
--  发布时间:2013/7/29 21:53:00
--  
谢谢分享~
--  作者:qq121454970
--  发布时间:2013/7/29 22:45:00
--  
谢谢分享
--  作者:lsy
--  发布时间:2013/7/29 22:53:00
--  
不错。
--  作者:夕然
--  发布时间:2013/7/29 23:02:00
--  
谢谢虽然现在还用不上呢
--  作者:ztmdnzc
--  发布时间:2013/8/2 12:56:00
--  
怎么没见狐爸的帖子呢?忙着升级呢?
--  作者:xiaoxinla
--  发布时间:2013/8/4 12:00:00
--  

谢谢分享


--  作者:Gryvip
--  发布时间:2013/8/5 21:05:00
--  
谢谢分享,顶上去
--  作者:李孝春
--  发布时间:2013/12/18 23:40:00
--  
感谢分享 但是如果仅仅是获得本地电脑IP  网关 子网掩码 DNS怎么操作呢?
--  作者:188802386
--  发布时间:2014/5/17 22:50:00
--  
谢谢分享