2
0

UdpLogListBox.xaml.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.ObjectModel;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Controls;
  9. namespace FastGithub.UI
  10. {
  11. /// <summary>
  12. /// UdpLogListBox.xaml 的交互逻辑
  13. /// </summary>
  14. public partial class UdpLogListBox : UserControl
  15. {
  16. private readonly byte[] buffer = new byte[ushort.MaxValue];
  17. private readonly Socket socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
  18. public ObservableCollection<UdpLog> LogList { get; } = new ObservableCollection<UdpLog>();
  19. public UdpLogListBox()
  20. {
  21. InitializeComponent();
  22. this.DataContext = this;
  23. this.InitUdpLoggerAsync();
  24. }
  25. private async void InitUdpLoggerAsync()
  26. {
  27. this.socket.Bind(new IPEndPoint(IPAddress.Loopback, UdpLoggerPort.Value));
  28. while (this.Dispatcher.HasShutdownStarted == false)
  29. {
  30. var log = await this.GetUdpLogAsync();
  31. if (log != null)
  32. {
  33. this.LogList.Add(log);
  34. }
  35. }
  36. }
  37. private async Task<UdpLog?> GetUdpLogAsync()
  38. {
  39. EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
  40. var taskCompletionSource = new TaskCompletionSource<int>();
  41. this.socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, this.EndReceiveFrom, taskCompletionSource);
  42. var length = await taskCompletionSource.Task;
  43. var json = Encoding.UTF8.GetString(buffer, 0, length);
  44. return JsonConvert.DeserializeObject<UdpLog>(json);
  45. }
  46. private void EndReceiveFrom(IAsyncResult ar)
  47. {
  48. EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
  49. var length = this.socket.EndReceiveFrom(ar, ref remoteEP);
  50. var taskCompletionSource = (TaskCompletionSource<int>)ar.AsyncState;
  51. taskCompletionSource.TrySetResult(length);
  52. }
  53. private void MenuItem_Copy_Click(object sender, System.Windows.RoutedEventArgs e)
  54. {
  55. if (this.listBox.SelectedValue is UdpLog udpLog)
  56. {
  57. udpLog.SetToClipboard();
  58. }
  59. }
  60. private void MenuItem_Clear_Click(object sender, System.Windows.RoutedEventArgs e)
  61. {
  62. this.LogList.Clear();
  63. }
  64. }
  65. }