You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Program.cs 3.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Shadowsocks.Protocol;
  2. using System;
  3. using System.CommandLine;
  4. using System.CommandLine.Invocation;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace Shadowsocks.CLI
  9. {
  10. internal class Program
  11. {
  12. private static Task<int> Main(string[] args)
  13. {
  14. var clientCommand = new Command("client", "Shadowsocks client.");
  15. clientCommand.AddAlias("c");
  16. clientCommand.AddOption(new Option<string?>("--listen", "The address and port to listen on for both SOCKS5 and HTTP proxy."));
  17. clientCommand.AddOption(new Option<string?>("--listen-socks", "The address and port to listen on for SOCKS5 proxy."));
  18. clientCommand.AddOption(new Option<string?>("--listen-http", "The address and port to listen on for HTTP proxy."));
  19. clientCommand.AddOption(new Option<string>("--server-address", "Address of the remote Shadowsocks server to connect to."));
  20. clientCommand.AddOption(new Option<int>("--server-port", "Port of the remote Shadowsocks server to connect to."));
  21. clientCommand.AddOption(new Option<string>("--method", "Encryption method to use for the remote Shadowsocks server."));
  22. clientCommand.AddOption(new Option<string?>("--password", "Password to use for the remote Shadowsocks server."));
  23. clientCommand.AddOption(new Option<string?>("--key", "Encryption key (NOT password!) to use for the remote Shadowsocks server."));
  24. clientCommand.AddOption(new Option<string?>("--plugin", "Plugin binary path."));
  25. clientCommand.AddOption(new Option<string?>("--plugin-opts", "Plugin options."));
  26. clientCommand.AddOption(new Option<string?>("--plugin-args", "Plugin startup arguments."));
  27. clientCommand.Handler = CommandHandler.Create(
  28. async (string? listen, string? listenSocks, string? listenHttp, string serverAddress, int serverPort, string method, string? password, string? key, string? plugin, string? pluginOpts, string? pluginArgs) =>
  29. {
  30. // TODO
  31. var localEP = IPEndPoint.Parse(listenSocks);
  32. var remoteEp = new DnsEndPoint(serverAddress, serverPort);
  33. byte[]? mainKey = null;
  34. if (!string.IsNullOrEmpty(key))
  35. mainKey = Encoding.UTF8.GetBytes(key);
  36. var tcpPipeListener = new TcpPipeListener(localEP);
  37. tcpPipeListener.Start(localEP, remoteEp, method, password, mainKey).Wait();
  38. });
  39. var serverCommand = new Command("server", "Shadowsocks server.");
  40. serverCommand.AddAlias("s");
  41. serverCommand.Handler = CommandHandler.Create(
  42. () =>
  43. {
  44. Console.WriteLine("Not implemented.");
  45. });
  46. var utilitiesCommand = new Command("utilities", "Shadowsocks-related utilities.");
  47. utilitiesCommand.AddAlias("u");
  48. utilitiesCommand.AddAlias("util");
  49. utilitiesCommand.AddAlias("utils");
  50. var rootCommand = new RootCommand("CLI for Shadowsocks server and client implementation in C#.")
  51. {
  52. clientCommand,
  53. serverCommand,
  54. utilitiesCommand,
  55. };
  56. Console.OutputEncoding = Encoding.UTF8;
  57. return rootCommand.InvokeAsync(args);
  58. }
  59. }
  60. }