随笔 - 144  文章 - 1 评论 - 522 trackbacks - 9
<2004年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

昵称:雪美·考拉
园龄:7年7个月
粉丝:2
关注:0

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

相册

博客链接

技术站点

社区推荐

积分与排名

  • 积分 - 199574
  • 排名 - 428

最新评论

阅读排行榜

评论排行榜

推荐排行榜

 

什么是 Cookie?Cookie 其实是一个标签,经常可能听到的中文翻译:小舔饼。当你访问一个需要唯一标识你的站址的 WEB 站点时,它会在你的硬盘上留下一个标记,下一次你访问同一个站点时,站点的页面会查找这个标记。

  每个 WEB 站点都有自己的标记,标记的内容可以随时读取,但只能由该站点的页面完成。每个站点的Cookie与其他所有站点的Cookie存在同一文件夹中的不同文件内(你可以在 win98 的 Windows 目录下的 Cookie 文件夹中找到它们,而 win2k 则在 Documents and Settings 文件夹下特定用户的 cookies 文件夹中)。

  一个 Cookie 就是一个唯一标识客户的标记,Cookie 可以包含在一个对话期或几个对话期之间某个 WEB 站点的所有页面共享的信息,使用 Cookie 还可以在页面之间交换信息。这项功能经常被使用在要求认证客户密码以及电子公告板、WEB 聊天室等 ASP 程序中。

  尽管现在听起来cookie没有什么激动人心的,但实际上利用它,你能实现许多有意义的功能!比如说:你可以在站点上放置一个调查问答表,询问访问者最喜欢的颜色和字体,然后根据这些定制用户的web界面。并且,你还可以保存访问者的登录密码,这样,当访问者再次访问这个站点时,不用再输入密码进行登录。

  当然,cookie也有一些不足。首先,由于利用cookie的功能可以编程实现一些不良企图,所以大多数的浏览器中都有安全设定,其中可以设置是否允许或者接受cookie(IE浏览器中“工具”--“Internet选项...”--“安全”--“自定义级别”--“Cookie的使用”;Netscape浏览器中“工具”--“Cookie管理器”--“管理贮存的Cookie”即可),因此这就不能保证随时能使用cookie。再者,访问者可能有意或者无意地删除cookie。当访问者的机器遇到“蓝屏”死机时,或者重新格式化硬盘、安装系统后,原来保存的cookie将全部丢失。最后一点,有一些最初始的浏览器并不能支持cookie。


  ◆ 怎样利用cooklie?
  有2种使用cookie的基本方式:
  1、将cookie写入访问者的计算机(使用 Response 命令)
  2、从访问者的计算机中取回cookie(使用 Request 命令)

  ◆ 创建cookie的基本语法: Response.Cookies(cookie)[(key)|.attribute]=value
  这里的 cookie 是指定 cookie 的名称。
  而如果指定了 key,则该 cookie 就是一个字典。
  (测试一cookie是否为一个字典可用后面代码显示布尔值:<%=Request.Cookies("cookiename").HasKeys%>。为true是字典,false则不是。 )
  Attribute 指定 cookie 自身的有关信息。Attribute 参数可以是下列之一 :

  ①Domain 若被指定,则 cookie 将被发送到对该域的请求中去。域属性表明cookie由哪个网站产生或者读取,默认情况下,cookie的域属性设置为产生它的网站,但你也可以根据需要改变它。(Response.Cookies("CookieName").Domain = "www.mydomain.com")

  ②Path 为一路径属性,该属性可以实现更多的安全要求,通过设置网站上精确的路径,就能限制cookie的使用范围。如果未设置该属性,则使用应用程序的路径。(Response.Cookies("CookieName").Path = "/maindir/subdir/path" )

  ③Expires 指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,或在许多时候,我们希望能更长时间地在访问者的计算机上保存cookie。必须设置该日期。若此项属性的设置未超过当前日期,则在任务结束后 cookie 将到期。

  后面的代码,就可以设置cookie的使用到期时间为“2010年1月1日”: Response.Cookies("CookieName").Expires=#January 01, 2010#
  后面的代码,将设定cookie的过期时间为“cookie的创建时间+365天”:Response.Cookies("CookieName").Expires=Date+365
  但最好不要随便写 Response.Cookies("CookieName").Expires=Date,这样页面之间的调用时值会为空。


  执行下面的代码将会在访问者的计算机中创建一个cookie,名字=VisitorName,值=Ken :
