www.pudn.com > HttpProxy.rar > Proxy.cs


using System; 
using System.IO; 
using System.Net; 
using System.Data; 
using System.Text; 
using System.Net.Sockets; 
using System.Windows.Forms; 
 
namespace HttpProxy.Component 
{       
	class Proxy 
	{ 
		Socket clientSocket; 
		byte[] read = new byte[1024]; 
		byte[] buffer = null; 
		byte[] recv = new byte[4096]; 
		int threadId=-1; 
 
		public Proxy(Socket sock) 
		{ 
			clientSocket = sock; 
		} 
 
		public void Run() 
		{ 
			string clientMessage = ""; 
			string url = ""; 
 
			int bytes = ReadMessage(read, ref clientSocket, ref clientMessage); 
			if (bytes == 0) 
				return; 
 
			int index1 = clientMessage.IndexOf(' '); 
			int index2 = clientMessage.IndexOf(' ', index1 + 1); 
			if ((index1 == -1) || (index2 == -1)) 
			{ 
				throw new IOException(); 
			} 
			string part1 = clientMessage.Substring(index1 + 1, index2 - index1); 
 
			int index3 = part1.IndexOf('/', index1 + 8); 
			int index4 = part1.IndexOf(' ', index1 + 8); 
			int index5 = index4 - index3; 
			url = part1.Substring(index1 + 4, (part1.Length - index5) - 8); 
 
			try 
			{ 
				IPHostEntry IPHost = Dns.Resolve(url); 
				DataRow dr=ProxyServer.dsLog.Tables["Parent"].NewRow(); 
				dr.BeginEdit(); 
				dr["Client"]=clientSocket.RemoteEndPoint.AddressFamily.ToString(); 
				dr["RemoteServer"]=IPHost.HostName; 
				dr["StartTime"]=DateTime.Now; 
				dr.EndEdit(); 
				ProxyServer.dsLog.Tables["Parent"].Rows.Add(dr); 
				threadId=Convert.ToInt32(dr["ThreadID"]); 
				string[] aliases = IPHost.Aliases; 
				IPAddress[] address = IPHost.AddressList; 
				ProxyServer.dsLog.Tables["Child"].Rows.Add(new object[]{null,threadId,"Web服务器IP地址:",address[0].ToString(),DateTime.Now}); 
				Console.WriteLine("Web服务器IP地址:" + address[0]); 
				//解析出要访问的服务器地址 
				IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80); 
				Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
				//创建连接Web服务器端的Socket对象 
				IPsocket.Connect(ipEndpoint); 
				//Socket连Web接服务器 
				if (IPsocket.Connected) 
					ProxyServer.dsLog.Tables["Child"].Rows.Add(new object[]{null,threadId,"连接服务器...","Socket 正确连接!",DateTime.Now}); 
				string GET = clientMessage; 
				Byte[] ByteGet = Encoding.ASCII.GetBytes(GET); 
				IPsocket.Send(ByteGet, ByteGet.Length, 0); 
				//代理访问软件对服务器端传送HTTP请求命令 
				Int32 rBytes = IPsocket.Receive(recv, recv.Length, 0); 
				//代理访问软件接收来自Web服务器端的反馈信息 
				ProxyServer.dsLog.Tables["Child"].Rows.Add(new object[]{null,threadId,"接收字节数:",rBytes,DateTime.Now}); 
				String strRetPage = null; 
				strRetPage = strRetPage + Encoding.ASCII.GetString(recv, 0, rBytes); 
				while (rBytes > 0) 
				{ 
					rBytes = IPsocket.Receive(recv, recv.Length, 0); 
					strRetPage = strRetPage + Encoding.ASCII.GetString(recv, 0, rBytes); 
				} 
				IPsocket.Shutdown(SocketShutdown.Both); 
				IPsocket.Close(); 
				SendMessage(clientSocket, strRetPage); 
				//代理服务软件往客户端传送接收到的信息 
			} 
			catch (Exception exc) 
			{ 
				ProxyServer.dsLog.Tables["Child"].Rows.Add(new object[]{null,threadId,"Socket 异常:",exc.Message,DateTime.Now}); 
			} 
		} 
 
		///  
		/// Reads the message. 
		///  
		/// The receive. 
		/// The sock. 
		/// The client message. 
		///  
		private int ReadMessage(byte[] receive, ref Socket sock, ref string clientMessage) 
		{ 
			int bytes = sock.Receive(receive, 1024, SocketFlags.None); 
			clientMessage = Encoding.ASCII.GetString(receive); 
 
			return bytes; 
		} 
 
		///  
		/// Sends the message. 
		///  
		/// The sock. 
		/// The message. 
		private void SendMessage(Socket sock, string message) 
		{ 
			buffer = new byte[message.Length + 1]; 
			int length = Encoding.ASCII.GetBytes(message, 0, message.Length, buffer, 0); 
			ProxyServer.dsLog.Tables["Child"].Rows.Add(new object[]{null,threadId,"发送字节数:",length.ToString(),DateTime.Now}); 
			sock.Send(buffer,length,SocketFlags.None); 
		} 
	} 
}