我遇到一個問題,我的客戶端應用程序從我們的web服務下載一個大的二進制文件。請注意,這在運行較高操作系統的其他機器上不會發生,並且對於大多數較小的文件大小不會發生。無論出於何種原因,該應用程序在第一個While循環內失敗,到目前爲止還沒有任何幫助。Winforms下載XP上的大文件套接字錯誤
代碼:
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機器上...任何幫助都將非常感激。
以下是錯誤的輸出發生時是被保存到我的日誌文件:
2013年7月19日上午10時15分02秒| Step_Row_ID下載文件大小:134246639
7/19/2013 10:15:02 AM | 2594b | 0%
7/19/2013 10:15:02 AM |嘗試從Step_Row_ID下載報告時出錯:4533:無法從傳輸連接讀取數據:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間或隊列已滿。 | System.Net.Sockets.SocketException:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間,或者因爲隊列已滿而在System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32偏移量爲 , INT32大小,的SocketFlags的SocketFlags) 在System.Net.Sockets.NetworkStream.Read(字節[]緩衝液,INT32偏移,INT32大小)
編輯: 作爲一個更新,此代碼爲這樣的文件大小沒有問題:
7/19/2013 1:23:32 PM | Step_Row_ID 4540下載完成:| 29257728b閱讀
但是,在上面列出的大文件大小下,每次嘗試下載時,都會在不同的字節量之後失敗(請參閱下面的日誌,並查看上面的日誌,不同的字節數,但同樣的故障...) :
7/19/2013 1:23:38 PM | Step_Row_ID下載文件大小:134246639b
7/19/2013 1:23:38 PM | 3770b | 0%
7/19/2013 1:23:38 PM | 12814b | 0%
7/19/2013 1:23:38 PM | 25954b | 0%
7/19/2013 1:23:38 PM | 28658b | 0%
7/19/2013 1:23:38 PM |嘗試從Step_Row_ID下載報告時出錯:4533:無法從傳輸連接讀取數據:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間或隊列已滿。 | System.Net.Sockets.SocketException:無法執行套接字上的操作,因爲系統缺少足夠的緩衝區空間,或者因爲隊列已滿而在System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32偏移量爲 , Int32大小,SocketFlags socketFlags) 在System.Net.Sockets.NetworkStream。讀取(字節[]緩衝區,Int32偏移量,Int32大小)
你能解決嗎? – gsubiran