PortScanMiddleware.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Logging;
  3. using Microsoft.Extensions.Options;
  4. using System;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace FastGithub.Scanner.Middlewares
  9. {
  10. [Service(ServiceLifetime.Singleton)]
  11. sealed class PortScanMiddleware : IGithubScanMiddleware
  12. {
  13. private const int PORT = 443;
  14. private readonly IOptionsMonitor<GithubOptions> options;
  15. private readonly ILogger<PortScanMiddleware> logger;
  16. public PortScanMiddleware(
  17. IOptionsMonitor<GithubOptions> options,
  18. ILogger<PortScanMiddleware> logger)
  19. {
  20. this.options = options;
  21. this.logger = logger;
  22. }
  23. public async Task InvokeAsync(GithubContext context, Func<Task> next)
  24. {
  25. try
  26. {
  27. using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  28. using var cancellationTokenSource = new CancellationTokenSource(this.options.CurrentValue.PortScanTimeout);
  29. await socket.ConnectAsync(context.Address, PORT, cancellationTokenSource.Token);
  30. await next();
  31. }
  32. catch (Exception)
  33. {
  34. this.logger.LogTrace($"{context.Domain} {context.Address}的{PORT}端口未开放");
  35. }
  36. }
  37. }
  38. }