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
用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
多谢lightwindxu() 上午有事,中午测试,通过了我就结贴。
补充一点说明: 服务器返回的数据有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
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=
就是下面这样:定义一个窗口级的布尔变量: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
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
但你这是判断一个站点的办法,我要的是判断一个页面是否存在的方法。
用webbrowser控件是可以,但速度太慢,而且他是把整个文件下载下来,我不需要,只需要判断链接是否有效就可以。
具体实现:
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
上午有事,中午测试,通过了我就结贴。
服务器返回的数据有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
为什么我得到的返回字符串中不包含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=
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
我加过判断了,结果还是一样,是否存在什么配置,使http服务器不返回协议头?