Winforms在XP上下载大文件套接字错误

时间:2013-07-19 16:25:37

标签: vb.net winforms file buffer

我的客户端应用程序从我们的Web服务下载大型二进制文件时出现问题。请注意,在运行较高操作系统的任何其他计算机上都不会发生这种情况,大多数较小的文件大小都不会发生这种情况。无论出于何种原因,应用程序在第一个While循环中失败,到目前为止没有任何谷歌搜索帮助。

代码:

Try
        Dim strWebRequestUrl As String = (url ommited)
        Dim fileSize As Int64 = Nothing
        Dim reqDownload As HttpWebRequest = HttpWebRequest.Create(strWebRequestUrl)
        Dim resDownload As HttpWebResponse = reqDownload.GetResponse
        Dim streamDownload As Stream = Nothing
        Dim bytesToRead As Int64 = Nothing
        Dim totalBytes As Int64 = Nothing
        Dim bytesRead As Int64 = Nothing
        Dim saveLocation As String = Nothing
        Dim saveExt As String = resDownload.GetResponseHeader("EXTENSION")
        Dim fstr As FileStream = Nothing
        Dim downloadPercent As String = "0%"
        fileSize = resDownload.ContentLength
        'This is just logging stuff:
        StrDebugStatus = "Step_Row_ID downloaded file size: " & fileSize
        LogDebug(StrDebugStatus)
        streamDownload = resDownload.GetResponseStream
        Dim inBuf(fileSize) As Byte
        bytesToRead = CInt(inBuf.Length)
        totalBytes = CInt(inBuf.Length)
        bytesRead = 0
        While bytesToRead > 0
            Dim n As Int64 = streamDownload.Read(inBuf, bytesRead, bytesToRead)
            If n = 0 Then
                Exit While
            End If
            bytesRead += n
            bytesToRead -= n
            downloadPercent = FormatPercent(bytesRead / totalBytes, 0)
            StrAppStatus = bytesRead & "b" & " | " & downloadPercent
            LogMe(StrAppStatus)
        End While

然后继续写文件。编写文件不是问题,它通过While语句在第一个循环中出错...再次,这只发生在大于100mb的文件上,并且仅在XP机器上...任何帮助都将非常感激。< / p>

以下是出现错误时保存到我的日志文件的输出:

2013年7月19日上午10:15:02 | Step_Row_ID已下载文件大小:134246639

2013年7月19日上午10:15:02 | 2594b | 0%

2013年7月19日上午10:15:02 |尝试从Step_Row_ID下载报告时出错:4533:无法从传输连接读取数据:无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或队列已满。 | System.Net.Sockets.SocketException:无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或者队列已满    在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags)    在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)

修改 作为更新,此代码适用于这样的文件大小没有问题:

2013年7月19日下午1:23:32 | Step_Row_ID 4540下载完成:| 29257728b阅读

但是对于上面列出的大型文件大小,每次尝试下载时,它都会在不同的字节数后失败(请参阅下面的日志,查看上面的日志,不同的字节数但同样的失败......):

2013年7月19日下午1:23:38 | Step_Row_ID已下载文件大小:134246639b

2013年7月19日下午1:23:38 | 3770b | 0%

2013年7月19日下午1:23:38 | 12814b | 0%

2013年7月19日下午1:23:38 | 25954b | 0%

2013年7月19日下午1:23:38 | 28658b | 0%

2013年7月19日下午1:23:38 |尝试从Step_Row_ID下载报告时出错:4533:无法从传输连接读取数据:无法执行对套接字的操作,因为系统缺少足够的缓冲区空间或队列已满。 | System.Net.Sockets.SocketException:无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或者队列已满    在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags)    在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)

1 个答案:

答案 0 :(得分:0)

我道歉,从未意识到这一点没有得到答复。

向前略有不同的方向并选择使用WebClient.getfile进程。

实际上已经有一段时间了,因为我们把它推到了生产中,所以我不记得确切的代码集,但实际上我们删除了字节读取的需要。

我将结束这个问题。