using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;namespace WebProxy
{
/// <summary>
/// Proxy 的摘要说明。
/// </summary>
public class Proxy
{
Socket clientSocket;
Byte[] read=new byte[1024];
Byte[] Buffer=null;
Encoding ASCII=Encoding.ASCII;
Byte[] RecvBytes=new byte[4096];
Socket IPsocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
public Proxy(Socket socket)
{
//
// TODO: 在此处添加构造函数逻辑
//
this.clientSocket=socket;
}
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);
Console.WriteLine("远程主机名:"+IPHost.HostName);
string[] aliasesx=IPHost.Aliases;
IPAddress[] address=IPHost.AddressList;
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); if(IPsocket.Connected)
Console.WriteLine("Socket正确连接!");
string Get=clientmessage;
Byte[] ByteGet=ASCII.GetBytes(Get);
IPsocket.Send(ByteGet,ByteGet.Length,0);
Int32 rBytes=IPsocket.Receive(RecvBytes,RecvBytes.Length,0);
Console.WriteLine("接受字节数"+rBytes.ToString());
String strRetPage=null;
strRetPage=strRetPage+ASCII.GetString(RecvBytes,0,rBytes);
while(rBytes>0)
{
rBytes=IPsocket.Receive(RecvBytes,RecvBytes.Length,0);
strRetPage=strRetPage+ASCII.GetString(RecvBytes,0,rBytes);
}
IPsocket.Shutdown(SocketShutdown.Both);
IPsocket.Close();
SendMessage(clientSocket,strRetPage);
}
catch(Exception exc2)
{
Console.WriteLine(exc2.ToString());
} } private int ReadMessage(byte[] ByteArray,ref Socket s,ref String clientmessage)
{
int bytes=s.Receive(ByteArray,1024,0);
string messagefromclient=Encoding.ASCII.GetString(ByteArray);
clientmessage=(String)messagefromclient;
return bytes;
} private void SendMessage(Socket s,string message)
{
Buffer= new Byte[message.Length+1];
int length=ASCII.GetBytes(message,0,message.Length,Buffer,0);
Console.WriteLine("传送字节数:",length.ToString());
s.Send(Buffer,length,0);
}
}
}在《电脑编程与维护》有过介绍