博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Http 代理工具 实战 支持网页与QQ代理
阅读量:6871 次
发布时间:2019-06-26

本文共 2574 字,大约阅读时间需要 8 分钟。

ExpandedBlockStart.gif
        
private
 
void
 CloseSocket(Socket socket)
        {
            CloseSocket(socket, 
true
);
        }
        
private
 
void
 CloseSocket(Socket socket, 
bool
 shutdown)
        {
            
if
 (socket 
!=
 
null
)
            {
                
if
 (shutdown)
                {
                    socket.Shutdown(SocketShutdown.Both);
                }
                socket.Close();
            }
        }

 

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需要进行重复来回的发送与接收

ExpandedBlockStart.gif
          
#region
 QQ发送/接收中转请求
             
int
 length 
=
 
0
, count 
=
 
0
;
            
if
 (isConnect)
            {
                System.Threading.Thread.Sleep(
400
);
//
关键时延
                
//
循环发送客户端请求,接收服务器返回
                DateTime start 
=
 DateTime.Now;
                
while
 (
true
)
                {
                    
if
 (IPsocket.Available 
==
 
0
 
&&
 clientSocket.Available 
==
 
0
)
                    {
                        
if
 (((TimeSpan)(DateTime.Now 
-
 start)).TotalMinutes 
>
 
15
)
                        {
                            
break
;
//
掉线重拔处理
                        }
                    }
                    
else
                    {
                        start 
=
 DateTime.Now;
                    }
                        
                    
                    
try
                    {
                        
while
 (clientSocket.Available 
!=
 
0
)
                        {
                            sendLength 
=
 clientSocket.Receive(qqSendBytes, qqSendBytes.Length, 
0
);
                            IPsocket.Send(qqSendBytes, sendLength, 
0
);
                            Write(
"
发送字节数: 
"
 
+
 sendLength.ToString());
                        }
                        System.Threading.Thread.Sleep(
500
);
                        
while
 (IPsocket.Available 
!=
 
0
)
                        {
                            recvLength 
=
 IPsocket.Receive(qqRecvBytes, qqRecvBytes.Length, 
0
);
                            clientSocket.Send(qqRecvBytes, recvLength, 
0
);
                            Write(
"
接收字节数: 
"
 
+
 recvLength.ToString());
                        }
                    }
                    
catch
                    {
                    }
                }
            }
            
else
            {
                
try
                {
                    
do
                    {
                        length 
=
 IPsocket.Receive(recvBytes, count, IPsocket.Available, 
0
);
                        count 
=
 count 
+
 length;
                        Write(
"
接收转发请求返回的数据中...
"
 
+
 length);
                        System.Threading.Thread.Sleep(
200
);
//
关键点,请求太快数据接收不全
                    }
                    
while
 (IPsocket.Available 
>
 
0
);
                    clientSocket.Send(recvBytes, 
0
, count, 
0
);
                }
                
catch
(Exception err)
                {
                    Write(err.Message);
                }
            }
            
#endregion

 

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

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

 

结言:

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

 

 

附以前写的几篇文章:

1:

2:

3:

4:

 

看本篇的时候也请支持一下我的开源框架:

转载地址:http://davfl.baihongyu.com/

你可能感兴趣的文章
[译] Go 代码评审常见问题
查看>>
SQL汇总数据
查看>>
02-MPLS 工作原理--MPLS报头版
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
华为交换机配置consol密码及vty密码
查看>>
iptables自定义链的使用
查看>>
Java 单例模式的线程安全实现
查看>>
oracle中关于public synonym的权限问题
查看>>
NASM语法
查看>>
我的友情链接
查看>>
免费的编程书
查看>>
巧用XP的Hosts文件 防止误进恶意网站
查看>>
Hyper-V 2016 系列教程57 SCVMM 2016连接Hyper-V 主机
查看>>
20111018用空记得整理C盘
查看>>
如何为虚拟化选择合适的存储设备
查看>>
apache编译优化
查看>>
linux 用户权限和组权限
查看>>
RPM的使用
查看>>
我的友情链接
查看>>