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);
     }
 }
Пример #2
0
 /// <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);
     }
 }