All pastes #424590 Raw Edit

Untitled

public text v1 · immutable
·published 2007-04-04 21:58 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;

namespace FastDownloader
{
    public partial class Form1 : Form
    {
        const int BUFFER_SIZE = 4096;
        public delegate void m_SaveFile(byte[] contents, string file);
        FileStream fs;

        private void SaveFile(byte[] contents, string file)
        {
            if (fs == null)
            {
                fs = new FileStream(file, FileMode.Append);
            }
            fs.Write(contents, 0, contents.Length);
            fs.Flush();
        }


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // Run 20 simultaneous requests
            for (int i = 0;i < 20; i++ )
            {
                ObjectState os = new ObjectState();
                os.request = (HttpWebRequest)WebRequest.Create("http://www.yahoo.com/");

                os.request.BeginGetResponse(new AsyncCallback(this.ResponseCallback), os);
            }
        }

        public void ResponseCallback(IAsyncResult ar)
        {
            Debug.WriteLine("Got request back yo");

            ObjectState os = (ObjectState)ar.AsyncState;
            os.response = os.request.EndGetResponse(ar);

            os.responseStream = os.response.GetResponseStream();
            os.responseStream.BeginRead(os.bufferRead, 0,  BUFFER_SIZE,
                new AsyncCallback(this.ReadCallback), os);
        }

        public void ReadCallback(IAsyncResult ar)
        {
            Debug.WriteLine("Got data back yo");

            ObjectState os = (ObjectState)ar.AsyncState;

            int read = os.responseStream.EndRead(ar);

            if (read > 0) // Wewt, more data to read
            {
                os.memoryStream.Write(os.bufferRead, 0, read);
                os.responseStream.BeginRead(os.bufferRead, 0, BUFFER_SIZE,
                    new AsyncCallback(ReadCallback), os);
            }
            else // 0 bytes, so request has completed
            {
                Debug.WriteLine("Request finished");

                // Close Streams
                os.responseStream.Close();
                os.response.Close();

                // Save file
                this.Invoke(new m_SaveFile(this.SaveFile), new object[] { os.memoryStream.ToArray(), @"c:\stuff\output.txt" });

                // Do it all over again!
                os = new ObjectState();
                os.request = (HttpWebRequest)WebRequest.Create("http://www.yahoo.com/");
                os.request.BeginGetResponse(new AsyncCallback(ResponseCallback), os);
            }
        }
    }

    public class ObjectState
    {
        public const int BUFFER_SIZE = 4096;
        public byte[] bufferRead;
        public HttpWebRequest request;
        public WebResponse response;
        public Stream responseStream;
        public MemoryStream memoryStream;

        public ObjectState()
        {
            bufferRead = new byte[BUFFER_SIZE];
            request = null;
            responseStream = null;
            memoryStream = new MemoryStream();
        }
    }
}