当前位置:编程学习 > VB >>

请求高手帮忙处理,wininet提交上传,使用大约2个小时后就会错误,就取不到网页内容。

请求高手帮忙处理,wininet提交上传,使用约几个小时后就会错误,就取不到网页内容。

要关闭重新打开才可以继续使用,再使用约几个小时后就又会错误,没有结果。



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


--------------------编程问答-------------------- 也许网络阻塞了吧?只见函数,没见调用,也许你调用得太频繁了,另外是不是服务器端ban你了 --------------------编程问答-------------------- 啥错误哩......? --------------------编程问答--------------------
引用 1 楼 dbcontrols 的回复:
也许网络阻塞了吧?只见函数,没见调用,也许你调用得太频繁了,另外是不是服务器端ban你了

是一直刷新取网页内容,与服务器无关的。
出现取不到内容后,就一直取不到内容,关闭重新打开就可以了。 --------------------编程问答--------------------
引用 2 楼 silencenet 的回复:
啥错误哩......?


一直刷新取网页内容。
出现取不到内容后,就一直取不到内容,关闭重新打开就可以了。

已测试了几天都是这样的情况 ,有什么办法吗?

用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 语句来重新定义该数组变量的维数。
--------------------编程问答-------------------- 一直读取增加缓存,是不是可以定时清一下缓存呢~这样应该会好点吧! --------------------编程问答--------------------
引用 7 楼 dbcontrols 的回复:
数组使用完后要用Erase释放
在合适的位置加Erase SBin
试试

Erase 语句

      

重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。

语法

Erase arraylist

所需的 arraylist 参数是一个或多个用逗号隔开的需要清除的数组变量。

说明

Erase 根据是固定大小(常规的)数组还是动态数组,来……



具体需要什么做,可不可以,复制代码,你给修改一下。
补充:VB ,  控件
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,