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

相关文章
|
14天前
|
数据采集 前端开发 安全
socks5代理是什么意思?它跟http代理有什么不同点?它有什么应用场景?
**SOCKS5**是一种代理协议,位于会话层,作为前端与服务器间的中介,确保通信安全。与**HTTP代理**不同,SOCKS5不处理应用层协议,提供更快的速度,且适用范围更广,不仅限于HTTP。主要应用场景包括数据采集和电子商务。选择使用取决于具体业务需求。
|
12天前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
14天前
|
缓存 监控 安全
HTTP代理,什么是HTTP代理?HTTP代理如何设置?HTTP代理的用途?
HTTP代理用于访问封锁网站、加速访问、提升安全,国内常用于网络加速。HTTP代理插件提供隐私保护、解除网站限制、增强安全及定制浏览体验。设置代理通常在操作系统网络设置或浏览器选项中进行,输入代理服务器地址和端口。
|
1天前
|
安全 网络协议 网络安全
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
HTTP和HTTPS是互联网主要的两大协议,HTTP是基础的简单请求-响应协议,常用于TCP上,但数据传输不安全。HTTPS是HTTP的安全版本,添加了SSL层进行加密和身份验证,提供更高的安全性,用于保护数据和验证网站真实性。HTTPS需CA证书,可能产生费用,并使用443端口而非HTTP的80端口。
|
1天前
|
网络协议 安全 数据安全/隐私保护
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
SOCKS5和HTTP是两种代理协议,前者是通用型,支持多种网络流量,提供身份验证、IPv6支持及UDP兼容性,更适合实时数据传输。HTTP代理专用于HTTP协议,适用于Web资源请求。SOCKS5在传输方式、功能、兼容性和安全性上更胜一筹,而HTTP代理则在处理HTTP请求时更专业。选择代理协议应根据需求和应用场景,考虑服务的稳定性和安全性。付费代理如kookeey全球代理,支持双协议,速度快且可扩展性强,是可靠的选择。
|
1天前
|
网络协议 算法 Java
Java中如何通过代理实现对HTTP2网站的访问?
Java中如何通过代理实现对HTTP2网站的访问?
|
2天前
|
API
http代理ip请求并发数是什么?有什么用?
HTTP代理IP请求并发数指单个客户端对API或代理IP同时发起的请求数量,分为API链接请求并发和IP最大连接数。并发是瞬时同时请求,不同提供商限制不同。高并发请求的代理IP服务商能更好地应对程序压力。选择时应考虑这一因素。
|
12天前
|
网络协议 数据安全/隐私保护
Socks5代理和HTTP代理有哪些优缺点?
SOCKS5和HTTP代理对比:SOCKS5支持TCP/UDP,提供身份验证和数据加密,性能优但无法处理HTTP头部信息;HTTP代理能读取头部做细粒度控制,广泛支持但仅限HTTP协议,可能影响性能。选择取决于具体需求和应用支持。
|
14天前
|
安全 网络协议 网络安全
Socks5代理与HTTP代理的区别与优劣
在互联网时代,隐私和安全至关重要,代理服务器如socks5和HTTP代理成为保护个人信息的工具。socks5代理支持多种网络流量和UDP协议,更具灵活性和通用性,但设置复杂;HTTP代理则更常见、易用,适合仅处理HTTP流量的场景,但限制较多。选择哪种代理取决于具体需求和应用场景。
|
14天前
|
网络安全
socks5代理连接成功无法访问http协议的站点
无法通过SOCKS5代理访问HTTP网站可能由多个原因引起,如代理服务器不支持HTTP、配置错误、防火墙阻拦、连接问题、身份验证失败、浏览器设置不当或服务器被封锁。检查并解决这些因素,若问题持续,需深入排查或联系服务提供商。