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

简介:

前言:

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

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

 

原理解说:

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

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

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

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

 

代码细说

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

 

一:Program.cs

 

1:简单函数原型

复制代码
ExpandedBlockStart.gif
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:开始监听

复制代码
ExpandedBlockStart.gif
        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:监听失败,切换端口监听

复制代码
ExpandedBlockStart.gif
        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:开始监听,进入死循环

复制代码
ExpandedBlockStart.gif
        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简单函数原型:

复制代码
ExpandedBlockStart.gif
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,端口

复制代码
ExpandedBlockStart.gif
            #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

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

 

Run函数分解:CloseSocket函数

CloseSocket函数

 

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

复制代码
ExpandedBlockStart.gif
           #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代理测试及网页转发

复制代码
ExpandedBlockStart.gif
             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

复制代码
ExpandedBlockStart.gif
             #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

相关文章
|
1月前
|
网络协议 Linux 网络安全
curl(http命令行工具):Linux下最强大的网络数据传输工具
curl(http命令行工具):Linux下最强大的网络数据传输工具
49 0
|
1月前
|
编解码 测试技术 索引
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
在我们简要介绍了 HLS 协议的基础知识,接下来我们详细介绍一种使用 Jmeter 编写压测 HLS 协议脚本的方法。
73 1
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
|
1月前
|
网络协议 Shell 网络安全
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
164 0
|
1天前
|
数据采集
如何选择高质量http/Socks5代理ip?
选择高质量HTTP、Socks5代理IP对爬虫和数据采集至关重要。了解代理IP类型,根据需求选择HTTP或Socks5代理。选择稳定、快速、分布广泛、数量充足且不易被封的代理IP供应商。关注代理IP速度、质量、稳定性、区域和使用频率。测试代理IP的连接速度、可用性、匿名性和使用频率。定期更换代理IP以保持效率和可靠性。
|
8天前
|
数据采集 Python
数据采集时使用HTTP代理IP效率不高怎么办?
数据采集时使用HTTP代理IP效率不高怎么办?
|
9天前
|
缓存 安全 定位技术
国外HTTP代理如何解决账号关联问题?
跨境电商面临多账号关联难题,可能导致平台限制或封禁。HTTP代理成为解决方案,提供独立IP避免账号关联,确保地理位置符合平台要求,实现IP隔离,增强安全性和隐私。通过代理,每个账户在不同环境中操作,减少被平台检测为违规的风险,同时防止黑客攻击,保障商家销售和品牌声誉。
|
11天前
|
运维 Java 应用服务中间件
Tomcat详解(七)——Tomcat使用https配置实战
Tomcat详解(七)——Tomcat使用https配置实战
26 4
|
1月前
|
JSON JavaScript 网络安全
新款HTTP代理工具Proxyman(界面美观、功能强大)
新款HTTP代理工具Proxyman(界面美观、功能强大)
124 0
|
1月前
|
存储 数据采集 负载均衡
建立HTTP代理IP池的技术和工具支持
建立HTTP代理IP池的技术和工具支持
45 0
|
1月前
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
141 0