public void StartLongConnection() { while (IsKeepLongConnection) { try { LongConnectSender = new SocketSender(CurrentRoute.IsNextNodeProxy); LongConnectSender.ConnectWithTimeout(CurrentRoute.NextNode.Address, BuildConnectionTimeout); LongConnectSender.SetTimeout(LongConnectionTimeout, LongConnectionTimeout); if (CurrentRoute.IsNextNodeProxy) { LongConnectSender.SendBytes(SocketPacketFlag.ReversedProxyLongConnectionRequest, CurrentRoute.GetBytes(node_start_index: 1)); LongConnectSender.ReceiveBytes(out HB32Header header, out byte[] bytes); if (header.Flag != SocketPacketFlag.ProxyResponse) { throw new Exception(string.Format("Proxy exception at depth {0} : {1}. {2}", header.I1, CurrentRoute.ProxyRoute[header.I1], Encoding.UTF8.GetString(bytes))); } } return; } catch (Exception ex) { Log("Start long connection exception : " + ex.Message, LogLevel.Error); } Thread.Sleep(ReconnectInterval); } }
/// <summary> /// 当上一级代理不是挂载在当前代理上的节点上时, 利用此方法完成同方向代理的中继, 并返回上级代理结果 /// </summary> /// <param name="responder"></param> /// <param name="route"></param> /// <returns></returns> private SocketSender ConnectionRelay(SocketResponder responder, HB32Header header, ConnectionRoute route) { if (route.IsNextNodeProxy) { /// 继续正向代理 SocketSender sender = new SocketSender(true); string err_msg = ""; try { sender.ConnectWithTimeout(route.NextNode.Address, Config.BuildConnectionTimeout); sender.SetTimeout(Config.SocketSendTimeout, Config.SocketReceiveTimeout); } catch (Exception ex) { /// 当前代理建立连接失败 err_msg = ex.Message; } if (string.IsNullOrEmpty(err_msg)) { HB32Header next_header = header.Copy(); next_header.I1++; sender.SendBytes(next_header, route.GetBytes(node_start_index: 1)); sender.ReceiveBytes(out HB32Header respond_header, out byte[] respond_bytes); if ((respond_header.Flag | SocketPacketFlag.ExceptionFlag) == 0) { responder.SendHeader(respond_header); } else { /// 上级或更上级代理建立连接失败, header 中包含抛出异常的代理位置 responder.SendBytes(respond_header, respond_bytes); } } else { HB32Header err_header = header.Copy(); err_header.Flag = (SocketPacketFlag)(((int)err_header.Flag & 0xFFFF00) | 0x90); responder.SendBytes(err_header, err_msg); } return(sender); } else { /// 直连 server SocketSender sender = new SocketSender(false); string err_msg = ""; try { sender.ConnectWithTimeout(route.ServerAddress.Address, Config.BuildConnectionTimeout); sender.SetTimeout(Config.SocketSendTimeout, Config.SocketReceiveTimeout); } catch (Exception ex) { err_msg = ex.Message; } /// response if (string.IsNullOrEmpty(err_msg)) { HB32Header resp_header = header.Copy(); resp_header.Flag = (SocketPacketFlag)(((int)resp_header.Flag & 0xFFFF00) | 0x10); responder.SendHeader(resp_header); } else { HB32Header err_header = header.Copy(); err_header.Flag = (SocketPacketFlag)(((int)err_header.Flag & 0xFFFF00) | 0x90); responder.SendBytes(err_header, err_msg); } return(sender); } }