using System; using System.Collections.ObjectModel; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; namespace FastGithub.UI { /// /// UdpLogListBox.xaml 的交互逻辑 /// public partial class UdpLogListBox : UserControl { private readonly byte[] buffer = new byte[ushort.MaxValue]; private readonly Socket socket = new Socket(SocketType.Dgram, ProtocolType.Udp); public ObservableCollection LogList { get; } = new ObservableCollection(); public UdpLogListBox() { InitializeComponent(); DataContext = this; this.InitUdpLoggerAsync(); } private async void InitUdpLoggerAsync() { this.socket.Bind(new IPEndPoint(IPAddress.Loopback, UdpLoggerPort.Value)); while (true) { var log = await this.GetUdpLogAsync(); this.LogList.Add(log); } } private async Task GetUdpLogAsync() { EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); var taskCompletionSource = new TaskCompletionSource(); this.socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP, this.EndReceiveFrom, taskCompletionSource); var length = await taskCompletionSource.Task; var json = Encoding.UTF8.GetString(buffer, 0, length); return Newtonsoft.Json.JsonConvert.DeserializeObject(json); } private void EndReceiveFrom(IAsyncResult ar) { EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); var length = this.socket.EndReceiveFrom(ar, ref remoteEP); var taskCompletionSource = (TaskCompletionSource)ar.AsyncState; taskCompletionSource.TrySetResult(length); } private void MenuItem_Copy_Click(object sender, System.Windows.RoutedEventArgs e) { if (this.listBox.SelectedValue is UdpLog udpLog) { udpLog.SetToClipboard(); } } private void MenuItem_Clear_Click(object sender, System.Windows.RoutedEventArgs e) { this.LogList.Clear(); } } }