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