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