本文共 2574 字,大约阅读时间需要 8 分钟。
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代理软件在服务器上运行长达三个多月,使用过程未发现异常退出情况。当然前提就我一个人在用了 ~ 哈哈 ~
附以前写的几篇文章:
1:
2:
3:
4:
看本篇的时候也请支持一下我的开源框架:
转载地址:http://davfl.baihongyu.com/