Wednesday, May 2, 2012

Download code works in Windows 7 but not XP SP2?

I have wrote a simple piece of code that downloads a file from a url. This code works perfectly in Windows 7, downloading the file at a good speed and maintaining a progress bar showing the download progress. However when I run the same piece of code from Windows XP SP2 it produces a .NET IOException
, it makes no sense to me why it doesnt work. It starts the same, completes the first read correctly and then throws the following exception on the second attempt to read from the stream :



 System.IO.IOException: Unable to read data from the transport connection: An operation on a
socket could not be performed because the system lacked sufficient buffer space or because a
queue was full. --->

System.Net.Sockets.SocketException: An operation on a socket could not be
performed because the system lacked sufficient buffer space or because a queue was full
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)

at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at ServicePackChk.SrvPackChk.DownLoadServicePack(Boolean bWindowsXP)
at ServicePackChk.SrvPackChk.CheckServicePackStatus()
at ServicePackChk.Form1.Form1_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)


CODE :



        Uri uri;

if (bWindowsXP)
uri = new Uri("http://download.microsoft.com/download/d/3/0/d30e32d8-418a-469d-b600-f32ce3edf42d/WindowsXP-KB936929-SP3-x86-ENU.exe");
else
uri = null;

WebRequest req = WebRequest.Create(uri);
WebResponse resp = req.GetResponse();

ProgBarForm pform = new ProgBarForm();

updateEvent += new SrvPackChk.UpdateDownloaded(pform.UpdateProgBar);

Stream stream = resp.GetResponseStream();
ArrayList alBytes = new ArrayList();
int nLen = (int)resp.ContentLength;


pform.DownLoadSize = nLen;

pform.Show();

byte[] byExe = new byte[nLen];

bool bMoreToDownload = true;

FileStream fs = new FileStream(System.IO.Path.GetTempPath() + "XPSP3.exe", FileMode.Create);

MessageBox.Show("Saving File to " + System.IO.Path.GetTempPath() + "XPSP3.exe");

while (bMoreToDownload)
{
Application.DoEvents();

int nRead = 0;

nRead = stream.Read(byExe, 0, nLen);

nDownloaded += nRead;

updateEvent(nDownloaded);

if (nDownloaded == nLen)
{
bMoreToDownload = false;
}

fs.Write(byExe, 0, nRead);
fs.Flush();

Application.DoEvents();
}

stream.Close();

fs.Close();




No comments:

Post a Comment