static void Main(string[] args) { AppLayerProxy.Logger = Console.Out; AppLayerProxy.ErrorLogger = Console.Out; var options = new AppLayerProxyOptions(); var nonOptionArgs = options.Parse(args); if (nonOptionArgs.Count == 0 || options.help.set) { options.PrintUsage(); return; } if (nonOptionArgs.Count > 1) { options.ErrorAndUsage("Expected 1 argument but got {0}", args.Length); return; } if (options.forwardProxy.set) { AppLayerProxy.ForwardProxy = Proxy.ParseProxy(options.forwardProxy.ArgValue, DnsPriority.IPv4ThenIPv6, null); } ListenPort = UInt16.Parse(nonOptionArgs[0]); var listenIP = options.listenIP.ArgValue; SelectServer selectServer = new SelectServer(false, new Buf(8192)); Socket listenSocket = new Socket(listenIP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(new IPEndPoint(listenIP, ListenPort)); listenSocket.Listen(options.backlog.ArgValue); SelectControl selectControl = new SelectControl(true); selectControl.AddListenSocket(listenSocket, AcceptProxyClient); selectServer.Run(); }
static Int32 Main(string[] args) { TunnelOptions optionsParser = new TunnelOptions(); List <String> nonOptionArgs = optionsParser.Parse(args); if (nonOptionArgs.Count <= 0) { Console.WriteLine("Must give at least one listener"); optionsParser.PrintUsage(); return(-1); } SelectControl selectControl = new SelectControl(false); // // Parse listeners // int arg = 0; do { // // Get Command Line Arguments // String connector = nonOptionArgs[arg]; arg++; if (arg >= nonOptionArgs.Count) { Console.WriteLine("EndPoint '{0}' is missing a protocol 'tcp|udp' and a listen port set", connector); optionsParser.PrintUsage(); return(-1); } // // Parse End Point // HostWithOptionalProxy forwardHost = ConnectorParser.ParseConnectorWithPortAndOptionalProxy(connector); // // Parse Protocol and Port Set // String protocolAndPortSet = nonOptionArgs[arg++]; Boolean isTcp; if (protocolAndPortSet.StartsWith("tcp", StringComparison.CurrentCultureIgnoreCase)) { isTcp = true; } else if (protocolAndPortSet.StartsWith("udp", StringComparison.CurrentCultureIgnoreCase)) { isTcp = false; } else { throw new InvalidOperationException(String.Format("Unknown protocol '{0}', expected 'tcp' or 'udp'", (protocolAndPortSet.Length < 3) ? protocolAndPortSet : protocolAndPortSet.Remove(3))); } if (protocolAndPortSet.Length < 4) { Console.WriteLine("ProtocolAndPortSet '{0}' Protocol '{1}' is missing a listen port set", connector, protocolAndPortSet); optionsParser.PrintUsage(); return(-1); } String portSetString = protocolAndPortSet.Substring(3); if (String.IsNullOrEmpty(portSetString)) { Console.WriteLine("EndPoint '{0}' Protocol '{1}' is missing a listen port set", connector, protocolAndPortSet); optionsParser.PrintUsage(); return(-1); } PortSet portSet = ParseUtilities.ParsePortSet(portSetString); if (isTcp) { TcpCallback tcpCallback = new TcpCallback(forwardHost); for (int i = 0; i < portSet.Length; i++) { Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listenSocket.Bind(new IPEndPoint(IPAddress.Any, portSet[i])); listenSocket.Listen(optionsParser.socketBackLog.ArgValue); selectControl.AddListenSocket(listenSocket, tcpCallback.HandleAccept); } } else { if (forwardHost.proxy == null) { IPEndPoint serverEndPoint = forwardHost.directEndPoint.GetOrResolveToIPEndPoint(); DirectUdpCallback udpCallback = new DirectUdpCallback(serverEndPoint, 30 * 60); // 30 minutes for (int i = 0; i < portSet.Length; i++) { Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSocket.Bind(new IPEndPoint(IPAddress.Any, portSet[i])); selectControl.AddReceiveSocket(udpSocket, udpCallback.ReceiveHandler); } } else { throw new NotImplementedException(); /* * UdpThroughProxyCallback udpCallback = new UdpThroughProxyCallback(serverEndPoint, proxyConnector, * 1000 * 60 * 4, 1000 * 60 * 10); * for (int i = 0; i < portSet.Length; i++) * { * udpListenerList.Add(new UdpSelectListener(new IPEndPoint(IPAddress.Any, portSet[i]), udpCallback)); * } */ } } } while (arg < nonOptionArgs.Count); SelectServer selectServer = new SelectServer(selectControl, new Buf(8192)); selectServer.Run(); return(-1); }