Пример #1
0
        /// <summary>
        /// 处理查询
        /// </summary>
        /// <param name="Query"></param>
        private void ProcessQuery(Byte[] Query)
        {
            try
            {
                switch (Query[1])
                {
                case 1:     //CONNECT
                    IPAddress RemoteIP   = null;
                    int       RemotePort = 0;
                    if (Query[3] == 1)
                    {
                        RemoteIP   = IPAddress.Parse(Query[4].ToString() + "." + Query[5].ToString() + "." + Query[6].ToString() + "." + Query[7].ToString());
                        RemotePort = Query[8] * 256 + Query[9];
                    }
                    else if (Query[3] == 3)
                    {
                        RemoteIP   = Dns.Resolve(Encoding.ASCII.GetString(Query, 5, Query[4])).AddressList[0];
                        RemotePort = Query[4] + 5;
                        RemotePort = Query[RemotePort] * 256 + Query[RemotePort + 1];
                    }
                    _RemoteConnection = new Socket(RemoteIP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    _RemoteConnection.BeginConnect(new IPEndPoint(RemoteIP, RemotePort), new AsyncCallback(this.OnConnected), _RemoteConnection);    //0
                    break;

                case 2:     //BIND
                    byte[] Reply   = new byte[10];
                    long   LocalIP = Socks5Listener.GetLocalExternalIP().Address;
                    _AcceptSocket = new Socket(IPAddress.Any.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    _AcceptSocket.Bind(new IPEndPoint(IPAddress.Any, 0));
                    _AcceptSocket.Listen(50);
                    Reply[0] = 5;                                                                                                        //Version 5
                    Reply[1] = 0;                                                                                                        //Everything is ok :)
                    Reply[2] = 0;                                                                                                        //Reserved
                    Reply[3] = 1;                                                                                                        //We're going to send a IPv4 address
                    Reply[4] = (byte)(Math.Floor((LocalIP % 256d)));                                                                     //IP Address/1
                    Reply[5] = (byte)(Math.Floor((LocalIP % 65536d) / 256));                                                             //IP Address/2
                    Reply[6] = (byte)(Math.Floor((LocalIP % 16777216d) / 65536));                                                        //IP Address/3
                    Reply[7] = (byte)(Math.Floor(LocalIP / 16777216d));                                                                  //IP Address/4
                    Reply[8] = (byte)(Math.Floor(((IPEndPoint)_AcceptSocket.LocalEndPoint).Port / 256d));                                //Port/1
                    Reply[9] = (byte)(((IPEndPoint)_AcceptSocket.LocalEndPoint).Port % 256d);                                            //Port/2
                    _Connection.BeginSend(Reply, 0, Reply.Length, SocketFlags.None, new AsyncCallback(this.OnStartAccept), _Connection); //0
                    break;

                case 3:     //ASSOCIATE
                            //ASSOCIATE is not implemented (yet?)
                    Dispose(7);
                    break;

                default:
                    Dispose(7);
                    break;
                }
            }
            catch (Exception ex) { Log.AddLog("Socks5Handler在处理查询时出错|" + ex.Message); Dispose(1); }
        }
Пример #2
0
        internal ProgramMain()
        {
            mutex = new Mutex(true, System.Diagnostics.Process.GetCurrentProcess().MachineName, out bool isRun);
            Log   = new LogMain(AppDomain.CurrentDomain.BaseDirectory + "//Log");
            Console.BackgroundColor = ConsoleColor.Black;
            Console.ForegroundColor = ConsoleColor.Green;

            var cmd = String.Empty;

            if (isRun)
            {
                Console.WriteLine(DateTime.Now + "\r\n请注意,监听IP地址务必为内网IP,不可为127.0.0.1/0.0.0.0,否则会导致程序不工作!");
                Console.Write(">");
                cmd = Console.ReadLine();
                while (!cmd.Equals("2333"))
                {
                    switch (cmd)
                    {
                    case "0":
                        Console.Clear();
                        break;

                    case "1":
                        Console.Write("请输入监听地址:");
                        var a = Console.ReadLine();
                        Console.Write("请输入监听端口:");
                        var b = Console.ReadLine();
                        Console.Write("请输入最大用户数:");
                        var c = Console.ReadLine();
                        Listener = new Socks5Listener(a, Convert.ToInt32(b), Convert.ToInt32(c), ref Log);
                        Listener.StartListener();
                        Console.Clear();
                        Console.WriteLine("时间:" + DateTime.Now + "\r\n已启动Socks5代理服务器!");
                        break;

                    case "2":
                        Console.WriteLine("正在重启代理服务器,请稍后...");
                        if (Listener != null)
                        {
                            Listener.Restart();
                        }
                        else
                        {
                            Console.WriteLine("Socks5代理服务器未开启,无法完成重启操作!");
                        }
                        Console.WriteLine("代理服务器重启完成!");
                        break;

                    case "3":
                        Console.WriteLine("正在关闭代理服务器,请稍后...");
                        if (Listener != null)
                        {
                            Listener.Stop();
                        }
                        else
                        {
                            Console.WriteLine("Socks5代理服务器未开启,无法完成关闭操作!");
                        }
                        Console.WriteLine("代理服务器已关闭!");
                        break;

                    case "4":
                        Console.Write("请输入监听地址:");
                        var d = Console.ReadLine();
                        Console.Write("请输入监听端口:");
                        var e = Console.ReadLine();
                        Console.Write("请输入最大用户数:");
                        var f = Console.ReadLine();
                        if (Listener == null)
                        {
                            Listener = new Socks5Listener(d, Convert.ToInt32(e), Convert.ToInt32(f), ref Log);
                        }
                        else
                        {
                            Listener.Stop();
                            Listener.Dispose();
                            Listener = new Socks5Listener(d, Convert.ToInt32(e), Convert.ToInt32(f), ref Log);
                            Listener.StartListener();
                            Console.WriteLine("设置更改完成.");
                        }
                        break;

                    case "?":
                        Console.WriteLine("输入?查看命令帮助\r\n输入0清空控制台\r\n输入1开启Socks5代理服务器\r\n输入2重启代理服务器\r\n输入3关闭代理服务器\r\n输入4关闭代理服务器\r\n输入4更改代理服务器设置\r\n输入2333关闭程序");
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("请注意,更改代理服务器设置会导致服务器重启!");
                        Console.ForegroundColor = ConsoleColor.Green;
                        break;

                    default:
                        Console.WriteLine("命令错误!\r\n请输入?查看帮助.");
                        break;
                    }
                    Console.Write(">");
                    cmd = Console.ReadLine();
                }
            }

            Log.SaveLog();
            Console.WriteLine("日志保存完成!\r\n请按任意键退出...");
            Console.Read();
        }