当前位置:   article > 正文

powershell 雅地关闭UDP监听器

powershell 雅地关闭UDP监听器

在PowerShell中优雅地关闭UDP监听器意味着你需要一种机制来安全地停止正在运行的UdpClient实例。由于UdpClient类本身没有提供直接的停止或关闭方法,你需要通过其他方式来实现这一点。通常,这涉及到在监听循环中添加一个检查点,以便在接收到停止信号时能够退出循环。

下面是一个PowerShell脚本示例,它展示了如何创建一个可以优雅关闭的UDP监听器:

 
  1. # 导入必要的命名空间
  2. Add-Type -TypeDefinition @"
  3. using System;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. public class UdpListener
  8. {
  9. private UdpClient listener;
  10. private IPEndPoint localEndPoint;
  11. private CancellationTokenSource cts;
  12. public UdpListener(int port)
  13. {
  14. listener = new UdpClient(port);
  15. localEndPoint = new IPEndPoint(IPAddress.Any, port);
  16. cts = new CancellationTokenSource();
  17. }
  18. public void Start()
  19. {
  20. // 使用CancellationToken来安全地停止监听循环
  21. Task.Run(() => ListenAsync(cts.Token));
  22. }
  23. public void Stop()
  24. {
  25. // 请求取消监听任务
  26. cts.Cancel();
  27. }
  28. private async Task ListenAsync(CancellationToken token)
  29. {
  30. try
  31. {
  32. while (!token.IsCancellationRequested)
  33. {
  34. // 阻塞直到接收到数据或取消操作
  35. byte[] receivedBytes = await listener.ReceiveAsync().ConfigureAwait(false);
  36. IPEndPoint remoteEndPoint = (IPEndPoint)listener.Client.RemoteEndPoint;
  37. // 处理接收到的数据
  38. Console.WriteLine($"Received data from {remoteEndPoint}: {Encoding.ASCII.GetString(receivedBytes)}");
  39. }
  40. }
  41. catch (OperationCanceledException)
  42. {
  43. // 监听被取消,正常退出
  44. Console.WriteLine("UDP listener stopped gracefully.");
  45. }
  46. catch (Exception ex)
  47. {
  48. // 处理其他异常
  49. Console.WriteLine($"An error occurred: {ex.Message}");
  50. }
  51. finally
  52. {
  53. // 关闭UdpClient并释放资源
  54. listener.Close();
  55. listener.Dispose();
  56. }
  57. }
  58. }
  59. "@ -ReferencedAssemblies System.Net.Sockets, System.Threading.Tasks
  60. # 创建UDP监听器实例
  61. $udpListener = New-Object UdpListener -ArgumentList 11000
  62. # 开始监听
  63. $udpListener.Start()
  64. # 模拟一些工作,比如等待用户输入
  65. Console.WriteLine("Press Enter to stop the UDP listener...")
  66. $null = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  67. # 停止监听器
  68. $udpListener.Stop()

在这个脚本中,我们创建了一个UdpListener类,它使用CancellationTokenSource来管理监听循环的生命周期。Start方法启动一个异步任务来执行监听操作,而Stop方法通过调用CancellationTokenSource.Cancel来请求停止监听。

监听循环在ListenAsync方法中实现,它使用CancellationToken来检查是否需要停止。如果收到取消请求,监听循环将退出,并在finally块中关闭和释放UdpClient资源。

在脚本的最后部分,我们模拟了开始监听、等待用户输入(通过按Enter键),然后停止监听的过程。当你按下Enter键时,监听器会优雅地关闭,并输出一条消息来确认这一点。

请注意,这个脚本是一个简单的示例,用于演示如何优雅地关闭UDP监听器。在实际应用中,你可能需要添加额外的错误处理和资源管理逻辑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/88438
推荐阅读
相关标签
  

闽ICP备14008679号