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();
}
}
{
CloseSocket(socket, true );
}
private void CloseSocket(Socket socket, bool shutdown)
{
if (socket != null )
{
if (shutdown)
{
socket.Shutdown(SocketShutdown.Both);
}
socket.Close();
}
}
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
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 );
}
{
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);
}
{
string data = " HTTP/1.0 200 Connection established " ; // 返回建立成功";
return System.Text.Encoding.ASCII.GetBytes(data);
}
D:针对QQ需要进行重复来回的发送与接收
#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
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
#region
结束请求,关闭客户端Socket
Write( " 接收完成。返回客户端数据... " + count);
CloseSocket(IPsocket);
CloseSocket(clientSocket);
recvBytes = null ;
Write( " 本次请求完成,已关闭连接... " );
Write( " -----------------------------请求结束--------------------------- " );
#endregion
Write( " 接收完成。返回客户端数据... " + count);
CloseSocket(IPsocket);
CloseSocket(clientSocket);
recvBytes = null ;
Write( " 本次请求完成,已关闭连接... " );
Write( " -----------------------------请求结束--------------------------- " );
#endregion
结言:
本QQ代理软件在服务器上运行长达三个多月,使用过程未发现异常退出情况。当然前提就我一个人在用了
~
哈哈
~
附以前写的几篇文章:
看本篇的时候也请支持一下我的开源框架:CYQ.Data 轻量数据层之路 框架开源系列 索引