StunServer.cs 947 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System.Diagnostics.CodeAnalysis;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. namespace STUN;
  5. public class StunServer
  6. {
  7. public string Hostname { get; }
  8. public ushort Port { get; }
  9. private const ushort DefaultPort = 3478;
  10. public StunServer()
  11. {
  12. Hostname = @"stun.syncthing.net";
  13. Port = DefaultPort;
  14. }
  15. private StunServer(string hostname, ushort port)
  16. {
  17. Hostname = hostname;
  18. Port = port;
  19. }
  20. public static bool TryParse(string s, [NotNullWhen(true)] out StunServer? result)
  21. {
  22. if (!HostnameEndpoint.TryParse(s, out var host, DefaultPort))
  23. {
  24. result = null;
  25. return false;
  26. }
  27. result = new StunServer(host.Hostname, host.Port);
  28. return true;
  29. }
  30. public override string ToString()
  31. {
  32. if (Port is DefaultPort)
  33. {
  34. return Hostname;
  35. }
  36. if (IPAddress.TryParse(Hostname, out var ip) && ip.AddressFamily is AddressFamily.InterNetworkV6)
  37. {
  38. return $@"[{ip}]:{Port}";
  39. }
  40. return $@"{Hostname}:{Port}";
  41. }
  42. }