请求高手帮忙处理,wininet提交上传,使用大约2个小时后就会错误,就取不到网页内容。
请求高手帮忙处理,wininet提交上传,使用约几个小时后就会错误,就取不到网页内容。要关闭重新打开才可以继续使用,再使用约几个小时后就又会错误,没有结果。
--------------------编程问答-------------------- 也许网络阻塞了吧?只见函数,没见调用,也许你调用得太频繁了,另外是不是服务器端ban你了 --------------------编程问答-------------------- 啥错误哩......? --------------------编程问答--------------------
Option Explicit
'==POST提交二进制数据
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal lpszCallerName As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal lpszServerName As String, ByVal nProxyPort As Integer, ByVal lpszUsername As String, ByVal lpszPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function InternetReadFileByte Lib "wininet.dll" Alias "InternetReadFile" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hInternetSession As Long, ByVal lpszVerb As String, ByVal lpszObjectName As String, ByVal lpszVersion As String, ByVal lpszReferer As String, ByVal lpszAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As Any, ByVal lOptionalLength As Long) As Boolean
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As String) As Boolean
Private Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Integer
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function PostInfo(ByVal srv As String, ByVal Port As String, ByVal script As String, ByRef postdat() As Byte) As String
Dim hInternetOpen As Long
Dim hInternetConnect As Long
Dim hHttpOpenRequest As Long
Dim BRet As Boolean
On Error GoTo errh
Const INTERNET_OPEN_TYPE_PRECONFIG As Long = &H0
hInternetOpen = InternetOpen("http generic", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
If hInternetOpen <> 0 Then
Const INTERNET_SERVICE_HTTP = 3
hInternetConnect = InternetConnect(hInternetOpen, srv, Port, vbNullString, "HTTP/1.0", INTERNET_SERVICE_HTTP, 0, 0)
If hInternetConnect <> 0 Then
Const INTERNET_FLAG_RELOAD = &H80000000
hHttpOpenRequest = HttpOpenRequest(hInternetConnect, "POST", script, "HTTP/1.0", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
If hHttpOpenRequest <> 0 Then
Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000
Const HTTP_ADDREQ_FLAG_ADD = &H20000000
Dim sHeader As String
sHeader = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
BRet = HttpAddRequestHeaders(hHttpOpenRequest, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD)
If BRet = False Then GoTo errh
Dim SBin() As Byte
Dim SLen&
SBin = postdat
SLen = UBound(SBin) - LBound(SBin) + 1
BRet = HttpSendRequest(hHttpOpenRequest, vbNullString, 0, ByVal VarPtr(SBin(LBound(SBin))), SLen)
If BRet = False Then GoTo errh
Dim bDoLoop As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer$
Dim Size&
Dim StrSize As String * 1024
Dim xhcs&
bDoLoop = True
Dim TempBin(1 To 100) As Byte, BCount&, RBin() As Byte
While bDoLoop And BRet
BCount = BCount + 1
bDoLoop = InternetReadFileByte(hHttpOpenRequest, TempBin(1), 100, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then
bDoLoop = False
Else
ReDim Preserve RBin(1 To (BCount - 1) * 100 + lNumberOfBytesRead)
CopyMemory ByVal VarPtr(RBin((BCount - 1) * 100 + 1)), ByVal VarPtr(TempBin(1)), lNumberOfBytesRead
End If
Wend
PostInfo = StrConv(RBin, vbUnicode)
End If
End If
End If
If hHttpOpenRequest <> 0 Then InternetCloseHandle hHttpOpenRequest
hHttpOpenRequest = 0
If hInternetConnect <> 0 Then InternetCloseHandle hInternetConnect
hInternetConnect = 0
If hInternetOpen <> 0 Then InternetCloseHandle hInternetOpen
hInternetOpen = 0
Exit Function
errh: PostInfo = ""
If hHttpOpenRequest <> 0 Then InternetCloseHandle hHttpOpenRequest
hHttpOpenRequest = 0
If hInternetConnect <> 0 Then InternetCloseHandle hInternetConnect
hInternetConnect = 0
If hInternetOpen <> 0 Then InternetCloseHandle hInternetOpen
hInternetOpen = 0
End Function
是一直刷新取网页内容,与服务器无关的。
出现取不到内容后,就一直取不到内容,关闭重新打开就可以了。 --------------------编程问答--------------------
一直刷新取网页内容。
出现取不到内容后,就一直取不到内容,关闭重新打开就可以了。
已测试了几天都是这样的情况 ,有什么办法吗?
用XMLHTPP 就不会出现这种情况,但是XMLHTPP占用网络带宽影响太大。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 数组使用完后要用Erase释放
在合适的位置加Erase SBin
试试
Erase 语句
重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。
语法
Erase arraylist
所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。
说明
Erase 根据是固定大小(常规的)数组还是动态数组,来采取完全不同的行为。Erase 无需为固定大小的数组恢复内存。Erase 按下表来设置固定数组的元素:
数组类型 Erase 对固定数组元素的影响
固定数值数组 将每个元素设为 0。
固定字符串数组(长度可变) 将每个元素设为零长度字符串 ("")。
固定字符串数组(长度固定) 将每个元素设为 0。
固定 Variant 数组 将每个元素设为 Empty。
用户定义类型的数组 将每个元素作为单独的变量来设置。
对象数组 将每个元素设为特定值 Nothing。
Erase 释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
--------------------编程问答-------------------- 数组使用完后要用Erase释放
在合适的位置加Erase SBin
试试
Erase 语句
重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。
语法
Erase arraylist
所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。
说明
Erase 根据是固定大小(常规的)数组还是动态数组,来采取完全不同的行为。Erase 无需为固定大小的数组恢复内存。Erase 按下表来设置固定数组的元素:
数组类型 Erase 对固定数组元素的影响
固定数值数组 将每个元素设为 0。
固定字符串数组(长度可变) 将每个元素设为零长度字符串 ("")。
固定字符串数组(长度固定) 将每个元素设为 0。
固定 Variant 数组 将每个元素设为 Empty。
用户定义类型的数组 将每个元素作为单独的变量来设置。
对象数组 将每个元素设为特定值 Nothing。
Erase 释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
--------------------编程问答-------------------- 数组使用完后要用Erase释放
在合适的位置加Erase SBin
试试
Erase 语句
重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。
语法
Erase arraylist
所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。
说明
Erase 根据是固定大小(常规的)数组还是动态数组,来采取完全不同的行为。Erase 无需为固定大小的数组恢复内存。Erase 按下表来设置固定数组的元素:
数组类型 Erase 对固定数组元素的影响
固定数值数组 将每个元素设为 0。
固定字符串数组(长度可变) 将每个元素设为零长度字符串 ("")。
固定字符串数组(长度固定) 将每个元素设为 0。
固定 Variant 数组 将每个元素设为 Empty。
用户定义类型的数组 将每个元素作为单独的变量来设置。
对象数组 将每个元素设为特定值 Nothing。
Erase 释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
--------------------编程问答-------------------- 一直读取增加缓存,是不是可以定时清一下缓存呢~这样应该会好点吧! --------------------编程问答--------------------
具体需要什么做,可不可以,复制代码,你给修改一下。
补充:VB , 控件