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.

ShadowsocksClient.cs 1.3 kB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using Shadowsocks.Protocol.Shadowsocks.Crypto;
  2. using System.IO.Pipelines;
  3. using System.Net;
  4. using System.Threading.Tasks;
  5. namespace Shadowsocks.Protocol.Shadowsocks
  6. {
  7. internal class ShadowsocksClient : IStreamClient
  8. {
  9. private readonly IStreamClient shadow;
  10. private readonly PayloadProtocolClient socks = new PayloadProtocolClient();
  11. private readonly PipePair p = new PipePair();
  12. public ShadowsocksClient(string method, string password)
  13. {
  14. var param = CryptoProvider.GetCrypto(method);
  15. if (param.IsAead)
  16. {
  17. shadow = new AeadClient(param, password);
  18. }
  19. else
  20. {
  21. shadow = new UnsafeClient(param, password);
  22. }
  23. }
  24. public ShadowsocksClient(string method, byte[] key)
  25. {
  26. var param = CryptoProvider.GetCrypto(method);
  27. shadow = new AeadClient(param, key);
  28. }
  29. public Task Connect(EndPoint destination, IDuplexPipe client, IDuplexPipe server)
  30. {
  31. var tShadow = shadow.Connect(null, p.UpSide, server);
  32. var tSocks = socks.Connect(destination, client, p.UpSide);
  33. return Task.WhenAll(tShadow, tSocks);
  34. }
  35. }
  36. }