Response.Cookies("VisitorName")="Ken"
  执行下面的代码将会在访问者的计算机中创建一个cookie,名字=VisitorName,值=表单中UserName的值
  Response.Cookies("VisitorName")=Request.Form("UserName")
  你可以扩展下面的代码成为Cookie子关键值(CookieSubName),即cookie字典的生成。代码如下:
  Response.Cookies("VisitorName")("FirstName")="Ken"
  Response.Cookies("VisitorName")("LastName")="Baumbach"

  ◆ 读取cookie的基本语法:Request.Cookies(cookie)[(key)|.attribute]
  cookie 指定要检索其值的 cookie。
  key 可选参数,用于从 cookie 字典中检索子关键字的值。
  attribe 指定 cookie 自身的有关信息。如:HasKeys 只读,指定 cookie 是否包含关键字。
  如果客户端浏览器发送了两个同名的 cookie,那么 Request.Cookie 将返回其中路径结构较深的一个。例如,如果有两个同名的的 cookie,但其中一个的路径属性为 /www/ 而另一个为 /www/home/,客户端浏览器同时将两个 cookie 都发送到 /www/home/ 目录中,那么 Request.Cookie 将只返回第二个 cookie。

  案例分析:

  ◆ num.asp(通过留在本地磁盘上的cookie记录一年内访问本站的次数,第一次显示“首次访问”,以后显示“第几次访问”)


<%dim numnum=request.cookies("visitnum")if num > "0" thennum=num+1Response.write "您已是第"&num&"次访问本站点了。"elseResponse.write "欢迎您首次访问本站。"num=1end ifresponse.cookies("visitnum")=numresponse.cookies("visitnum").expires=date+365%>
  ◆ showcookie.asp(从Cookies文件夹中遍历出浏览器所有的Cookie name,以及相关的字典Cookie的显示(蓝字显示))


<%For each cookie in Request.Cookiesif Request.cookies(cookie).HasKeys =false thenResponse.write cookie & "=" & Request.Cookies(cookie)Response.write ("") Elsefor each key in Request.Cookies(cookie)Response.write ("<font color=blue>")Response.write cookie & ".("&key&")" & "=" & Request.Cookies(cookie)(key)Response.write ("</font>")nextend ifnext%>
  ◆ check.asp
  首先,设置页面。然后,检查表单变量(在同一个页面中)。如果表单变量存在,就创建cookie,并设置到期时间。


<%@ LANGUAGE="VBSCRIPT" %><% bgcolor = Request.Form("bgcolor")fgcolor = Request.Form("fgcolor")pwd = Request.form("pwd")If bgcolor <>"" or fgcolor <>"" thenResponse.cookies("check")("bgcolor") = bgcolorResponse.Cookies("check")("fgcolor") = fgcolorResponse.Cookies("check")("pwd") = pwdResponse.Cookies("check").Expires=#may 01, 2004#End if'接着,读取cookiebgcolor = request.cookies("check")("bgcolor")fgcolor = request.cookies("check")("fgcolor")pwd = request.cookies("check")("pwd")'如果cookie在访问者的计算机上不存在,就创建一个表单,询问相关信息If bgcolor ="" and fgcolor ="" and pwd="" then%><HTML> <HEAD> </HEAD><body><DIV ALIGN="CENTER" ><Form action="check.asp" method="POST">Bgcolor: <input type="text" name="bgcolor"><BR>Fgcolor: <input type="text" name="fgcolor"><BR>Password:<input type="password" name="pwd"><BR>    <input type="submit" value="Submit"></Form></DIV></BODY><%End if'如果cookie已经存在,并且bgcolor存在,就跳转到color.asp。 If bgcolor <> "" thenResponse.Redirect "color.asp"End if%>
  ◆ color.asp(显示用户爱好颜色的页面特性)


<%bgcolor=request.cookies("check")("bgcolor")fgcolor=request.cookies("check")("fgcolor")pwd=request.cookies("check")("pwd")%><%response.write("<body bgcolor="&bgcolor&"><font color="&fgcolor&">")%>你的密码是:<%response.write(" "&pwd&" ")%>

