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.

Socks5UdpMessage.cs 1.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. namespace Shadowsocks.Protocol.Socks5
  5. {
  6. public class Socks5UdpMessage : Socks5Message
  7. {
  8. public byte Fragment;
  9. public EndPoint EndPoint = new IPEndPoint(IPAddress.Any, 0);
  10. public override int Serialize(Memory<byte> buffer)
  11. {
  12. var addrLen = NeededBytes(EndPoint);
  13. if (buffer.Length < addrLen + 3) throw Util.BufferTooSmall(addrLen + 3, buffer.Length, nameof(buffer));
  14. buffer.Span[0] = 0;
  15. buffer.Span[1] = 0;
  16. buffer.Span[2] = Fragment;
  17. return SerializeAddress(buffer[3..], EndPoint) + 3;
  18. }
  19. public override (bool success, int length) TryLoad(ReadOnlyMemory<byte> buffer)
  20. {
  21. if (buffer.Length < 4) return (false, 4);
  22. if (buffer.Span[0] != 0 || buffer.Span[1] != 0) return (false, 0);
  23. if (buffer.Span[3] == 3 && buffer.Length < 5) return (false, 5);
  24. var req = buffer.Span[3] switch
  25. {
  26. AddressIPv4 => 10,
  27. AddressDomain => buffer.Span[4] + 7,
  28. AddressIPv6 => 22,
  29. _ => 0,
  30. };
  31. if (req == 0) return (false, 0);
  32. if (buffer.Length < req) return (false, req);
  33. (var state, var len) = TryParseAddress(buffer[3..], out var ep);
  34. Debug.Assert(state);
  35. Debug.Assert(len == req - 3);
  36. Fragment = buffer.Span[2];
  37. EndPoint = ep;
  38. return (true, req);
  39. }
  40. public override bool Equals(IProtocolMessage other)
  41. {
  42. if (other is null) return false;
  43. if (ReferenceEquals(this, other)) return true;
  44. if (other.GetType() != GetType()) return false;
  45. var msg = (Socks5UdpMessage) other;
  46. return Fragment == msg.Fragment && Equals(EndPoint, msg.EndPoint);
  47. }
  48. }
  49. }