public SocketResponder Accept()
 {
     while (IsAccepting)
     {
         HB32Header query_header;
         try
         {
             LongConnectSender.SendHeader(SocketPacketFlag.ReverserProxyLongConnectionQuery);
             LongConnectSender.ReceiveBytes(out query_header, out _);
         }
         catch (Exception ex)
         {
             Log("Long connection exception : " + ex.Message, LogLevel.Warn);
             StartLongConnection();
             continue;
         }
         if (query_header.I1 == 1)
         {
             try
             {
                 SocketResponder responder = new SocketResponder();
                 responder.ConnectWithTimeout(CurrentRoute.NextNode.Address, BuildConnectionTimeout);
                 responder.SetTimeout(DefaultSendTimeout, DefaultReceiveTimeout);
                 if (CurrentRoute.IsNextNodeProxy)
                 {
                     responder.SendBytes(SocketPacketFlag.ReversedProxyConnectionRequest, CurrentRoute.GetBytes(node_start_index: 1), i1: 0);
                     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(responder);
             }
             catch (Exception ex)
             {
                 Log("Reversed server Accept() exception : " + ex.Message, LogLevel.Error);
             }
         }
     }
     return(null);
 }
示例#2
0
        protected override void ReceiveData(object responderObject)
        {
            SocketResponder responder = responderObject as SocketResponder;

            responder.SetTimeout(Config.SocketSendTimeout, Config.SocketReceiveTimeout);
            SocketSender sender = null;

            try
            {
                responder.ReceiveBytes(out HB32Header route_header, out byte[] route_bytes);
                if (route_header.Flag == SocketPacketFlag.ProxyRouteRequest)
                {
                    /// Forward connection proxy (from client-side)
                    sender = ForwardConnectionProxy(responder, route_header, route_bytes);
                    /// Communication proxy
                }
                else if (route_header.Flag == SocketPacketFlag.ReversedProxyConnectionRequest)
                {
                    /// Reversed connection proxy (from server-side, triggered in server by long connection)
                    sender = ReversedConnectionProxy(ref responder, route_header, route_bytes);
                    /// Communication proxy
                }
                else if (route_header.Flag == SocketPacketFlag.ReversedProxyLongConnectionRequest)
                {
                    /// Reversed-server long connection socket
                }
                else
                {
                }
            }
            catch (Exception ex)
            {
                Log("Socket initiate exception :" + ex.Message, LogLevel.Error);
                //DisposeClient(sender, responder); 这行不能删
            }
        }
示例#3
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);
     }
 }
示例#4
0
 private void LongConnectionRespond(SocketResponder responder, HB32Header route_header, byte[] route_bytes)
 {
     /// LongConnection 中继, 或 将Reversed Server 挂载在此
 }
示例#5
0
        public SocketResponder ConvertToResponder()
        {
            SocketResponder responder = new SocketResponder(this.client);

            return(responder);
        }