public class MyHttpWebRequest { Socket socket; BufferedStream bufferedStream; string server, path; int port; byte[] buf; public MyHttpWebRequest(string url) { int i; if (url.StartsWith("http")) { for (i = 0; i < url.Length; i++) if (url[i] == '/') { i += 2; break; } url = url.Substring(i); } i = url.IndexOf(':'); if (i >= 0) { server = url.Substring(0, i); url = url.Substring(i + 1); i = url.IndexOf('/'); Int32.TryParse(url.Substring(0, i), out port); } else { i = url.IndexOf('/'); server = url.Substring(0, i); port = 80; } path = url.Substring(i); } public void BeginDownloadFile(string fileName) { buf = new byte[65536]; bufferedStream = new BufferedStream(new FileStream(fileName, FileMode.Create, FileAccess.Write)); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.BeginConnect(server, port, ConnectCallback, null); } private void ConnectCallback(IAsyncResult iAsyncResult) { socket.EndConnect(iAsyncResult); string query = "GET " + path + " / HTTP/1.0\r\nAccept: */*\r\n\r\n"; socket.BeginSend(System.Text.Encoding.Default.GetBytes(query), 0, query.Length, SocketFlags.None, SendCallback, null); } private void SendCallback(IAsyncResult iAsyncResult) { socket.EndSend(iAsyncResult); socket.BeginReceive(buf, 0, 65536, SocketFlags.None, ReceiveCallback, null); } private void ReceiveCallback(IAsyncResult iAsyncResult) { int len = socket.EndSend(iAsyncResult); if (len > 0) { bufferedStream.Write(buf, 0, len); socket.BeginReceive(buf, 0, 65536, SocketFlags.None, ReceiveCallback, null); } else { bufferedStream.Close(); socket.Close(); } } }