Http 代理工具 实战 支持网页与QQ代理

简介:

前言:

有些公司不让员工上Q或封掉某些网站,这时候,干着急没办法,只能鄱墙。
如果上网搜代理IP,很少能用,用HTTP-Tunnel Client代理软件,免费的也是经常性的掉线。

正好手头上有N台服务器,如果直接在上面装个CCProxy,也显的太明显了。
于是自己写个代理软件放上去,一来包装一下好伪装,二来又有代理功能,看着挺好。

 

原理解说:

复制代码
1:创建一个Socket进行本地端口监听-》一个死循环while语句

2:收到消息时,产生一个线程处理->多线程处理并发请求

3:产生一个新的Socket负责转发和接收

4:原来的Socket负责把新接收的消息发送回客户端
复制代码

 

代码细说

说明:本次示例在控制台程序里运行。

 

一:Program.cs

 

1:简单函数原型

复制代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Diagnostics;
using  System.Net.Sockets;
using  System.Threading;
namespace  TcpProxy
{
    
///   <summary>
    
///  by 路过秋天
    
///   http://www.cnblogs.com/cyq1162
    
///   </summary>
     class  Program
    {
      
        
static   void  Main( string [] args)
        {
                Listen(
808 ); // 起始监听808和CCProxy一样。
         }
        
static   void  Write( string  msg) // 简化消息输出
        {
            Console.WriteLine(msg);
        }

        
static   void  Listen( int  port) // 开始监听
         {
           
        }
        
static   void  ReListen(TcpListener listener) // 监听失败,需要重新换端口监听
        {
           
        }
    }
}
复制代码

 

2:开始监听

复制代码
        static   void  Listen( int  port) // 开始监听
        {
            Write(
" 准备监听端口: "   +  port);
            System.Net.IPAddress ipp 
=  System.Net.IPAddress.Parse( " 0.0.0.0 " ); // 监听本地任意IP
            TcpListener tcplistener  =   new  TcpListener(ipp, port);
            
// 端口复用,xp下可以复用[可抢占IIS80端口],win2003下无效。
            tcplistener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,  true );
            
try
            {
                tcplistener.Start();
            }
            
catch  (Exception err)
            {
                Write(err.Message);
                Write(
" 该端口已被占用,请更换端口号!!! " );
                ReListen(tcplistener);
// 监听失败,切换端口监听
            }
            
// 下面还有代码,暂时省略

        }
复制代码

 

3:监听失败,切换端口监听

复制代码
        static   void  ReListen(TcpListener listener) // 监听失败,需要重新换端口监听
        {
            
if  (listener  !=   null )
            {
                listener.Stop();
                listener 
=   null ;
            }
            Write(
" 请输入监听端口号: " );
            
string  newPort  =  Console.ReadLine();
            
int  port;
            
if  ( int .TryParse(newPort,  out  port))
            {
                Listen(port);
            }
            
else
            {
                ReListen(listener);
            }
        }
复制代码

 

4:开始监听,进入死循环

复制代码
        static   void  Listen( int  port) // 开始监听
        {
          
// 上面代码省略......

            Write(
" 成功监听端口: "   +  port);
            Socket socket;
            
while  ( true )
            {
              socket 
=  tcplistener.AcceptSocket(); // 获取传送和接收数据的Scoket实例 
                Proxy proxy  =   new  Proxy(socket); // Proxy类实例化 
              Thread thread  =   new  Thread( new  ThreadStart(proxy.Run)); // 创建线程 
                thread.Start(); // 启动线程 
            }
        }
复制代码

 

作者:路过秋天

博客:http://cyq1162.cnblogs.com/

 

 

二:Proxy.cs

 

Proxy简单函数原型:

复制代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Net;
using  System.Net.Sockets;
using  System.IO;

namespace  TcpProxy
{
    
///   <summary>
    
///  by 路过秋天
    
///   http://www.cnblogs.com/cyq1162
    
///   </summary>
     public   class  Proxy
    {
        Socket clientSocket;
// 接收和返回
         byte [] read  =   null ; // 存储来自客户端请求数据包
         byte [] sendBytes  =   null ; // 存储中转请求发送的数据
         byte [] recvBytes  =   null ; // 存储中转请求返回的数据
         bool  isConnect  =   false ;
        
byte [] qqSendBytes = new   byte [ 4096 ]; // QQ发送缓冲
         byte [] qqRecvBytes  =   new   byte [ 4096 ]; // QQ接收缓冲
         int  sendLength  =   0 , recvLength  =   0 ; // 实际发送和接收长度
         public  Proxy(Socket socket) // 初始化
        {
            clientSocket 
=  socket;
            recvBytes 
=   new  Byte[ 1024   *   1024 ];
            clientSocket.ReceiveBufferSize 
=  recvBytes.Length;
            clientSocket.SendBufferSize 
=  recvBytes.Length;
        }
        
        
public   void  Run(){} // 主运行代码
        
// 从请求头里解析出url和端口号
         private   string  GetUrl( string  clientmessage,  ref   int  port){}
        
// 接收客户端的HTTP请求数据
         private   int  ReadMessage( byte [] readByte,  ref  Socket s,  ref  IPAddress ipAddress,  ref   string  host,  ref   int  port){}
        
// 关闭socket
         private   void  CloseSocket(Socket socket){}
        
private   void  CloseSocket(Socket socket,  bool  shutdown){}
        
// QQ代理测试返回
         private   byte [] QQokProxyData(){}
        
// firfox默认会发送一些请求,很烦,所以加过滤
         private   bool  Filter( string  url){ }
        private void Write(string msg)
        {
            System.Console.WriteLine(msg);
        }

    }
}
复制代码

 

Run主函数

 

