DnsOverUdpHostedService.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Microsoft.Extensions.Hosting;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace FastGithub.Dns
  10. {
  11. /// <summary>
  12. /// dns后台服务
  13. /// </summary>
  14. sealed class DnsOverUdpHostedService : BackgroundService
  15. {
  16. private readonly DnsOverUdpServer dnsOverUdpServer;
  17. private readonly IEnumerable<IConflictValidator> conflictValidators;
  18. private readonly ILogger<DnsOverUdpHostedService> logger;
  19. /// <summary>
  20. /// dns后台服务
  21. /// </summary>
  22. /// <param name="dnsOverUdpServer"></param>
  23. /// <param name="conflictValidators"></param>
  24. /// <param name="logger"></param>
  25. public DnsOverUdpHostedService(
  26. DnsOverUdpServer dnsOverUdpServer,
  27. IEnumerable<IConflictValidator> conflictValidators,
  28. ILogger<DnsOverUdpHostedService> logger)
  29. {
  30. this.dnsOverUdpServer = dnsOverUdpServer;
  31. this.conflictValidators = conflictValidators;
  32. this.logger = logger;
  33. }
  34. /// <summary>
  35. /// 启动dns
  36. /// </summary>
  37. /// <param name="cancellationToken"></param>
  38. /// <returns></returns>
  39. public override async Task StartAsync(CancellationToken cancellationToken)
  40. {
  41. try
  42. {
  43. const int DNS_PORT = 53;
  44. this.dnsOverUdpServer.Listen(IPAddress.Any, DNS_PORT);
  45. this.logger.LogInformation($"已监听udp端口{DNS_PORT},DNS服务启动完成");
  46. }
  47. catch (Exception ex)
  48. {
  49. var builder = new StringBuilder().AppendLine($"DNS服务启动失败({ex.Message}),你可以选择如下的一种操作:");
  50. builder.AppendLine($"1. 关闭占用udp53端口的进程然后重新打开本程序");
  51. builder.AppendLine($"2. 配置系统或浏览器使用DNS over HTTPS:https://127.0.0.1/dns-query");
  52. builder.AppendLine($"3. 向系统hosts文件添加github相关域名的ip为127.0.0.1");
  53. builder.Append($"4. 在局域网其它设备上运行本程序,然后将本机DNS设置为局域网设备的IP");
  54. this.logger.LogError(builder.ToString());
  55. }
  56. foreach (var item in this.conflictValidators)
  57. {
  58. await item.ValidateAsync();
  59. }
  60. await base.StartAsync(cancellationToken);
  61. }
  62. /// <summary>
  63. /// dns后台
  64. /// </summary>
  65. /// <param name="stoppingToken"></param>
  66. /// <returns></returns>
  67. protected override Task ExecuteAsync(CancellationToken stoppingToken)
  68. {
  69. return this.dnsOverUdpServer.HandleAsync(stoppingToken);
  70. }
  71. /// <summary>
  72. /// 停止dns服务
  73. /// </summary>
  74. /// <param name="cancellationToken"></param>
  75. /// <returns></returns>
  76. public override Task StopAsync(CancellationToken cancellationToken)
  77. {
  78. this.dnsOverUdpServer.Dispose();
  79. return base.StopAsync(cancellationToken);
  80. }
  81. }
  82. }