• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

outofthebox

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

proxy

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa

Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/

// Proxy.cs -- Implements a multi-threaded Web proxy server
//
//             Compile this program with the following command line:
//                 C:>csc Proxy.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;

namespace nsProxyServer
{
    
public class ProxyServer
    {
        
static public void Main (string [] args)
        {
            
int Port = 3125;
            
if (args.Length > 0)
            {
                
try
                {
                    Port 
= Convert.ToInt32 (args[0]);
                }
                
catch
                {
                    Console.WriteLine (
"Please enter a port number.");
                    
return;
                }
            }
            
try
            {
                
// Create a listener for the proxy port
                TcpListener sockServer = new TcpListener (Port);
                sockServer.Start ();
                
while (true)
                {
                    
// Accept connections on the proxy port.
                    Socket socket = sockServer.AcceptSocket ();
                    
                    
// When AcceptSocket returns, it means there is a connection. Create
                    
// an instance of the proxy server class and start a thread running.
                    clsProxyConnection proxy = new clsProxyConnection (socket);
                    Thread thrd 
= new Thread (new ThreadStart (proxy.Run));
                    thrd.Start ();
                    
// While the thread is running, the main program thread will loop around
                    
// and listen for the next connection request.
                }
            }
            
catch (IOException e)
            {
                Console.WriteLine (e.Message);
            }
        }
    }

    
class clsProxyConnection
    {
        
public clsProxyConnection (Socket sockClient)
        {
            m_sockClient 
= sockClient;
        }
        Socket m_sockClient; 
//, m_sockServer;
        Byte [] readBuf = new Byte [1024];
        Byte [] buffer 
= null;
        Encoding ASCII 
= Encoding.ASCII;

        
public void Run ()
        {
            
string strFromClient = "";
            
try
            {
                
// Read the incoming text on the socket/
                int bytes = ReadMessage (m_sockClient,
                                         readBuf, 
ref strFromClient);
                
// If it's empty, it's an error, so just return.
                
// This will termiate the thread.
                if (bytes == 0)
                    
return;
                
// Get the URL for the connection. The client browser sends a GET command
                
// followed by a space, then the URL, then and identifer for the HTTP version.
                
// Extract the URL as the string betweeen the spaces.
                int index1 = strFromClient.IndexOf (' ');
                
int index2 = strFromClient.IndexOf (' ', index1 + 1);
                
string strClientConnection =
                      strFromClient.Substring (index1 
+ 1, index2 - index1);

                
if ((index1 < 0) || (index2 < 0))
                {
                    
throw (new IOException ());
                }
                
// Write a messsage that we are connecting.
                Console.WriteLine ("Connecting to Site " +
                                   strClientConnection);
                Console.WriteLine (
"Connection from " +
                                   m_sockClient.RemoteEndPoint);
                
// Create a WebRequest object.
                WebRequest req = (WebRequest) WebRequest.Create
                                                     (strClientConnection);
                
// Get the response from the Web site.
                WebResponse response = req.GetResponse ();
                
int BytesRead = 0;
                Byte [] Buffer 
= new Byte[32];
                
int BytesSent = 0;
                
                
// Create a response stream object.
                Stream ResponseStream = response.GetResponseStream();
                
                
// Read the response into a buffer.
                BytesRead = ResponseStream.Read(Buffer,0,32);
                StringBuilder strResponse 
= new StringBuilder("");
                
while (BytesRead != 0)
                {
                    
// Pass the response back to the client
                    strResponse.Append(Encoding.ASCII.GetString(Buffer,
                                        
0, BytesRead));
                    m_sockClient.Send(Buffer, BytesRead, 
0);
                    BytesSent 
+= BytesRead;
                    
// Read the next part of the response
                    BytesRead = ResponseStream.Read(Buffer, 0, 32);
                }
            }
            
catch (FileNotFoundException e)
            {
                SendErrorPage (
404, "File Not Found", e.Message);
            }
            
catch (IOException e)
            {
                SendErrorPage (
503, "Service not available", e.Message);
            }
            
catch (Exception e)
            {
                  SendErrorPage (
404, "File Not Found", e.Message);
                  Console.WriteLine (e.StackTrace);
                  Console.WriteLine (e.Message);
            }
            
finally
            {
                
// Disconnect and close the socket.
                if (m_sockClient != null)
                {
                    
if (m_sockClient.Connected)
                    {
                        m_sockClient.Close ();
                    }
                }
            }
            
// Returning from this method will terminate the thread.
        }
        
// Write an error response to the client.
        void SendErrorPage (int status, string strReason, string strText)
        {
            SendMessage (m_sockClient, 
"HTTP/1.0" + " " +
                         status 
+ " " + strReason + "\r\n");
            SendMessage (m_sockClient, 
"Content-Type: text/plain" + "\r\n");
            SendMessage (m_sockClient, 
"Proxy-Connection: close" + "\r\n");
            SendMessage (m_sockClient, 
"\r\n");
            SendMessage (m_sockClient, status 
+ " " + strReason);
            SendMessage (m_sockClient, strText);
        }
        
        
// Send a string to a socket.
        void SendMessage (Socket sock, string strMessage)
        {
            buffer 
= new Byte [strMessage.Length + 1];
            
int len = ASCII.GetBytes (strMessage.ToCharArray(),
                                      
0, strMessage.Length, buffer, 0);
            sock.Send (buffer, len, 
0);
        }
        
        
// Read a string from a socket.
        int ReadMessage (Socket sock, byte [] buf, ref string strMessage)
        {
            
int iBytes = sock.Receive (buf, 1024, 0);
            strMessage 
= Encoding.ASCII.GetString (buf);
            
return (iBytes);
        }
    }
}

posted on 2007-02-26 15:16  梅川酷子  阅读(441)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3