如题,如何判断一个url是否有效。
找到的资料都是说.net的,那位能告诉我vb6该怎么做。

解决方案 »

  1.   

    if IfConnected("www.sina.com.cn")=false then
        msgbox "不通"
    endifFunction IfConnected(www$) As Boolean
       Dim d As Date, k&, b%   On Error Resume Next
       bLoop = False
       Winsock1.Close
       d = Now
       Winsock1.RemoteHost = www ' "www.sina.com.cn"
       Winsock1.RemotePort = 80
       Winsock1.Connect: b = 0
       Do
          DoEvents
          k = DateDiff("s", d, Now)
          If k < 0 Or k > 7 Then b = 1: Exit Do
       Loop While bLoop = False
       If b = 0 Then IfConnected = bConnected
       Winsock1.Close
    End Function
      

  2.   

    多谢 bdxzq(思考)
    但你这是判断一个站点的办法,我要的是判断一个页面是否存在的方法。
    用webbrowser控件是可以,但速度太慢,而且他是把整个文件下载下来,我不需要,只需要判断链接是否有效就可以。
      

  3.   

    用WINSOCK控件发送HTTP请求头,如果一个页面存在,则返回200消息,否则页面不存在。
    具体实现:
    1、发送HTTP头:
    首先构建最简请求字符串:
    dim HTTPHeader as string
    HTTPHeader=""
    HTTPHeader=HTTPHeader & "GET YourUrl" & vbCrLf 
    HTTPHeader=HTTPHeader & "Host: YourHost" & vbCrLf & vbCrLf
    这样的头就可以了。然后发送请求:
    socks.Connect "YourHost", "80"然后在connet事件时:
    socks.SendData HTTPHeader
    2、接收数据
    Dim DataStr As String
    socks.GetData  DataStr
    If InStr(1, DataStr, "HTTP/1.1 200 OK") Or InStr(1, DataStr, "HTTP/1.0 200 OK")Then '检查http响应状态
    '页面存在
    else
    '页面不存在
    end if
      

  4.   

    多谢lightwindxu() 
    上午有事,中午测试,通过了我就结贴。
      

  5.   

    补充一点说明:
        服务器返回的数据有2部分组成。一部分是HTTP响应消息头,另一部分是文件数据。服务返回的数据不一定是几次,有可能一次,有可能二次,或者N次,而且响应消息头和返回的数据不一定是分开的,有可能是一起返回,有可能第一次返回消息头,第二次返回数据。服务器不同而不同。
    但是有一点是肯定的,就是第一次返回的数据肯定包含消息头,所以你在接受完第一次数据之后,马上就应该关闭socks实例,这样免得再接受没用的文件数据。(这是提高速度的关键)我想了一下,给你完整代码吧:
    首先工程-部件,引用winsock,然后建立实例名称socks。
    代码部分:Dim HTTPHeader As StringPrivate Sub Form_Load()
    HTTPHeader = ""
    HTTPHeader = HTTPHeader & "GET http://www.rcno.com.cn/index.asp" & vbCrLf
    HTTPHeader = HTTPHeader & "Host: www.rcno.com.cn" & vbCrLf & vbCrLf
    socks.RemoteHost = "www.rcno.com.cn"
    socks.RemotePort = "80"
    socks.Connect
    End SubPrivate Sub socks_Close()'这个函数是必须要写的,不然winsock不会马上关闭。
    socks.Close
    End SubPrivate Sub socks_Connect()
    MsgBox "成功连接主机!"
    socks.SendData HTTPHeader
    End SubPrivate Sub socks_DataArrival(ByVal bytesTotal As Long)
    Dim DataStr As String
    socks.GetData DataStr
    If InStr(1, DataStr, "HTTP/1.1 200 OK") Or InStr(1, DataStr, "HTTP/1.0 200 OK") Then '检查http响应状态
    MsgBox "页面存在!"
    socks.Close'必须马上关闭,不然将会返回很多不必要的数据
    Else
    MsgBox "页面不存在!"
    socks.Close'必须马上关闭,不然将会返回很多不必要的数据
    End If
    End Sub
      

  6.   

    to:lightwindxu() 
    为什么我得到的返回字符串中不包含http/1.1这样的信息?
    只有:"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title>Shuttle Service</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
    <meta name="ProgId" content="VisualStudio.HTML">
    <meta name=
      

  7.   

    这是因为第二次返回的信息把第一次返回的信息覆盖掉了,解决的办法是:设置一个boolean变量,放在socks_DataArrival事件里,一旦socks_DataArrival事件发生(接收到一次数据),马上就winsock.close 
      

  8.   

    就是下面这样:定义一个窗口级的布尔变量:dim receive_stau as booleanPrivate Sub socks_DataArrival(ByVal bytesTotal As Long)if receive_stau =falseDim DataStr As String
    socks.GetData DataStr
    If InStr(1, DataStr, "HTTP/1.1 200 OK") Or InStr(1, DataStr, "HTTP/1.0 200 OK") Then '检查http响应状态
    MsgBox "页面存在!"
    socks.Close'必须马上关闭,不然将会返回很多不必要的数据
    Else
    MsgBox "页面不存在!"
    socks.Close'必须马上关闭,不然将会返回很多不必要的数据
    End Ifreceive_stau =true
    end ifEnd Sub
      

  9.   

    to:lightwindxu()
    我加过判断了,结果还是一样,是否存在什么配置,使http服务器不返回协议头?