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);
 }