Program.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Dns.Net.Clients;
  2. using STUN;
  3. using STUN.Client;
  4. using System;
  5. using System.Net;
  6. using System.Threading;
  7. //stun.qq.com:3478 0.0.0.0:0
  8. var server = @"stun.syncthing.net";
  9. ushort port = 3478;
  10. var local = new IPEndPoint(IPAddress.Any, 0);
  11. if (args.Length > 0 && StunServer.TryParse(args[0], out var stun))
  12. {
  13. server = stun.Hostname;
  14. port = stun.Port;
  15. }
  16. if (args.Length > 1)
  17. {
  18. if (IPEndPoint.TryParse(args[2], out var ipEndPoint))
  19. {
  20. local = ipEndPoint;
  21. }
  22. }
  23. var dnsClient = new DefaultDnsClient();
  24. var ip = await dnsClient.QueryAsync(server);
  25. using var client = new StunClient5389UDP(new IPEndPoint(ip, port), local);
  26. using var cts = new CancellationTokenSource();
  27. cts.CancelAfter(TimeSpan.FromSeconds(5));
  28. await client.QueryAsync(cts.Token);
  29. var res = client.State;
  30. Console.WriteLine($@"Other address is {res.OtherEndPoint}");
  31. Console.WriteLine($@"Binding test: {res.BindingTestResult}");
  32. Console.WriteLine($@"Local address: {res.LocalEndPoint}");
  33. Console.WriteLine($@"Mapped address: {res.PublicEndPoint}");
  34. Console.WriteLine($@"Nat mapping behavior: {res.MappingBehavior}");
  35. Console.WriteLine($@"Nat filtering behavior: {res.FilteringBehavior}");