posted @ 2004-08-02 16:12 雪美·考拉 阅读(474) 评论(0) 编辑


  所有的网站开发者都会非常喜欢cookie的强大特性和易用性,它在跟踪用户信息,建设人性化、个性化的网站方面,有着强大的作用,而且,又避免了使用数据库的昂贵开销。但是,cookie却不能跨越域传递,只有那些创建它的域才能访问;这里,我们讨论如何利用ASP突破这个限制。

Cookie简介

首先,我们对Cookie做一个简单的介绍,说明如何利用ASP来维护cookie。

Cookie是存储在客户端计算机中的一个小文件,这就意味着每当一个用户访问你的站点,你就可以秘密地在它的硬盘上放置一个包含有关信息的文件。这个文件几乎可以包含任何你打算设置的信息,包括用户信息、站点状态等等。这样的话,就有一个潜在的危险:这些信息有可能被黑客读取。为了防止这个问题的发生,一个有效的办法就是cookie只能被创建它的域所存取。这就是说:比如ytu.edu.cn只能访问ytu.edu.cn创建的cookie。通常来讲,这没有什么问题;但是,如果需要两个不同域上的两个不同站点共享保存在cookie中的用户信息,该如何处理呢?当然可以选择复制用户信,但是,如果你需要用户只能在一个站点上注册,并且自东成为另外一个站点的注册用户呢?或者,两个站点共享一个用户数据库,而又需要用户自动登录呢?这时候,跨越域共享cookie是最好的解决方案。

这里,先看一些ASP处理cookie的代码,以便以后便于引用参考。

'创建Cookie

Response.Cookies("MyCookie").Expires=Date+365

Response.Cookies("MyCookle").Domain="mydomaln.com"

Response.Cookies("MyCookle")("Username")=strUsername

Response.Cookies("MyCookle")("Password")=strPassword

读写cookie非常简单,上面的代码创建一个cookie并给cookie设置属性:域、过期时间,

以及其他一些保存在cookie中的值。这里,strUsename,strPassword是在前面某个地方

设置的变量。然后,通过下面的语句在cookie中读取。

'读取Cookie

datExpDate=Request.Cookies("MyCookie")

strDomaln=Request.Cookies("MyCookle").Domain

strUsername=Request.Cookies("MyCookle")("Username")

strPassword=Request.Cookies("MyCookie")("Password")

更详细的信息,可以参考ASP的资料。

  实现

简单地共享cookie的诀窍是重定向,

一般过程为:

1.一个用户点击siteA.com。

2.如果用户没有siteA.com的cookie,就把用户重定向到siteB.com。

3.如果用户有siteB.com的cookie,把用户连同一个特殊的标志(将在下面解释)重定向回

siteA.com,否则,只把用户重定向到siteA.com。

4.在siteA.com创建cookie。

看起来很简单,仔细分析一下:siteA.com和siteB.com共享相同的用户设置,所以,如果

用户有siteB.com的cookie(已经注册),siteA.com能够同样读取cookie、提供cookie所

允许的特性。这样,访问siteA.com的用户就如同访问了siteB.com。

这个检查的环节应该在siteA.com中的文件所包含一个cookies.inc中实现。让我们看一下

这段代码:

l—1

'SiteA.com"检查cookie

If Request.Querystring("Checked")<>"True" then

If not Request.Cookies("SiteA_Cookie").Haskeys then

'重走向到siteB.com

Response.Redlrect("http://www.siteB.com/cookie.asp")

End if

End if

  如果用户有一个siteA.com的cookie,则不需要做任何事情了;第一个if语句用来消除无限的循环。让我们看一下siteB.com上的cookie.asp文件来获得进一步的理解。

1—2

'SiteB.com'

检查cookie

If not Request.Cookies("SlteB_Cookle").Haskeys then

'重定向到siteA.com

Response.Redirect("http://www.siteA.com/index.asp"&"?checked=True")

Else

'获取username

strUsername=Request.Cookies("SiteB_Cookie")("Username")

'将用户连同一个特殊的标志返回到siteA.com

