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); }
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); 这行不能删 } }
/// <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); } }
private void LongConnectionRespond(SocketResponder responder, HB32Header route_header, byte[] route_bytes) { /// LongConnection 中继, 或 将Reversed Server 挂载在此 }
public SocketResponder ConvertToResponder() { SocketResponder responder = new SocketResponder(this.client); return(responder); }