A:分解请求头,获取要请求的IP,端口

复制代码
            #region  获取客户端请求数据
            Write(
" -----------------------------请求开始--------------------------- " );

            read 
=   new   byte [clientSocket.Available];
            IPAddress ipAddress 
=  IPAddress.Any;
            
string  host  =   "" ; // 主机
              int  port  =   80 ; // 端口

             
int  bytes  =  ReadMessage(read,  ref  clientSocket,  ref  ipAddress,  ref  host,  ref  port);
            
if  (bytes  ==   0 )
            {
                Write(
" 读取不到数据! " );
                CloseSocket(clientSocket);
                
return ;
            }
            
#endregion
复制代码

 

Run函数分解:ReadMessage函数

ReadMessage函数

 

ReadMessage函数分解:GetUrl

GetUrl函数

 

ReadMessage函数分解:Filter

复制代码
Filter函数
        private   bool  Filter( string  url)
        {
            
switch  (url.ToLower())
            {
                
case   " fffocus.cn " :
                    
return   true ;
            }
            
return   false ;
        }
复制代码

 

Run函数分解:CloseSocket函数

CloseSocket函数

 

B:创建中转Socket及建立连接

复制代码
           #region  创建中转Socket及建立连接
            IPEndPoint ipEndpoint 
=   new  IPEndPoint(ipAddress, port);
            Socket IPsocket 
=   new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
try
            {
                IPsocket.Connect(ipEndpoint); Write(
" -----Socket 建立连接! IP地址: "   +  ipAddress  +   " 网址:http:// "   +  host);
            }
            
catch  (Exception err)
            {
                Write(
" 连接失败 : "   +  err.Message);
                Write(
" 退出请求!!! " );
                CloseSocket(IPsocket, 
false );
                
return ;
            }  
            
#endregion
复制代码

 

 

C:QQ代理测试及网页转发

复制代码
             if  (isConnect) // QQ链接方式
            {
                
byte [] qqOkData  =  QQokProxyData();
                clientSocket.Send(qqOkData, 
0 , qqOkData.Length,  0 );
            }
            
else // 正常网页,直接转发
            {
                IPsocket.Send(sendBytes, 
0 );
            }
复制代码

 

函数分解:QQokProxyData

         private   byte [] QQokProxyData()
        {
            
string  data  =   " HTTP/1.0 200 Connection established " ; // 返回建立成功";
             return  System.Text.Encoding.ASCII.GetBytes(data);
        }

 

D:针对QQ需要进行重复来回的发送与接收

QQ转发处理

 

E:结束请求,关闭客户端Socket

复制代码
             #region  结束请求,关闭客户端Socket
            Write(
" 接收完成。返回客户端数据... "   +  count);
            CloseSocket(IPsocket);
            CloseSocket(clientSocket);
            recvBytes 
=   null ;
            Write(
" 本次请求完成,已关闭连接... " );
            Write(
" -----------------------------请求结束--------------------------- " );
            
#endregion
复制代码

 

结言:

本QQ代理软件在服务器上运行长达三个多月,使用过程未发现异常退出情况。当然前提就我一个人在用了 ~ 哈哈 ~

 

 

附以前写的几篇文章:

1:简单实现Http代理工具

2:简单实现Http代理工具--端口复用与QQ代理

3:简单实现Http代理工具--完善支持QQ代理

4:C# 控制台程序 不显示在任务栏 只在进程中显示

 

看本篇的时候也请支持一下我的开源框架:CYQ.Data 轻量数据层之路 框架开源系列 索引

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/09/21/1832329.html

相关文章
|
14天前
|
数据采集 UED
HTTP代理的响应速度对网页采集有何影响?
随着互联网发展,使用代理IP的人数增多,HTTP代理的纯净度成为重要质量指标。它能提高业务价值、增强稳定性与性能、优化带宽利用,并增加代理IP的可用性和存活时间,确保高质量的服务效果。选择代理服务时,纯净度是关键考量因素。
44 6
|
28天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
24 5
|
6月前
|
安全 网络协议 网络安全
IP代理的三大协议:HTTP、HTTPS与SOCKS5的区别
**HTTP代理**适用于基本网页浏览,简单但不安全;**HTTPS代理**提供加密,适合保护隐私;**SOCKS5代理**灵活强大,支持TCP/UDP及认证,适用于绕过限制。选择代理协议应考虑安全、效率及匿名需求。
|
3月前
|
数据安全/隐私保护 Docker 容器
配置Harbor支持https功能实战篇
关于如何配置Harbor支持HTTPS功能的详细教程。
145 12
配置Harbor支持https功能实战篇
|
3月前
|
分布式计算 Hadoop Devops
Hadoop集群配置https实战案例
本文提供了一个实战案例,详细介绍了如何在Hadoop集群中配置HTTPS,包括生成私钥和证书文件、配置keystore和truststore、修改hdfs-site.xml和ssl-client.xml文件,以及重启Hadoop集群的步骤,并提供了一些常见问题的故障排除方法。
94 3
|
4月前
|
缓存 负载均衡 安全
|
3月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
42 1
|
4月前
|
安全 Java Shell
【内网—内网转发】——http协议代理转发_reGeorg代理转发
【内网—内网转发】——http协议代理转发_reGeorg代理转发
138 3
|
4月前
|
Web App开发 存储
常见抓包工具配置抓取HTTPS
常见抓包工具配置抓取HTTPS
|
5月前
|
数据采集 缓存 安全
2024年最佳http 代理 IP选择及其价格分析
2024年,多家服务商如快代理、123Proxy、巨量代理、IPIDEA等提供不同类型的代理IP,以满足数据采集、跨境电商等多种需求。
2024年最佳http 代理 IP选择及其价格分析

热门文章

最新文章