Response.Redlrect("http://www.siteA.com/index.asp"&"?

checked=True"&"identrfer="&strUsername)

End if

如果用户在siteB.com上仍没有cookie,于是,将他送回到siteA.com,并且通过在查询语句中提供一个叫做"checkd"的参数让应用程序知道你已经检查过cookie了。否则,将用户送回到siteB.com,并退出循环。

然而,如果用户拥有siteB.com的cookie,我们需要将用户送回siteA.com并告诉siteA.com。为此,我们在数据库中附加一个唯一的标志,username。所以,我们扩展siteA.com中的代码。

l—3

'SiteA.com

...

...

'检查标志

If Request.Querystring("identifier")<>"" then

strUsername=Request.Querystring("identifier")'记录到数据库

Response.Cookies("siteA_Cookie").Expires=Date+365

Response.Cookies("SiteA_Cookie").Domain="siteA.com"

Response.Cookies("siteA_Cookie")("Username")=strUsername

End if

最后,我们回到siteA.com。文件的第一部分(l-l)检查是否完成了cookie的检查,由于可以明显地知道已经完成(由语句中的"checked"参数表明),进行到l—3所示的程序的第二部分。如果存在特殊的标志,我们就可以在siteA.com创建cookie。使用这个特殊的标志(在这里是username),我们可以在任何需要的时候查询数据库。然后,设置cookie,显示页面的其他部分。如果没有指定的标志,也没必要担心,只要简单地显示页面的余下部分。

这样,毫不费力地,siteA.com拥有了和siteB.com一样的cookie。我们可以传输更多的信息而不只是一个标志,并且,将网络流量控制在最小范围内。

要注意一点,即使用户拥有siteA.com上的cookie,仍需要检查siteB.com。通常来讲,这不是必须的,也会节约时间。但是,一旦用户在siteB.com更改个人信息?这样做,会保持所有信息的同步。

  Cookie环要完成这些,我们需要两个文件:一个在原始站点服务器(siteA.com),完成检查;一个在参考服务器(siteB.com),验证用户。如果有一台参考服务器包含有需要的所有用户信息或cookie,就可以增加随意多的原始服务器,所需要做的就是在所有要共享cookie的服务器上增加cookie.inc文件。

也可以以相反的次序执行,例如,如果siteB.com是原始服务器,而siteA.com包含用户信息。访问过siteA.com却从未访问过siteB.com的用户也可以登录到siteA.com,并且拥有所有的曾经的设置。注意,如果拥有多个参考服务器,这样将会很使人迷惑,并且消耗过多的资源,因为必须将用户重定向到每一台参考服务器。

理论上讲,可以拥有一个所有站点都共享相同的用户的网络。最可行的方案就是建立共享cookie环。将参考服务器列表存储在一个地方(备份服务器),以便每个参考服务器可以查找并决定重定向用户的下一个站点。记住一定要通过查询字符串的意思跟踪用户是在哪个原始服务器开始。这样信息的传输非常迅速,这个环节变得越来越可行。

这里还存在一些问题,首先是反应时间。对用户而言,他们最好不知道过程是怎样的。他所需的时间依赖于siteA.com、siteB.com之间的连接,有可能会比较长,在实现cookie环时可能会更长。

再一个主要问题,就是每一个实现者大都会面对无限的重定向。这有很多原因,例如:用户的测览器不支持cookie。这就需要再设计代码来监测用户浏览器的性能。

最好,还需要注意安全问题。如果有些黑客发现了其中的诀窍,他可能会得到cookie中的信息。最简单的防范办法就是保护参考服务器,只允许原始服务器访问Cookie.asp文件。
 

posted @ 2004-08-02 16:08 雪美·考拉 阅读(467) 评论(0) 编辑

用ASP检测浏览器是否允许Cookie功能的方法

作  者:董云  YUN DONG
工作单位:黄埔海关技术处工程师
通讯地址:广州市经济技术开发区志诚大道海关大楼
电话号码:020-82130556
邮政编码:510730
电子邮件:dy168@163.net

摘  要:指出用ASP检测浏览器Cookie功能的误区,说明错误的原因,并给出
解决方法和源代码
关键词:浏览器、Cookie、信息记录区

一、前言
检测浏览器是否允许Cookie功能其实并不困难。许多的文章都讨论到这个问题,但是,这
些文章中往往存在着许多问题,使得读者容易混淆,甚至有些文章中所给出的方法根本就是
错误的。本文将一步一步地详细解释困难所在,并给出实用的ASP代码。

二、问题的提出
尽管现在的浏览器基本上都支持Cookie功能,但是用户可以通过设置将Cookie功能禁止,
对于希望将一些信息记录到浏览器上去的Web服务器,就必须要清楚前来访问的用户浏览
器是否支持Cookie功能,惟一的办法就是自己去测试用户浏览器是否支持Cookie。这个问
题似乎十分简单,正如许多文章中所介绍的一样,我先给出一段ASP代码,它似乎可以轻
易地完成任务。
Cookie_test.asp

<%@ Language="VBScript" %>
<%
Option Explicit
Dim CookieValueset
Dim CookieValueRead
CookieValueset="true"
CookieValueRead="false"
Response.Cookies("Cookie_test") = CookieValueset
Response.Cookies("Cookie_test").Expires = Date + 1
CookieValueRead = Request.Cookies("Cookie_test")
If CookieValueRead = CookieValueSet Then
 Response.Write "浏览器支持Cookies"
Else
 Response.Write "浏览器不支持Cookies"
End If
%>

实际上,上述代码在浏览器允许和禁止Cookie功能的情况下,均得到浏览器支持Cookie功
能的结果。为什么会产生这样的结果呢?首先让我们来看一下Cookie的原理。浏览器是遵
循HTTP协议访问Web服务器的,一个完全的HTTP请求是由浏览器发出申请,Web服务
器响应其申请的内容,在这个过程中,浏览器会提供一块信息记录区来存储一些特殊的信息,
这个信息记录区是可以由浏览器和Web服务器同时访问的,而Cookie就保存在这个信息记
录区中。通过这个信息记录区,Web服务器可以写入Cookie以记录一些信息,并且可以在
将来进行访问,直到这个Cookie的生命期终止。在ASP代码中的Response.Cookies和
Request.Cookies类就是用来访问Cookie的。
现在的问题在于,按照HTTP协议,在往浏览器中写入Cookie后,其内容实际上存在于缓
存之中,直到该页面终止,才将内容写入到浏览器提供的信息记录区中去。在同一页面中写
入Cookie后立即读出其内容,读出的是缓存中的临时信息,而不是信息记录区中真正的
Cookie内容,所以在上面的代码中,即使浏览器禁止Cookie功能,仍然得到成功写入Cookie
的结果。

三、问题的解决
要解决这个问题,可以有两个办法,第一个办法是利用两个页面檔来分别进行Cookie的
写入和读出,在第一个檔中写入Cookie,然后转向第二个檔读出并判断,这样可以轻
易地得到正确的结果。但访问两个页面檔的方法显然对Web服务器的管理添加了麻烦,
在不担心这个问题的前提下,这是一个最佳的解决方法。
第二个办法是利用ASP中的REDIRECT语句来解决问题,如下笔者给出ASP源代码。浏
览器访问Cookie.asp,这个檔中含有一些代码判断Cookie检查是否已经作过,如果是,
则显示检查结果,如果没有,则自动转向Cookie_Detect.asp檔,在该檔中测试Cookie
功能并将结果传回给Cookie.asp。值得强调的是,我们不能使用ASP的Cookies和Sessions,
因为它们都是利用前面所提的信息记录区来存储信息的,当Cookie功能禁止后,不可跨页
面使用。因此,笔者使用了QuerySring 来传递参数。

四、源代码
Cookie.asp

<%@ Language="VBScript" %>
<%
Option Explicit
Response.Buffer = True
Dim bCookies ' T/F indicating Cookies enabled.
bCookies = Request.QueryString("Cookies")
Select Case LCase(bCookies)
   Case "true", "false"
      ' We got a valid response.
      bCookies = CBool(bCookies)
   Case Else
        Response.Cookies("Cookie_test") = "true"
        Response.Redirect "Cookie_detect.asp"
End Select
%>
<html>
<head>
 <title>检测浏览器是否允许Cookie功能</title>
</head>
该浏览器Cookies功能: <%= bCookies %>
</body>
</html>

Cookie_detect.asp

<%@ Language="VBScript" %>
<%
Option Explicit
Response.Buffer = True
 Dim bCookiesEnabled
   bCookiesEnabled = Request.Cookies("Cookie_test")
   bCookiesEnabled = (bCookiesEnabled = "true")
   Response.Redirect "Cookie.asp" & "?Cookies=" & bCookiesEnabled
%>

posted @ 2004-08-02 16:01 雪美·考拉 阅读(503) 评论(0) 编辑

Private Const SOCKET_ERROR As Long = -1
Private Const MAX_WSADescription = 256
Private Const MAX_WSASYSStatus = 128
Private Const ERROR_SUCCESS       As Long = 0
Private Const WS_VERSION_REQD     As Long = &H101
Private Const MIN_SOCKETS_REQD    As Long = 1
Private Const WS_VERSION_MAJOR    As Long = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR    As Long = WS_VERSION_REQD And &HFF&

Private Type HOSTENT
    hName      As Long
    hAliases   As Long
    hAddrType  As Integer
    hLen       As Integer
    hAddrList  As Long
End Type

Private Type WSADATA
    wVersion      As Integer
    wHighVersion  As Integer
    szDescription(0 To MAX_WSADescription)   As Byte
    szSystemStatus(0 To MAX_WSASYSStatus)    As Byte
    wMaxSockets   As Integer
    wMaxUDPDG     As Integer
    dwVendorInfo  As Long
End Type

Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

Private Function GetIPAddress(Optional sHost As String) As String
'返回给定机器名的Ip地址,机器名为空时返回本机Ip地址
    Dim sHostName   As String * 256
    Dim lpHost      As Long
    Dim HOST        As HOSTENT
    Dim dwIPAddr    As Long
    Dim tmpIPAddr() As Byte
    Dim i           As Integer
    Dim sIPAddr     As String
    Dim werr        As Long

    If Not SocketsInitialize() Then
        GetIPAddress = ""
        Exit Function
    End If
   
    If sHost = "" Then
        If gethostname(sHostName, 256) = SOCKET_ERROR Then
            werr = WSAGetLastError()
            GetIPAddress = ""
            SocketsCleanup
            Exit Function
        End If

        sHostName = Trim$(sHostName)
    Else
        sHostName = Trim$(sHost) & Chr$(0)
    End If
   
    lpHost = gethostbyname(sHostName)

    If lpHost = 0 Then
        werr = WSAGetLastError()
        GetIPAddress = ""
        SocketsCleanup
        Exit Function
    End If

    CopyMemory HOST, lpHost, Len(HOST)
    CopyMemory dwIPAddr, HOST.hAddrList, 4

    ReDim tmpIPAddr(1 To HOST.hLen)
    CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen

    For i = 1 To HOST.hLen
        sIPAddr = sIPAddr & tmpIPAddr(i) & "."
    Next

    GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
    SocketsCleanup
End Function

Private Function SocketsInitialize(Optional sErr As String) As Boolean
    Dim WSAD As WSADATA, sLoByte As String, sHiByte As String
    If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
        sErr = "The 32-bit Windows Socket is not responding."
        SocketsInitialize = False
        Exit Function
    End If

    If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
        sErr = "This application requires a minimum of " & _
                CStr(MIN_SOCKETS_REQD) & " supported sockets."

        SocketsInitialize = False
        Exit Function
    End If


    If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or _
            (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And _
            HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then

        sHiByte = CStr(HiByte(WSAD.wVersion))
        sLoByte = CStr(LoByte(WSAD.wVersion))

        sErr = "Sockets version " & sLoByte & "." & sHiByte & _
                " is not supported by 32-bit Windows Sockets."

        SocketsInitialize = False
        Exit Function
    End If
    SocketsInitialize = True
End Function

Private Sub SocketsCleanup()
    If WSACleanup() <> ERROR_SUCCESS Then
        App.LogEvent "Socket error occurred in Cleanup.", vbLogEventTypeError
    End If
End Sub

Private Function HiByte(ByVal wParam As Integer)
    HiByte = wParam \ &H1 And &HFF&
End Function

Private Function LoByte(ByVal wParam As Integer)
    LoByte = wParam And &HFF&
End Function

Private Sub Command1_Click()
    On Error Resume Next
    Screen.MousePointer = vbHourglass
    txtIP.Text = GetIPAddress(txtCmpName.Text)
    Screen.MousePointer = vbDefault
End Sub


 

posted @ 2004-08-02 13:44 雪美·考拉 阅读(717) 评论(3) 编辑