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